使用.instance加载场景和使用.new有什么区别?

问题描述 投票:0回答:1

[在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

class instance godot
1个回答
0
投票

我对Godot还是陌生的,所以我可能是错的,但是我认为这是因为.new()关键字是用于加载单个类/节点的语言功能,

而.instance()更多地是一种引擎功能,它采用打包的场景,打包的场景是许多类/节点的组合,并还原了它们在树中的相对位置,并附加了脚本和资源,等等

因此,如果您的播放器是tscn场景,您将执行以下操作:

var player = load("res://etc/Player.tscn").instance()
get_tree().root.add_child(player)
player.global_transform = etc ...

这会将Player.tscn的根节点及其所有子级(刚体,对撞体形状等)加载到场景树中,设置它们的相对位置,连接脚本以及您拥有的一切

或者如果您的播放器是类或GDScript,则可以这样做

var player = Player.new()
get_tree().root.add_child(player)
player.global_transform = etc ...

仅将单节点根播放器对象添加到场景树中,而不添加任何子级的对象

一旦它在场景树中并且_ready()被触发,您就可以实例化并附加脚本本身的子组件节点(.new()> parent.add_child()> set transform)

© www.soinside.com 2019 - 2024. All rights reserved.