解决分离组件中的冲突功能

时间:2016-06-22 12:42:57

标签: c# override components

我一直在研究Unity3D中更严格的基于组件的设计。我一直在使用太空入侵者克隆作为练习项目。在我的播放器对象上它有组件:PlayerInput,Horizo​​ntalVelocity以及渲染器等常见的嫌疑人。

我正在使用中介系统进行通信,因此当按下箭头键时,PlayerInput类会创建一个事件,然后通过调解器将其广播到速度。

现在我想添加一个Horizo​​ntalBounds类来阻止它向左或向右移动太远。但是存在冲突:速度和水平边界都试图以不同的方式同时移动变换。我可以想到解决这个冲突的几个选择:

bounds组件不断检查转换,如果它超出范围,则将其推回到边界内。这很可怕,因为我们让速度分量以一种方式移动它,并且边界分量将它移回每一帧。

从Velocity 派生一个VelocityWithBounds组件(如果我们试图避免继承,则实现一个速度界面?)。这里的问题是你把两个组件放在一起。如果你想删除边界,你就不能摆脱那个部分(你可以将它设置为边界但它仍然存在)。您必须销毁所有内容并用新的速度组件替换它。我不确定这是否会引起任何重大问题,但它似乎不够优雅。

在运行时为绑定组件提供一些覆盖速度组件功能的方法。这似乎是最优雅的解决方案,但可能是最难实现的。你必须以速度不知道被覆盖的方式将它们分离。 这只是一个示例问题。是否有针对此类问题的最佳实践,还是应该逐案解决?

1 个答案:

答案 0 :(得分:0)

除非您能够轻松地重构代码设计,否则请考虑以下选项作为示例:

叠加原则:

list.slice

创建一个直接驱动船速的空间或函数y(x,t)

优化解决方案(我的版本):

当你有两个彼此定义的身份/空间(组件在你的情况下)时,最好创建第三个身份/空间,使第三个身份/空间依赖于前两个。 换句话说,将空间[s0]分解为子空间[s1和s2],同时这样做结果将是[s1和s2]将具有公共输入和输出类型(非常重要)。

将您的船的功能分解为两个,一个限制您的船 和其他控制加速度。将需要两个不同的游戏对象。

由于您有2个解耦组件定义实体的速度,我建议让边界与该受控实体一起移动。所以这意味着例如:你的船在接近界限时会以指数方式失去速度而加速但是如果你允许更多加速,它就会开始沿着界限进行标记。听起来很激烈,但这会给你额外的控制。事实上,您所要做的就是将MAX加速度设置为不超过移动边界所需的加速度。