【问题标题】:Avoiding circular dependencies in game unit targeting避免游戏单元定位中的循环依赖
【发布时间】:2018-09-24 19:37:39
【问题描述】:

我正在为我目前正在开发的游戏开发 uml,并且在思考如何进行单位定位时有点卡住了。

所以解释一下,目前我有一个 UnitManager 类,它有一个单元列表,它每帧更新一次。

如果某个单位在一定距离内,我希望某些单位能够瞄准其他单位之一。为此,我想我需要参考 UnitManager 列表中的其他单位,并检查其中哪些在某些范围内 大大地。

问题:如何在 Unit 和 UnitManager(或其他任何地方)之间没有循环依赖关系的情况下,一个 Unit 以另一个 Unit 为目标?

在此先感谢 Vidar。

编辑:一些UML示例:

【问题讨论】:

标签: design-patterns uml


【解决方案1】:

具有双向关系当然是一个循环依赖,但是一个非常特殊的情况,在相应地考虑它时可以接受。如果可能,所有其他循环依赖项都应该被忽略(并非总是如此,那么他们需要更多的关注,尤其是在维护这样的系统时)。

为了打破循环依赖,有几种可用的默认技术。最有效的一种方法是提取接口部分,并使实现中的依赖关系只到接口而不是 cocnrete 类。这也带来了其他几个好处,例如改进的重用性、可扩展性或可测试性。

在这里的具体案例中,我会提到作为经典 GoF 模式的一部分提出的观察者模式。在那里你有一个(抽象的)观察者类,它是你的单元,它实现了一个被调用来通知更新的方法。还有一个主题类,它将是您的 UnitManager 类。 UnitManager 类只知道,即依赖于抽象观察者类或接口,而不是具体的观察者类或接口。并且每个可能触发所有其他单元实例更新的单元类都将依赖于 UnitManger(或者当它依赖于抽象超类或接口时)。

当您进一步想要处理接近度时,很大程度上取决于剩余逻辑是如何以及如何实现的。一个基本的解决方案是根据它们的距离注册和取消注册单位。另一种选择是 UnitManager 只调用足够近的注册观察者。

【讨论】:

    【解决方案2】:

    基本上循环引用还不错。他们只是可能需要额外的关注。

    您在这里提出了一个绝对基于意见的设计问题。但是,我想应该有一个监督实例(例如UnitManager),它可以管理Units 之间的距离。因此,在这里实现可以告诉Units 的“接近度”的方法可能是一个好主意。

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2012-08-10
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多