与gdscript的API差异

这是C# 和GDScript之间的API差异(不完整)列表。

一般性差异

如中所述 介绍 ,C# 一般使用 PascalCase 而不是 snake_case 在GDScript和C++中使用。

全球范围

全局函数和一些常量必须移到类中,因为C# 不允许在命名空间中声明它们。大多数全局常量被移到它们自己的枚举中。

常量

全局常量被移到它们自己的枚举中。例如, ERR_* 常量被移动到 Error 枚举。

特殊情况:

GDScript

C#

SPKEY

GD.SpKey

TYPE_*

Variant.Type 枚举

OP_*

Variant.Operator 枚举

数学函数

数学全局函数,比如 absacosasinatanatan2 ,位于 Mathf 作为 AbsAcosAsinAtanAtan2 . 这个 PI 常数可以找到为 Mathf.Pi .

随机函数

随机全局函数,比如 rand_rangerand_seed ,位于 GD .例子: GD.RandRangeGD.RandSeed .

其他功能

许多其他的全局函数,如 printvar2str 位于 GD .例子: GD.PrintGD.Var2Str .

例外情况:

GDScript

C#

weakref(obj)

Object.WeakRef(obj)

is_instance_valid(obj)

Object.IsInstanceValid(obj)

提示

有时使用 using static 指令。此指令允许在不指定类名的情况下访问类的成员和嵌套类型。

例子:

using static Godot.GD;

public class Test
{
    static Test()
    {
        Print("Hello"); // Instead of GD.Print("Hello");
    }
}

导出关键字

使用 [Export] 属性而不是gdscript export 关键字。

例子:

using Godot;

public class MyNode : Node
{
    [Export]
    NodePath _nodePath;
}

信号关键字

使用 [Signal] 属性来声明信号而不是gdscript signal 关键字。此属性应用于 delegate ,其名称签名将用于定义信号。

[Signal]
delegate void MySignal(string willSendsAString);

参见: C# 信号

单件

singleton作为静态类而不是使用singleton模式。这将使代码比使用 Instance 财产。

例子:

Input.IsActionPressed("ui_down")

然而,在一些非常罕见的情况下,这是不够的。例如,您可能希望从基类访问成员 Godot.Object ,像 Connect . 对于这种用例,我们提供一个名为 Singleton 返回单例实例。此实例的类型为 Godot.Object .

例子:

Input.Singleton.Connect("joy_connection_changed", this, nameof(Input_JoyConnectionChanged));

Use System.String (string). Most of Godot's String methods are provided by the StringExtensions class as extension methods.

例子:

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``:另外还提供了一个方法 MatchMatchn ,允许您显式指定区分大小写:

str.Match("*.txt"); // Case sensitive
str.ExprMatch("*.txt", true); // Case sensitive
str.Matchn("*.txt"); // Case insensitive
str.ExprMatch("*.txt", false); // Case insensitive

基础

结构在C# 中不能有无参数构造函数。因此, new Basis() 将所有基元成员初始化为其默认值。使用 Basis.Identity 相当于 Basis() 在GDScript和C++中。

以下方法已转换为具有不同名称的属性:

GDScript

C#

get_scale()

Scale

变压器2D

结构在C# 中不能有无参数构造函数。因此, new Transform2D() 将所有基元成员初始化为其默认值。请使用 Transform2D.Identity 相当于 Transform2D() 在GDScript和C++中。

以下方法已转换为属性,并更改了各自的名称:

GDScript

C#

get_rotation()

Rotation

get_scale()

Scale

平面

以下方法已转换为具有 轻微地 不同的名称:

GDScript

C#

center()

Center

矩形2

以下字段已转换为具有 轻微地 不同的名称:

GDScript

C#

end

End

以下方法已转换为具有不同名称的属性:

GDScript

C#

get_area()

Area

夸脱

结构在C# 中不能有无参数构造函数。因此, new Quat() 将所有基元成员初始化为其默认值。请使用 Quat.Identity 相当于 Quat() 在GDScript和C++中。

以下方法已转换为具有不同名称的属性:

GDScript

C#

length()

Length

length_squared()

LengthSquared

数组

这是暂时的。Poolarrays需要他们自己的类型才能按预期使用。

GDScript

C#

Array

Godot.Collections.Array

PoolIntArray

int[]

PoolByteArray

byte[]

PoolFloatArray

float[]

PoolStringArray

String[]

PoolColorArray

Color[]

PoolVector2Array

Vector2[]

PoolVector3Array

Vector3[]

Godot.Collections.Array<T> 是否是类型安全包装 Godot.Collections.Array . 使用 Godot.Collections.Array<T>(Godot.Collections.Array) 构造函数创建一个。

词典

使用 Godot.Collections.Dictionary .

Godot.Collections.Dictionary<T> 是否是类型安全包装 Godot.Collections.Dictionary . 使用 Godot.Collections.Dictionary<T>(Godot.Collections.Dictionary) 构造函数创建一个。

变体

System.Object (object) is used instead of Variant.

与其他脚本语言通信

方法 object Object.Call(string method, params object[] args)object Object.Get(string field)object Object.Set(string field, object value) 通过变量API与其他脚本语言的实例进行通信。

类似于GDScript的 yield 用C# 可获得单个参数。 yield keyword .

异步/等待和 Godot.Object.ToSignal .

例子:

await ToSignal(timer, "timeout");
GD.Print("After timeout");

其他差异

preload 在gdscript中工作时,在C# 中不可用。使用 GD.LoadResourceLoader.Load 相反。

其他差异:

GDScript

C#

Color8

Color.Color8

is_inf

float.IsInfinity

is_nan

float.IsNaN

dict2inst

TODO

inst2dict

TODO