避免游戏单位定位中的循环依赖

时间:2018-09-24 19:37:39

标签: design-patterns uml

我当时正在为我目前正在开发的游戏开发uml,但在思考如何进行单位定位时有些困惑。

因此,请解释一下,当前我有一个UnitManager类,该类具有一个单位列表,它每帧更新一次。

如果某个单位在一定距离内,我希望某些单位能够瞄准其他单位。为此,我想我需要在UnitManager列表中获得对其他单位的引用,并检查其中一些在范围内 办法。

问题:一个单位如何在不与Unit和UnitManager(或其他任何地方)之间具有循环依赖关系的情况下定位另一个单位?

预先感谢,维达。

编辑:一些UML示例:

enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

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

要打破循环依赖关系,可以使用几种默认技术。最有效的方法是拉出接口部分,并使实现的依赖关系仅实现到接口而不是cocnrete类。这还带来了其他一些好处,例如提高了重用性,可扩展性或可测试性。

在这里的具体情况下,我将参考作为经典GoF模式一部分提出的Observer模式。那里有一个(抽象的)观察者类,它是您的Unit,它实现了一种用于通知更新的方法。还有一个主题类,它就是您的UnitManager类。 UnitManager类仅知道(即依赖)抽象的观察者类或接口,而不是具体的类。每个可能触发所有其他单元实例更新的单元类都将对UnitManger具有依赖关系(或当其归因于其抽象超类或接口时)。

当您进一步想要处理邻近问题时,它很大程度上取决于剩余的逻辑信息及其实现方式。一个基本的解决方案是根据单元的距离进行注册和注销。另一个选择是UnitManager仅调用足够接近的已注册观察者。

答案 1 :(得分:0)

基本上循环引用也不错。他们可能只需要格外注意。

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