当我通过 Godot 4.1.1 中的代码更改它时,Sprite3D 纹理变成 <Object#Null>

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

我正在制作一款 2.5D 塔防游戏,其中有气球《Godot》。 (所有代码和场景都在我的github上)。 (我还修复了我的 git,所以仓库现在可以工作了) 我的气球场景由气球的 Node3D 和 Sprite3D 组成,当我实例化气球(在代码中)时,Node3D 和 Sprite3D 位于场景树中,但它不显示精灵。

我尝试在实例化场景后更改精灵,但仍然没有任何效果。我也尝试隐藏所有其他对象,但仍然一无所获。 J 预计气球精灵会显示在 0,0,0,但事实并非如此。

game-engine game-development godot gdscript godot4
2个回答
1
投票

看来我正在写这篇文章,因为你也在修复这个问题......这是我使用的代码的版本:

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
方法并从两个地方调用它。


0
投票

我找到了答案:原来你需要使用

preload()
而不是
load()

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