目标很简单:我想在我的游戏中实现状态效果,这些效果会影响各种游戏相关的事情,如伤害量、健康值、速度或背包大小。自然地,伤害、健康、移动等都是由不同的组件处理的,所以这使事情变得复杂了。我尝试了几种方法,但都感觉不满意,而且使用起来有点笨拙。我的第一种解决方案是仅仅创建一个单独的MonoBehavior组件来存储对象积累的所有修改器,按照几个类别进行分类,并由其他脚本在对象上使用它来改变值。这样做使事情变得容易控制、编写和测试。从游戏中的任何其他事件中添加新的模块是一种非常标准化的轻松过程,我只需获得对容器组件的引用,然后将模块类扔进它;它将自动使用它。但是,它在使用过程中感觉有点笨拙,我需要确保在需要它时不忘记通过组件传递值。感觉像“忘记添加应用模块的代码行”错误的等待之中。另外,还有额外的依赖性和对修改器容器的引用,这感觉也不太整洁。我的第二种解决方案是用包装类来替换字段,包装类可以直接存储模块。感觉像一个不依赖的、更可靠的解决方案,但它的缺点几乎与“专用存储组件”的好处相反。我无法轻松地添加或查看模块,而且我无法将它们泛化添加,因为现在要添加模块,我需要获得一个特定、上下文相关的字段的直接引用。即使是接口也不能真正解决问题(除了污染类中额外的函数),因为接收模块的对象可能有多个可以被修改的组件。从模块堆栈中删除特定的模块(例如,如果它是由可穿戴物品产生的)也变成了一个日志学上的困难,因为现在有许多单独的堆栈。那么,如果模块是临时的,需要在一段时间后删除自己呢?模块的副本可能不会同步删除自己,从而引入无法追踪的游戏问题…… ……到目前为止,我仍然倾向于回到我的第一种实现,尽管它感觉从编程角度来说“不正确”。也许有办法将两种方法结合起来?有一个集中化的“中心”来处理对象的修改器,同时也使各种字段可以自动连接到它并改变它们的值?
关于实现修改器机制架构需要一些建议。
评论 (0)