簡體   English   中英

function 在 Godot 的基礎“Nil”中不存在用於實例化玩家的“實例”

[英]Nonexistent function 'instance' in base 'Nil' in Godot for instancing the player

我目前正在處理我的游戲的保存和加載狀態,我創建了一個全局腳本來使用它。 在腳本中,我預加載玩家場景,然后在 load_game() function 中實例化它。 而且這個實例似乎不起作用。

我收到錯誤消息“無效調用。基數‘Nil’上不存在 function‘實例’”。 我嘗試使用加載而不是預加載(沒有用)。 這是我第一次制作保存和加載狀態,所以我對如何在全局腳本中訪問玩家場景感到有些困惑。

這是代碼:

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

此處的這一行出現錯誤:

var player = playerCharacter.instance()

在此先感謝您的幫助。 我很感激任何可以幫助我理解這一點並幫助我保存和加載我的游戲的 godot 文檔。 目前我正在使用從 GameEndeavor 中學到的 .dat 文件。

這個表達式:

preload("res://Player/Player.tscn")

如果路徑正確,會給你一個PackedScene object。


這個表達式:

preload("res://Player/Player.tscn").new()

我很驚訝它沒有給你一個錯誤。 new方法是 static,不應在 object 上調用。根據你得到的錯誤,我猜這是返回null


您可以使用preload ,但要使用這樣的const

const playerCharacter = preload("res://Player/Player.tscn")

這是可能的,因為preload關鍵字為您提供常量表達式並且在解析時解析。 如果你添加一些不是常量表達式的東西,比如.new() ,它也會讓 Godot 抱怨。

如果你使用load那么你不能使用const ,但它也應該有效。 使用load將在 Godot 執行該行時加載PackedScene 使用preload Godot 將在 Godot 加載腳本時加載PackedScene 您可能還對ResourceLoader class 感興趣。


一旦你有了PackedScene object,你應該能夠調用它的instance

var player = playerCharacter.instance()

供將來參考:在 Godot 4 中它是instantiate


為了滿足好奇心和消除疑惑……你可以像這樣用new創建一個PackedScene

var packed_scene := PackedScene.new()

但僅當您想從代碼創建場景時才這樣做。 您可以使用ResourceSaver class 將其保存到文件中。例如:

var packed_scene := PackedScene.new()
packed_scene.pack(node)
ResourceSaver.save("res://new_scene.tscn", packed_scene)

這可能很有用,例如,當從編輯器運行代碼時(可能作為插件的一部分),但這不是您在這里所做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM