Actor,字面意思是演员,这个名词,用在引擎里表示可以 Spawn 到世界中的对象,感觉怪怪的,为什么不直接取名xx对象,不是更直观吗?比如SpawnObject?
Actor,字面意思是演员,这个名词,用在引擎里表示可以 Spawn 到世界中的对象,感觉怪怪的,为什么不直接取名xx对象,不是更直观吗?比如SpawnObject?
这个问题问得很好。"Actor"确实怪,但这个名字不是 Epic 随便取的,它背后有计算机科学传统和历史渊源。
1. 因为 “Object” 已经被占用了
UE 中真正的"万物之祖"是 UObject(所有能反射的类的基类)。
class UObject { ... }; // 根对象:材质、贴图、组件、甚至蓝图资产本身都是 UObject
class AActor : public UObject { ... }; // 能放进世界的对象
如果可放置对象叫 Object,那就和 UObject 重名了。所以 Epic 需要另一个词来区分:
UObject= 内存中的对象(编辑器资产、组件、数据结构)AActor= 世界中的对象(关卡里的实体)
2. “Actor” 来自计算机科学的「Actor 模型」
这是最关键的原因。
Actor Model(演员模型) 是 1973 年由 Carl Hewitt 提出的一种并发计算理论。它的核心思想:
系统中的每个实体都是一个 Actor,Actor 之间不共享内存,只能通过发送消息来通信。
Actor A Actor B
│ │
│── 发送消息 "攻击" ──→│
│ │
│←── 发送消息 "受伤" ──│
这和 UE 的设计惊人地相似:
| Actor 模型的概念 | UE 中的体现 |
|---|---|
| Actor 接收消息 | Event BeginPlay、OnOverlap |
| Actor 发送消息 | Cast、Get All Actors、Event Dispatch |
| Actor 独立运行 | 每个 Actor 有自己的 Tick |
| Actor 可以创建子 Actor | SpawnActor |
Epic 的创始人 Tim Sweeney 是计算机科学背景出身,UE1(1998 年)就采用了 Actor 这个术语,很可能直接受到了 Actor 模型的影响。
3. 戏剧/电影的隐喻
“Actor” 在英文里就是"演员"。从这个角度理解,它其实很贴切:
| 现实世界 | UE 世界 |
|---|---|
| 舞台(Stage) | 关卡(Level) |
| 导演(Director) | 游戏模式(GameMode) |
| 演员(Actor) | 场景中的实体(Actor) |
| 演员的道具 | Actor 的组件(Component) |
| 演员入场 | SpawnActor |
| 演员退场 | DestroyActor |
在这个隐喻里,关卡是一场戏,每个 Actor 都是一个有独立行为、能与其他 Actor 互动的表演者。
4. 其他引擎的命名对比
每个引擎选择了不同的词:
| 引擎 | 可放置对象叫 | 直观程度 |
|---|---|---|
| Unity | GameObject(游戏对象) |
⭐⭐⭐ 最直观 |
| Godot | Node(节点) |
⭐⭐⭐ 也很直观 |
| CryEngine | Entity(实体) |
⭐⭐⭐ 直观 |
| UE | Actor(演员) |
⭐⭐ 抽象,但有学术渊源 |
Unity 选择 GameObject 是因为它面向的是"游戏开发"这个具体场景,命名更平民化。
UE 选择 Actor 是因为它面向的是更底层的对象系统架构,命名更学术化。
5. 那为什么不用 SpawnObject?
UE 里确实有创建 UObject 的函数,叫 NewObject<T>()。而 SpawnActor 是专门针对 AActor 的:
// 在内存里创建一个 UObject(比如创建一个新的材质实例)
UMaterialInstanceDynamic* Mat = NewObject<UMaterialInstanceDynamic>(...);
// 在世界里创建一个 AActor(生成一个敌人)
AActor* Enemy = GetWorld()->SpawnActor<AEnemy>(...);
NewObject= 纯内存操作,和世界无关SpawnActor= 在世界中"诞生"一个实体,给它位置、赋予生命
如果把 AActor 叫 Object,那 SpawnObject 就会和 NewObject 混淆,无法区分"放进世界"和"内存分配"的区别。
总结
| 问题 | 答案 |
|---|---|
| 为什么不叫 Object? | 因为 UObject 已经占用了 |
| 为什么叫 Actor? | 来自计算机科学的 Actor 模型(并发消息传递) |
| 为什么不更直观? | UE 的命名偏学术/架构向,Unity 的 GameObject 更直观 |
| 这个名字合理吗? | 从"Actor 模型"和"戏剧隐喻"角度看,其实挺合理的 |
你可以把 Actor 理解为 “世界中的参与者” 而不是"演员",这样就好接受多了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)