让我们从一个简单的面向对象的场景开始。

传统的游戏对象往往被视为:对象=数据+行为+展示

所以一个 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 更纯粹和简单。如果你感兴趣,欢迎与我交换想法。