我目前正在研究游戏的保存和加载状态,并创建了一个全局脚本来使用它。在脚本中,我预加载玩家场景,然后在 load_game() 函数中实例化它。而且该实例似乎不起作用。
我收到错误“无效调用。基‘Nil’上不存在函数‘实例’”。我尝试使用加载而不是预加载(不起作用)。这是我第一次制作保存和加载状态,所以我对如何在全局脚本中访问玩家场景感到有点困惑。
这是代码:
onready var playerCharacter = preload("res://Player/Player.tscn").new()
此行出现错误:
var player = playerCharacter.instance()
提前感谢您的帮助。我很感激任何能够帮助我理解这一点并帮助我保存和加载游戏的 godot 文档。目前我正在使用从 GameEndeavor 学到的 .dat 文件。
这个表情:
preload("res://Player/Player.tscn")
如果路径正确,会给你一个
PackedScene
对象。
这个表情:
preload("res://Player/Player.tscn").new()
我很惊讶它没有给你错误。
new
方法是静态的,不应在对象上调用。从你得到的错误来看,我猜测这正在返回 null
。
您可以使用
preload
,但使用像这样的 const
:
const playerCharacter = preload("res://Player/Player.tscn")
这是可能的,因为
preload
关键字为您提供常量表达式,并且在解析时解析它。如果你添加一些不是常量表达式的东西,比如 .new()
,它也会让 Godot 抱怨。
如果您使用
load
,则无法使用const
,但它也应该可以工作。使用 load
将在 Godot 执行该行时加载 PackedScene
。使用 preload
Godot 将在 Godot 加载脚本时加载 PackedScene
。您可能还对 ResourceLoader
课程感兴趣。
一旦你有了
PackedScene
对象,你应该能够在它上面调用 instance
:
var player = playerCharacter.instance()
供将来参考:在 Godot 4 中是
instantiate
。
为了满足好奇心和清除困惑......您可以使用
PackedScene
创建一个 new
,如下所示:
var packed_scene := PackedScene.new()
但只有当您想从代码创建场景时才这样做。您可以使用
ResourceSaver
类将其保存到文件中。例如:
var packed_scene := PackedScene.new()
packed_scene.pack(node)
ResourceSaver.save("res://new_scene.tscn", packed_scene)
这可能很有用,例如,当从编辑器运行代码时(可能作为插件的一部分),但这不是您在这里所做的。
尝试
var player = playerCharacter.instantiate()