Godot 中的基数“Nil”中不存在用于实例化玩家的函数“instance”

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

我目前正在研究游戏的保存和加载状态,并创建了一个全局脚本来使用它。在脚本中,我预加载玩家场景,然后在 load_game() 函数中实例化它。而且该实例似乎不起作用。

我收到错误“无效调用。基‘Nil’上不存在函数‘实例’”。我尝试使用加载而不是预加载(不起作用)。这是我第一次制作保存和加载状态,所以我对如何在全局脚本中访问玩家场景感到有点困惑。

这是代码:

onready var playerCharacter = preload("res://Player/Player.tscn").new()

此行出现错误:

var player = playerCharacter.instance()

提前感谢您的帮助。我很感激任何能够帮助我理解这一点并帮助我保存和加载游戏的 godot 文档。目前我正在使用从 GameEndeavor 学到的 .dat 文件。

null save instance godot gdscript
2个回答
1
投票

这个表情:

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)

这可能很有用,例如,当从编辑器运行代码时(可能作为插件的一部分),但这不是您在这里所做的。


0
投票

尝试

var player = playerCharacter.instantiate() 
© www.soinside.com 2019 - 2024. All rights reserved.