[在Godot 3.2中工作,我有一个场景,Player.tscn
。在Player.tscn
顶部附近,我有“ class_name Player
”
现在,实例化Player
时,据我所知,有两个选择:
player = Player.new()
或
player = load("res://Player.tscn").instance() as Player
现在,第一个版本对我来说似乎最好...但是显然不是。如果我使用.new()
,它声称它没有子对象,并且任何试图获取其子对象的方法调用(例如.get_texture()
上的Sprite
),都会产生类似“ Attempt to call function 'get_texture' in base 'null instance' on a null instance
”的内容,因为Player
没有孩子。
当然,以第二种方式进行,一切正常。但为什么?如果我已经使用.new()
将其注册为课程,为什么不能只使用class_name
?
我对Godot还是陌生的,所以我可能是错的,但是我认为这是因为.new()关键字是用于加载单个类/节点的语言功能,
而.instance()更多地是一种引擎功能,它采用打包的场景,打包的场景是许多类/节点的组合,并还原了它们在树中的相对位置,并附加了脚本和资源,等等
var player = load("res://etc/Player.tscn").instance()
get_tree().root.add_child(player)
player.global_transform = etc ...
这会将Player.tscn的根节点及其所有子级(刚体,对撞体形状等)加载到场景树中,设置它们的相对位置,连接脚本以及您拥有的一切
var player = Player.new()
get_tree().root.add_child(player)
player.global_transform = etc ...
仅将单节点根播放器对象添加到场景树中,而不添加任何子级的对象
一旦它在场景树中并且_ready()被触发,您就可以实例化并附加脚本本身的子组件节点(.new()> parent.add_child()> set transform)