鉴于此
主场景有一个玩家场景的实例
和
在 Player.gd 中,我需要调用 Grid.gd 中的一个方法“_Calculate”,将两个变量传递给它,并让它返回一个变量。
我会给你几个选择。
不好的方式
如果 Player 知道 Grid 的节点路径,它可以使用get_node 来获取它。
onready var _grid = get_node("../../grid")
或者类似的东西。
然后使用它:
var vNewPosition = _grid._Calculate(vPlayer, vInputDirection)
这种方法当然不推荐。如果节点路径错误,它将中断。
常用方式
假设 Player 不知道节点路径(这种可能性更大),您可以在 Player.gd 中导出一个NodePath 变量并使用它来获取 Grid:
exprort var grid_path:NodePath
onready var _grid = get_node(grid_path)
然后需要将Main场景中的Grid Path属性设置为Grid。
这种方法比前一种方法更好,因为它不依赖于 Grid 的路径。但是,它仍然取决于存在的网格。如果没有 Grid 时 Player 没有意义,这种方法是可以的。
好办法
如果 Grid 可能存在也可能不存在,并且我们希望 Player 能够正常工作,我们可以调整上述方法:
exprort var grid_path:NodePath
onready var _grid = get_node_or_null(grid_path)
记得在使用前检查grid是否为null:
if grid == null:
return # or whatever
var vNewPosition = grid._Calculate(vPlayer, vInputDirection)
或者像这样:
var vNewPosition = grid._Calculate(vPlayer, vInputDirection) if grid != null else null
这也允许我们指定vNewPosition 在没有网格时将采用的默认值(行尾的null)。因此,您可以让 Player 在没有 Grid 的情况下工作,当有 Grid 时,它会使用,无论在哪里(因为 Main 告诉它它在哪里)。
这个解决方案没有完全解耦,因为 Player 仍然知道 grid 是一个有 _Calculate 的东西。我们还假设有零或一,而不是多个。我可以想办法解决这个问题,但为了解耦而解耦是不必要的。我认为这对您的用例来说已经足够好了。但是,如果您想要过度设计的方式,请告诉我。