AudioStreamPlayer 被视为“null”并拒绝播放

AudioStreamPlayer getting treated as "null" and refusing to play

提问人:orangecarnation 提问时间:11/14/2023 更新时间:11/14/2023 访问量:22

问:

我正在尝试将我的游戏设置为在比赛中播放特定歌曲,然后在最后根据哪个角色获胜切换到不同的歌曲(这些只是占位符)。我在脚本中有这段代码,我计划根据需要在主游戏循环的脚本中调用方法:

extends AudioStreamPlayer

class_name Sounds

enum CURRENT_SONG {MATCH, CHAR1, CHAR2}

@onready var matchMusic: AudioStreamPlayer = $MatchMusic

func playMusic(song := CURRENT_SONG.MATCH) -> void:
    match song:
        CURRENT_SONG.MATCH:
            matchMusic.play()
        CURRENT_SONG.CHAR1:
            pass
        CURRENT_SONG.CHAR2:
            pass

我在场景树中有一个名为“MatchMusic”的 AudioStreamPlayer 节点,并附加了一首占位符歌曲。

我看了这个教程,其中类似于我上面所做的工作,并改变了一些东西,将声音播放附加到游戏循环中的某些步骤,而不仅仅是单击一个按钮。相反,当我尝试运行我的游戏时,我收到错误“无法对 null 值调用方法'play'”。 我测试了注释掉 matchMusic.play() 方法,将其替换为 print 语句,然后运行它,以确保这不仅仅是我尝试以某种方式调用我的 playMusic() 函数的问题 - 这部分似乎工作正常。

戈多 4

评论


答:

1赞 dddavid 11/14/2023 #1

您的节点路径是否正确?该消息表示 matchMusic 变量解析为 null。名称中可能存在拼写错误,或者节点位于其他位置。$MatchMusic 等效于 get_node(“MatchMusic”) 调用,因此它会在附加了脚本的节点的子节点中查找具有该名称的节点。

评论

0赞 orangecarnation 11/15/2023
我现在已经重新排列了我的场景树,以确保 MatchMusic 节点是这个节点的子节点,并右键单击 + 复制的节点路径以确保没有拼写错误,但我仍然收到相同的错误。还有什么可能让我忘记的吗?我对节点系统和所有
0赞 dddavid 11/15/2023
我还有另一个想法(我粗鲁地用自己的脚开枪):这段代码是什么时候调用的?调用此函数时,AudioStreamPlayer 可能尚未初始化。由于它是脚本的子节点,因此在脚本的 _ready() 之后包含任何内容都可以。我只能想到_init(),这是在孩子准备好之前调用的。
0赞 orangecarnation 11/17/2023
我以为可能就是这样,但不知何故,我的 Sounds 类脚本仍然给我带来了错误。但是,幸运的是,在试图弄清楚这一点时,看起来只是将这个函数(以及您建议的所有初始化内容)移动到我试图调用它的脚本中就可以了!这会让那里的事情变得更加混乱,但我很高兴它现在能运作起来。