【发布时间】:2016-10-24 09:59:01
【问题描述】:
我一直在研究 Unity3D 中更严格的基于组件的设计。我一直在使用太空入侵者克隆作为练习项目。在我的播放器对象上,它具有以下组件:PlayerInput、HorizontalVelocity 以及渲染器等常见的嫌疑犯。
我正在使用中介系统进行通信,因此当按下箭头键时,PlayerInput 类会创建一个事件,然后通过中介将其广播到速度。
现在我想添加一个 HorizontalBounds 类来阻止它向左或向右移动太远。但是有一个冲突:速度和水平边界都试图同时以不同的方式移动变换。我可以想到解决这个冲突的几个选项:
bounds 组件不断检查变换,如果超出边界,它会将其推回边界内。这太可怕了,因为我们让速度组件将其单向移动,而边界组件将其向后移动,每一帧。
创建一个从 Velocity 派生的 VelocityWithBounds 组件(如果我们试图避免继承,或者实现一个速度接口?)。这里的问题是您将两个组件放在一起。如果你想删除边界,你不能只是摆脱那部分(你可以将它设置为边界,但它仍然会存在)。您将不得不销毁所有内容并用新的速度组件替换它。我不确定这是否会导致任何重大问题,但这似乎不太优雅。
给 bounds 组件一些在运行时覆盖速度组件功能的方法。 这似乎是最优雅的解决方案,但可能最难实现。您必须以这样一种方式将它们解耦,以使速度不知道它被覆盖了。 这只是一个示例问题。此类问题是否有任何最佳实践,或者是否应逐案解决?
【问题讨论】:
-
您是否尝试过使用 Mathf.Min(float a, float b); 设置动态限制位置(如果不是速度) ?你能解释一下,为什么你对只玩速度如此感兴趣,即给予反速度或负速度来阻止船移动?
-
在许多组件设计中,其传统的做法是使用“速度”组件来控制对象的运动。如果你喜欢你可以把它想象成一个“movementController”组件。我不太清楚“动态设置”是什么意思,但根本问题是我们基本上有两个独立的组件试图产生相反的效果。一种不可阻挡的力量/不可移动的物体场景。速度/边界只是这类问题的一个例子。也可能是两个单独的组件试图将精灵更改为不同的颜色。
-
我有一个解决方案,但在此之前我需要询问您是否可以选择在项目的此时重构这两个组件的代码?
标签: c# overriding components