December 25, 2018

Написание скриптов на C# в Godot. Отличия API C# от GDScript

Это (неполный) список различий API между C# и GDScript.

Основные различия

Как объясняется во введении, C# обычно использует PascalCase вместо snake_case, который используется в GDScript и C++.

Global scope

Доступен под Godot.GD. Некоторые вещи были перемещены в их собственные классы, такие как Math и Random. См. ниже.

Глобальные функции, такие как print, var2str и weakref, расположены под GD в C#.

ERR_* константы были перемещены в Godot.Error.

Math

Математические функции, такие как abs, acos, asin, atan и atan2, расположены под Mathf как Abs, Acos, Asin, Atan и Atan2, а не в global scope. PI это Mathf.Pi

Random

Функции случайности, такие как rand_range и rand_seed, расположены в Random, поэтому используйте Random.RandRange вместо rand_range.

Ключевое слово Export

Используйте атрибут [Export] вместо ключевого слова export в GDScript.

Ключевое слово Signal

Используйте атрибут [Signal] вместо ключевого слова signal в GDScript. Этот атрибут должен использоваться для делегата, чья подпись имени будет использоваться для определения сигнала.

[Signal]
delegate void MySignal(string willSendsAString);

См. также: C# signals

Singletons

Используйте System.String (string). Все методы Godot String предоставляются классом StringExtensions как методы расширения. Пример:

string upper = "I LIKE SALAD FORKS";
string lower = upper.ToLower();

Однако есть несколько отличий:

  • erase: Строки неизменны в C#, поэтому мы не можем изменить строку, переданную методу расширения. По этой причине Erase был добавлен в качестве метода расширения StringBuilder вместо строки. В качестве альтернативы вы можете использовать string.Remove.
  • IsSubsequenceOf/IsSubsequenceOfi: предоставляется дополнительный метод, который представляет собой перегрузку IsSubsequenceOf, позволяющую вам явно указать чувствительность к регистру:
str.IsSubsequenceOf("ok"); // Case sensitive
str.IsSubsequenceOf("ok", true); // Case sensitive
str.IsSubsequenceOfi("ok"); // Case insensitive
str.IsSubsequenceOf("ok", false); // Case insensitive
  • Match/Matchn/ExprMatch: помимо Match и Matchn предоставляется дополнительный метод, который позволяет явно указать чувствительность к регистру:
str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

Basis

Структуры не могут иметь конструкторов без параметров в C#. Следовательно, new Basis() инициализирует все примитивные элементы к их значению по умолчанию. Используйте Basis.Identity для эквивалента Basis() из GDScript и C++.

Следующий метод был преобразован в свойство с другим именем:

Transform2D

Структуры не могут иметь конструкторов без параметров в C#. Таким образом, new Transform2D() инициализирует все примитивные элементы к их значению по умолчанию. Пожалуйста, используйте Transform2D.Identity для эквивалента Transform2D() из GDScript и C++.

Следующие методы были преобразованы в свойства с соответствующими именами:

Plane

Следующий метод был преобразован в свойство с немного другим именем:

Rect2

Следующее поле было преобразовано в свойство с немного другим именем:

Следующий метод был преобразован в свойство с другим именем:

Quat

Структуры не могут иметь конструкторов без параметров в C#. Таким образом, new Quat() инициализирует все примитивные элементы к их значению по умолчанию. Пожалуйста, используйте Quat.Identity для эквивалента Quat() из GDScript и C++.

Массивы (Array)

Это временно. Массив пересчитан, так что ему нужен собственный тип, который переносит нативную сторону. PoolArrays также понадобится использовать их собственный тип так, как они предназначены.

В некоторых исключениях необязательный массив (type[]) может потребоваться вместо List.

Словарь (Dictionary)

Это временно. Массив пересчитан, так что ему нужен собственный тип, который переносит нативную сторону.

Используйте Dictionary<object, object>.

Общение с другими ЯП скриптов

Методы object Object.call(string method, params object[] args), object Object.get(string field) и object Object.set(string field, object value) предоставляются для взаимодействия с экземплярами других ЯП через Variant API.

Другие отличия

preload, assert и yield, также как они работают в GDScript, в настоящее время недоступны в C#.

Другие отличия:


Оригинал

Помочь в переводе официальной документации