我正在制作一款 2.5D 塔防游戏,其中有气球《Godot》。 (所有代码和场景都在我的github上)。 (我还修复了我的 git,所以仓库现在可以工作了) 我的气球场景由气球的 Node3D 和 Sprite3D 组成,当我实例化气球(在代码中)时,Node3D 和 Sprite3D 位于场景树中,但它不显示精灵。
我尝试在实例化场景后更改精灵,但仍然没有任何效果。我也尝试隐藏所有其他对象,但仍然一无所获。 J 预计气球精灵会显示在 0,0,0,但事实并非如此。
看来我正在写这篇文章,因为你也在修复这个问题......这是我使用的代码的版本:
bloon.gd
extends Node3D
@export var resistances := []
@export var texturePath := "res://sprites/bloons/Red.png"
# Speed is in red bloons / second
@export var speed := 1
#For fortified leads
@export var health = 1
@export var children := []
# TODO
# add moving across map
func _ready():
var sprite = $Sprite
sprite.texture = load(texturePath)
pass
func _process(delta):
pass
在这里您将纹理加载到
_ready
:
sprite.texture = load(texturePath)
现在,之后修改
texturePath
的值不会改变纹理,因为_ready
没有理由再次运行。
有一种模式适用于这种情况,您需要一个设置器和一个更新函数:
@export var texturePath := "res://sprites/bloons/Red.png":
set(mod_value):
if texturePath == mod_value:
return
texturePath = mod_value
if is_node_ready():
update()
func _ready() -> void:
sprite = $Sprite
update()
func _exit_tree() -> void:
request_ready()
func update() -> void:
sprite.texture = load(texturePath)
因此,当您修改
texturePath
时,Node3D
要么在场景树中,要么不在场景树中。
如果它在场景树中,那么您可以继续加载纹理并将其设置为
sprite
。
如果不是,那么我们请求在它再次进入场景树时运行
_ready
(使用request_ready
),并且在_ready
中,您还可以继续加载纹理并将其设置为sprite
。
由于“加载纹理并将其设置为
sprite
”部分在两种情况下是相同的,因此我们将其提取到 update
方法并从两个地方调用它。
我找到了答案:原来你需要使用
preload()
而不是 load()
。