C# API 与 GDScript 的差异
这是C#和GDScript之间API差异的(不完整)列表.
一般差异
如 C# 基础 中所述,C#通常使用 PascalCase
而不是GDScript和C++中使用的 snake_case
.
全局作用域
全局函数和某些常量必须移动到类中, 因为C#不允许在命名空间中声明它们. 大多数全局常量都被移动到它们自己的枚举中.
常量
全局常量被移动到它们自己的枚举中. 例如, ERR_*
常量被移动到 Error
枚举中.
特殊情况:
GDScript | C# |
---|---|
|
|
|
|
|
|
数学函数
如 abs
, acos
, asin
, atan
和 atan2
这样的全局数学函数位于 Mathf
下, 名为 Abs
, Acos
, Asin
, Atan
和 Atan2
. 常数 PI
可以通过 Mathf.Pi
获得.
随机函数
如 rand_range
和 rand_seed
等全局随机函数位于 GD
下. 例如 GD.RandRange
以及 GD.RandSeed
.
其他函数
许多其他的全局函数, 如 print
和 var2str
位于C#中的 GD
下. 例如:GD.Print
和 GD.Var2Str
.
例外情况:
GDScript | C# |
---|---|
|
|
|
|
提示
有时候, 使用 using static
指令是很有用的. 该指令允许在不指定类名的情况下, 访问类的成员和嵌套类型.
示例:
using static Godot.GD;
public class Test
{
static Test()
{
Print("Hello"); // Instead of GD.Print("Hello");
}
}
导出关键字
使用 [Export]
特性替代GDScript的 export
关键字. 该特性还可以接受 PropertyHint 和 hintString
参数. 默认可以设为任何值.
示例:
using Godot;
public class MyNode : Node
{
[Export]
private NodePath _nodePath;
[Export]
private string _name = "default";
[Export(PropertyHint.Range, "0,100000,1000,or_greater")]
private int _income;
[Export(PropertyHint.File, "*.png,*.jpg")]
private string _icon;
}
信号关键字
使用 [Signal]
特性代替GDScript中的 signal
关键字. 该特性应该用在 delegate
上, 其名称签名将用于定义信号.
[Signal]
delegate void MySignal(string willSendsAString);
另见: C# 信号 .
Onready 关键字
GDScript能够推迟成员变量的初始化, 直到用 onready 调用ready函数(参见 Onready 关键字 ). 例如:
onready var my_label = get_node("MyLabel")
然而C#没有这个能力. 为了达到同样的效果, 你需要这样做.
private Label _myLabel;
public override void _Ready()
{
_myLabel = GetNode<Label>("MyLabel");
}
单例
单例可以作为静态类使用, 而不是使用单例模式. 这是为了使代码不像使用 Instance
属性那样冗长.
示例:
Input.IsActionPressed("ui_down")
但是, 在极少数情况下, 这还不够. 例如, 您可能希望访问基类 Godot.Object
中的成员, 比如 Connect
. 对于此类情况, 我们提供了一个名为 Singleton
的静态属性, 该属性返回单例实例. 这个实例的类型是 Godot.Object
.
示例:
Input.Singleton.Connect("joy_connection_changed", this, nameof(Input_JoyConnectionChanged));
字符串
使用 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
, 相当于GDScript和C++中的 Basis()
.
以下方法已转换为具有不同名称的属性:
GDScript | C# |
---|---|
|
|
Transform2D
结构在C#中不能有无参数构造函数, 因此 new Transform2D()
将所有原始成员初始化为其默认值. 请使用 Transform2D.Identity
, 相当于GDScript和C++中的 Transform2D()
.
下列方法已转换为属性, 其各自名称已被更改:
GDScript | C# |
---|---|
|
|
|
|
Plane
以下方法已转换为名称 稍有 不同的属性:
GDScript | C# |
---|---|
|
|
Rect2
以下字段已转换为名称 稍有 不同的属性:
GDScript | C# |
---|---|
|
|
以下方法已转换为具有不同名称的属性:
GDScript | C# |
---|---|
|
|
Quat
结构在C#中不能有无参数构造函数. 因此 new Quat()
将所有原始成员初始化为其默认值. 请使用 Quat.Identity
, 相当于GDScript和C++中的 Quat()
.
以下方法已转换为具有不同名称的属性:
GDScript | C# |
---|---|
|
|
|
|
数组
这是暂时的.PoolArrays将需要使用它们自己的类型才能按预期的方式使用.
GDScript | C# |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
构造器创建一个.
Variant
System.Object
( object
)用来代替 Variant
.
与其他脚本语言通信
在 跨语言脚本 中有详细解释。
Yield
可以使用 C# 的 yield 关键字 来实现类似于 GDScript 中带有单个参数的 yield
的功能。
通过 async/await 和 Godot.Object.ToSignal
可以实现 yield
对信号的相同效果。
示例:
await ToSignal(timer, "timeout");
GD.Print("After timeout");
其他差异
preload
在 GDScript 中可用,在 C# 中不可用。请使用 GD.Load
或 ResourceLoader.Load
替代。
其他差异:
GDScript | C# |
---|---|
|
|
|
|
|
|
| 待完成 |
| 待完成 |