跳到主要内容

引子

让我们从一个简单的 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 的"对象状态机中心主义",即对象不拥有世界事实,对象不能持有裁决权,发展到最后,对象本身就会越来越"薄",真正变厚的是事件流、行为组合、裁决机制。


相关阅读