@export值设置时机及Godot脚本中@onready的必要性问询
关于Godot中@onready修饰符的使用疑问解答
是否必须使用@onready?
不是强制要求,但非常建议保留。你的这些派生变量(_scaling_in_step、_steps_to_max、_max_scale等)依赖节点的运行时属性(比如rotation_degrees.x、scale)以及编辑器中可能修改的@export变量值,@onready能确保这些变量在节点完全初始化、所有属性(包括编辑器设置的值)都加载完成后再计算赋值,避免出现值不对的情况。
为什么不加@onready时值仍能正确计算?
你测试时没出问题,主要有这几个原因:
- 默认值匹配:你代码里的
rotation_degrees.x默认是0,min_rotation默认也是0,scale默认是1,这些默认值代入计算后,不管是在脚本初始化阶段还是@onready阶段,结果都是一致的。如果你在编辑器里修改了这些属性(比如把节点旋转到30度,或者调整了scale),不带@onready的话,派生变量会用脚本初始化时的默认值计算,而不是你修改后的真实值,这时候就会出问题。 - @tool脚本的特殊处理:因为你的脚本加了
@tool标记,编辑器在处理它时,会提前完成@export变量的赋值,再执行类体变量的初始化。但这只是编辑器环境下的特殊情况,一旦脱离编辑器运行(比如导出游戏后),节点属性的加载时机就会回归正常流程,这时候不带@onready就可能出现计算错误。 - 并非惰性计算:Godot的类体变量是在脚本实例化时立即计算的,不是惰性计算。之所以看起来正常,只是刚好你的测试场景下默认值的计算结果和初始化完成后的结果一致而已。
举个实际例子:如果你在编辑器里把节点的rotation_degrees.x改成30,不带@onready的_steps_to_max会用初始化时的rotation_degrees.x=0计算,得到(0-0)/5=0;但加了@onready的话,会用修改后的30计算,得到(30-0)/5=6,这两者的结果完全不同,后续的_max_scale也会跟着出错。
内容的提问来源于stack exchange,提问作者Yoloroy
相关产品推荐
相关产品推荐

