Godot,GDScript进展报告:新的GDScript现已合并,2020,8,3

GDScript进行重大重构,引入注解支持、属性系统、await替代yield等新特性,提升代码完成体验,删除多级调用,增加super关键字,代码更易读、可控。

在这里插入图片描述


By: George Marques Aug 04, 2020

有些人可能知道,我最近一直在做的重构,现在已经合并到主干分支了。这个工作在之前的进度报告中已经解释过了。

主要变化

虽然我已经打开了一个pull request来更新文档,但我还是要在这里简单描述一下有哪些变化。

附加说明

我们现在有了注解支持,而且是用来替换沿途引入的一些关键词。这包括RPC关键字,如@master、@puppet和@remote。

以前的导出关键字现在被每个案例的专门注释列表所取代。例如,如果你想要一个范围,你可以使用@export_range注解。不再需要将类型设置为参数,因为它可以从变量的类型指定符中获取(例如:@export var my_number: int)。

这有一个额外的好处,因为这些注解具有代码完成和参数提示的功能,这使得它们更容易使用,而不必像以前那样记住所有可能的组合。

这也包括一个@icon注解,必须使用这个注解,而不是像之前那样添加在class_name后面。

属性

之前的setget语法被删除,取而代之的是属性。它的目的是为了与变量声明更紧密地联系在一起,避免你不得不创建专门的函数(如果你喜欢的话,还是可以的)。另一个变化是,与setget不同的是,即使在同一个类中,属性总是调用它们的setter/getter。这给用户提供了一个一致的行为,在重构过程中不会引起混淆或导致潜在的错误。

await 代替 yield

你可能已经知道,yield关键字被删除了,取而代之的是 await。它不仅有一个更有意义的名字,而且还利用了Godot主分支中引入的一流信号。它的语法更容易理解,并且有更少的模板(当等待coroutine时,你不需要写 "完成 "信号。

如果你调用的函数并不总是作为一个coroutine工作(你不需要处理特殊情况),它也更透明,而且它是类型安全的,因为你不能在你期待返回值的时候收到一个函数状态。

super关键词

现在你必须使用super关键字来调用在超级类中定义的函数,而不是覆盖版本,而不是在函数名前加上点(.)。这也适用于构造函数,使其在总体上更加一致,提高了灵活性。

单独调用super()会调用你所在的同一个函数,但使用超级类实现。如果你需要调用不同的函数,可以使用super.function_name()。

代码完成

如前次报告所述,代码完成是一项正在进行的工作。现在基本上已经完成。我知道,它可能需要一些生活质量的改进,但这将在以后进行。目前,它应该和以前一样。如果有什么缺失,请随时报告问题。

删除多级调用

另一个常见的混乱来源被删除了。如果你创建了一些生命周期函数的重写(如_process或_ready),它仍然会隐式地调用超类的实现。更糟糕的是:有些函数在子类之前调用了超类,有些函数则反其道而行之。

这个行为现在已经完全被删除了。如果你需要调用父级实现,你可以使用上面提到的super关键字。这在OOP语言中很常见,所以它应该更符合用户的期望(这在过去报告这个行为的多个问题中得到了证明)。它还让用户可以控制何时应该调用超级实现。

请注意,C++代码中定义的方法仍然会被调用。这是为确保引擎行为的正确性所需要的(比如按钮_gui_input需要执行按压行为)。

测试

我花了很大一部分时间来测试GDScript的实现,并在途中修复了大量的bug和崩溃。如果你发现崩溃或问题,不要害怕报告它(如果之前没有报告的话)。最终我会进行一轮大的bug修复来稳定它的发布,但现在我会尽量让GDScript保持在一个可行的状态,尤其是不崩溃。

未来

目前,我正在为代码生成接口进行抽象。这将有助于创造一种能力,在不改变编译器的情况下改变目标后端语言(目前只是GDScript VM本身),最终为代码优化铺平道路。更多关于这方面的细节将在下一份进度报告中介绍。

在那之后,我将开始在虚拟机中添加类型化的指令,当你在脚本中使用静态类型时,速度应该会大幅提高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值