鉴于
主场景有一个 Player 场景的实例
And
在 Player.gd 中,我需要调用 Grid.gd“_Calculate”中的一种方法,向其传递两个变量,并让它返回一个变量。
我给你几个选择。
坏方法
如果玩家知道网格的节点路径,它可以使用get_node
为拿到它,为实现它。
onready var _grid = get_node("../../grid")
或类似的东西。
然后使用它:
var vNewPosition = _grid._Calculate(vPlayer, vInputDirection)
这种做法当然是不建议。如果节点路径错误就会中断。
常见的方式
假设玩家不知道节点路径(这更有可能),您可以导出NodePath
Player.gd 中的变量并使用它来获取网格:
exprort var grid_path:NodePath
onready var _grid = get_node(grid_path)
然后需要将主场景中的Grid Path属性设置为Grid。
这种方法比前一种方法更好,因为它不依赖于网格的路径。然而,它仍然取决于网格的存在。如果在没有 Grid 的情况下 Player 没有任何意义,那么这种方法是可以的。
好办法
如果网格可能存在也可能不存在,并且我们希望 Player 无论如何都能工作,我们可以调整上述方法:
exprort var grid_path:NodePath
onready var _grid = get_node_or_null(grid_path)
并记住在使用之前检查 grid 是否为空:
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
。我们还假设有零个或一个,而不是多个。我可以想出一种方法来解决这个问题,但是为了解耦而解耦是没有必要的。我认为这对于您的用例来说已经足够好了。然而,如果您想要过度设计的方式,请告诉我。