让我们从一个简单的面向对象的场景开始。
传统的游戏对象往往被视为:对象=数据+行为+展示
所以一个 Enemy:
- 有 HP
- 有 AI
- 有动画
- 有效果
- 有运动
- 有状态机
最终它会变成一个 自包含的宇宙。
Causality-Oriented认为 对象不拥有世界事实。对象只拥有行为和展示能力,但世界事实不属于对象。世界事实属于 因果层。
这项转变会在架构层面上解散权威。
例如, 一个角色并不“拥有”它的 HP。权威的 HP 值是由损伤事件和因果层中的判定规则派生出来的。角色对象只是读取权威值并对其反应。
这使得很多混乱的设计问题变得突然清晰。一个很好的例子就是为什么死亡序列经常变得混乱。
传统思维:
Enemy.dead = true
Enemy.playDeath()
Enemy.disableCollision()
Enemy.remove()
死亡变成 状态、动画、生命周期和场景管理都在一起。
在因果层面:
因果层:
fatal_damage_taken
emit die
感知层:
receive die
play death sequence
receive remove_entity
clean up entity
一旦因果层判定了结果,事实就被建立了。然后可以从中衍生出一条链条:死亡事件、复仇被动、任务完成等等。感知层只负责如何呈现这些事实。
因果链条保持明确和完整。
在传统的游戏开发中,进展经常分散在一个对象接着一个对象。随着时间的推移,每个对象都会积累复杂的回调逻辑,且因果性会散布在方法和副作用中。变得难以看出游戏状态的实际叙述。
例如:
Buff modifies AttackSpeed
AttackSpeed affects Animator
Animator changes HitTiming
HitTiming shifts ComboWindow
最后,谁实际上造成了什么也无法明确回答:
Causality-Oriented推动开发者朝着:
>原因—>事件—>状态转换—>投射
因果性必须变得明确。这是它最强大的品质,因为 可维护性本质上是因果透明。
这个模型也有一个隐含的优势。它自然清晰了团队边界:
- 艺术家、动画师和引擎程序员关注展示
- 系统设计师关注事件组合和规则
- 游戏程序员关注将事件连接到展示
边界变得更加清晰。很多大型项目在开发中晚期都会崩溃,因为 太多不同的代码片段悄悄地修改世界事实。
Causality-Oriented弱化了传统面向对象的本能将一切都集中在对象本地的状态机上。对象不拥有世界事实,并且不拥有判定权威。随着时间的推移,对象变得更薄,而事件流、行为组合和判定机制变得更丰富。
嗨,我是软件架构师。正在尝试提出一种新的游戏代码组织方式,它比 ECS 更纯粹和简单。如果你感兴趣,欢迎与我交换想法。
评论 (0)