【问题标题】:How do I define a global variable in Godot?如何在 Godot 中定义全局变量?
【发布时间】:2020-12-10 20:36:22
【问题描述】:
所以我一直在为一个项目编写平台游戏,需要编写一个敌人。
我想在玩家的位置相对于敌人的位置在一定范围内时让敌人攻击。
除了这个我稍后会修复的草率 AI 之外,我似乎无法找到一种方法来访问我用于播放器的 KinematicBody2D 节点的位置。
我尝试在 World 节点中创建一个变量,但它无法访问它。
Here is my scene tree
任何建议将不胜感激
【问题讨论】:
标签:
position
global-variables
godot
gdscript
【解决方案1】:
建议不要使用全局变量,而是在 Enemy 场景下添加一个Area2D,表示玩家对敌人的探测范围。然后在您的 Enemy 场景中,将 area_entered 或 body_entered(取决于您的设置)连接到您的 Enemy 脚本。它应该生成一个类似于_on_area_entered() 的函数。然后开始编写 Enemy 攻击代码。
如果你真的想使用全局变量,那么另一种实现方式是创建单例/自动加载。为此,只需创建一个脚本(扩展任何节点)或一个场景。然后转到Project Settings > AutoLoad 并浏览您制作的脚本/场景。最后,输入节点名称,然后按Add。
这将使您的脚本成为可以在脚本中的任何位置访问的“变量”。在这里您可以开始编写 Enemy 和 Player 交互代码。
【解决方案2】:
与 AI 无关,只是全局变量...
按照 Martin 的回答创建一个单例,您可以在其中放置您希望由其他脚本共享的所有变量。
在我的例子中(Globals.gd 是单例之一 - 你可能有多个),我的脚本使用这样的变量:
onready var globals = get_node("/root/Globals")
func _ready() -> void:
globals.seqCC = 0
globals.trackDone = true
for i in globals.allTracksName.size():
$TracksList.add_item(globals.allTracksName[i])
globals.trackParts = ["RL"]
顺便说一句...您也可以创建“全局”函数...只需将它们的代码放在一个单例中,您就可以从任何其他脚本中调用它们。 (例如,我使用它来将所有声音/音乐管理保存在我从任何其他场景调用的单独的全局脚本中。)
干杯...