引子
让我们从一个简单的 OOP 使用场景说起。
传统游戏对象通常是:对象 = 数据 + 行为 + 表现
于是一个 Enemy:
- 有 hp
- 有 AI
- 有动画
- 有特效
- 有移动
- 有状态机
最后变成一个自包含宇宙。
双世界理论认为:对象不拥有世界事实。 对象只拥有行为能力、表现能力。世界事实不能属于对象,世界事实属于因果层。
这是架构层面就带来的一种去中心化。
例如:角色并不"拥有"自己的血量。 真正的血量存在于因果层状态树。角色对象只是在需要变更血量的时候读取、对变化做反应。
这会让很多东西突然变得极其清晰,比如"死亡动画"为什么容易写乱?
传统思维:
Enemy.dead = true
Enemy.playDeath()
Enemy.disableCollision()
Enemy.remove()
死亡既是状态、又是动画、又是生命周期、又是场景管理——全缠一起。
双世界理论里:
因果层:
hp <= 0
emit die
感知层:
收到 die
播放死亡演出
收到 remove_entity
清理实体
因果层一旦做出裁决,这个事实就被确定,下发一连串死亡事件,复仇亡语,任务完成事件等,感知层只负责具体的呈现。
因果链是完整的,显式的。
传统游戏开发中,我们往往会将游戏过程的推进放到一个又一个的对象中,发展到最后,每个对象都承载着一堆复杂的回调逻辑,事件因果散落在不同的对象方法里,很难直观清晰的看到游戏事件的发展脉络。
例如:
Buff 修改 AttackSpeed
AttackSpeed 影响 Animator
Animator 改变 HitTiming
HitTiming 提前导致 ComboWindow 改变
最后没人知道:"到底是谁导致了什么?"
而双世界中天然会逼迫开发者:
cause → event → state transition → projection
因果必须显式化。这是它非常强的地方。因为可维护性的本质其实是因果透明。
这套体系还有个隐藏优势:它天然适合多人协作。因为:
- 美术/动画/引擎只管"编排动画"
- 系统策划只管"编排游戏事件"
- 程序员只管"衔接事件与动画"
边界会异常清晰。很多大型项目后期崩掉,其实就是:"所有人都在偷偷改世界事实。"
双世界理论天然在削弱传统 OOP 的"对象状态机中心主义",即对象不拥有世界事实,对象不能持有裁决权,发展到最后,对象本身就会越来越"薄",真正变厚的是事件流、行为组合、裁决机制。