unreal engine 用了一阵下来,感觉这个引擎做 2d 游戏确实有点太重量级了,有很多用不到的功能,甚至很多不需要的功能我都不知道怎么关闭,所以前一阵子转了 Godot,使用的版本是 3.4.4-stable,整体用下来,就 2d 游戏开发而言,体验还是很好的。不过这两天看到 Godot4 正在测试,正好有一些我需要的特性,因此果断下载了 4.0-alpha 版,3 到 4 的脚本语法上还是有不少更新的,所以慢慢把遇到的一些总结一哈。
# 1. 支持函数变量
Godot3 的 gd 脚本语法中,不支持使用变量来保存函数,因此很多注册和绑定函数的地方都是使用字符串去函数池中匹配的,这种方式效率肯定比直接绑定函数略低,写起来也比较麻烦:
# Godot3: | |
PlayerAttr.connect("player_change_hp", self, "on_hp_change") # 注册信号 player_change_hp 触发 self 的函数 on_hp_change |
而现在有了函数变量后,只需要这么写:
# Godot4: | |
PlayerAttr.connect("player_change_hp", self.on_hp_change) |
调用的一个函数变量对应的函数可以这么写:
var my_lambda = func(x): | |
print(x) | |
my_lambda.call("hello") |
# 2.setget 格式变化
Godot3 中重载 setget 函数的写法是这样的:
# Godot3: | |
var a = 0 setget set_a,get_a | |
func set_a(new_value): | |
... | |
func get_a(): | |
... |
4 中形式改了下:
# Godot4: | |
# 可以直接注册函数 | |
var a = 0 : | |
set = set_a,get = get_a | |
# 也可以直接使用匿名函数的形式直接定义 | |
var b = 0 : | |
set(new_value): | |
... | |
get: | |
... |
# 3. 引入注解
Godot4 的 gdscript 引入了注解的方式,很多以前看起来比较怪的关键词,可以通过类似 Java 注解的方式让他们看起来合理一点,比如原来加在 var 前面的 onready
、 export
,比如原来加在开头比较突兀的 tool
等,现在都加了 @作为注解使用。(当你项目 3 转 4 有关键词找不到报错时,就试试加个 @)
# 4. 加入 super 关键字
原本 Godot3 中要调用父类方法是通过 .
的形式:
# base.gd | |
func base_func(): | |
... | |
# drived.gb | |
func drived_func(): | |
.base_func() | |
... |
Godot4 中引入 super
关键词后,可以直接使用 super 调用,更清晰一些:
# base.gd | |
func base_func(): | |
... | |
# drived.gb | |
func drived_func(): | |
super.base_func() | |
... |
然后在函数中也可以像调用父类同名函数来覆盖:
# base.gd | |
func _ready(): | |
... | |
# drived.gb | |
func _ready(): | |
super() | |
... |
有个注意事项,那就是 Godot3 中,派生类的同名函数是会默认先调用一次基类的函数的,而 Godot4 中当你重载父类同名函数后,只有显示调用 super
才会调用父类函数,这点修改使得 gdscript 更符合我们所熟悉的其他面向对象语言了。
# 5. 总结
Godot4 更新了非常多特性,不过有些如有类型的数组、变量初始值可以调用静态函数等,不过我暂时没用到,也感觉不太常用,等用到了再好好总结。除此之外编辑器也改了不少,比如场景内原来的按住右键拖动变为了按住中键拖动,一开始没找到方式的时候想查也很难找,后来是自己试出来的。目前 Godot 可能还是有很多不方便的地方吧,希望之后功能越来越好,资料能越来越多~
# 参考资料
Godot Engine:GDScript 4.X 中语法的变化
GDScript progress report: Feature-complete for 4.0