在虚幻引擎中,Actor是构成游戏世界最根本的“物体”。几乎所有你能在游戏关卡里看到、触摸到、或者与之进行交互的对象,比如角色、光源、声音、障碍物等,本质上都是Actor。
可以把Actor理解为一个带有位置信息的功能容器。它本身不负责具体功能,而是通过挂载不同的 “零件” ,也就是组件,来获得视觉外观、物理碰撞、声音播放等能力。
![图片[1]-什么是虚幻引擎Actor-虚幻引擎](https://test.xuhuanyinqing.com/wp-content/uploads/2026/06/虚幻引擎Actor.jpg)
🧩 Actor与组件:主体与零件的构建
Actor和组件的关系,就像一辆汽车(Actor)和它的零件(组件)。
-
UActorComponent(Actor组件):这是最基础的组件类型,本身没有三维空间位置(Transform),适合用来挂载一些抽象的行为或数据,比如角色的属性(生命值)、背包系统、移动逻辑等。 -
USceneComponent(场景组件):它拥有三维空间位置。有位置就可以被附加到其它组件上,形成层级关系。Actor自身的世界位置,就是由挂载在它下面的“根组件”(RootComponent)决定的。一个Actor至少需要一个USceneComponent或其子类作为根组件,才能在场景中确定位置。 -
UPrimitiveComponent(图元组件):这是USceneComponent的子类,不仅拥有位置,还具有可视化的“形状”和物理碰撞属性。比如用来显示模型的静态网格体(Static Mesh)组件、骨骼网格体(Skeletal Mesh)组件,以及用于碰撞检测的盒体碰撞(Box Collision)组件。
通过组合不同的组件,可以创造出各种功能的Actor。例如,一个“金矿石”Actor可以这样构建:
-
根组件 (
SceneComponent):在场景中为整个Actor提供一个基础位置。 -
静态网格体组件 (
StaticMeshComponent):依赖根组件的位置,呈现金矿石的3D模型。 -
粒子系统组件 (
ParticleSystemComponent):附加在金矿石上,产生闪烁的光效。 -
音效组件 (
AudioComponent):附加在金矿石上,播放环绕的金属声。 -
盒体碰撞组件 (
BoxComponent):附加在金矿石上,当玩家触碰到这个盒子时,触发“拾取”事件。
🧰 常见的Actor类型
为了方便开发,虚幻引擎提供了许多继承自AActor的专用类型,下面是一些最常用的:
-
静态网格体Actor (Static Mesh Actor):用于放置不会形变的静态物体,是构建关卡环境、摆放道具的主力。
-
骨骼网格体Actor (Skeletal Mesh Actor):用于显示和驱动带有骨骼动画的模型,是创建玩家角色、怪物等动态生物的首选。
-
光源Actor (Light Actor):用于向场景中添加各种类型的光源,营造光影氛围和照明效果。
-
笔刷Actor (Brush Actor):用于在关卡中快速搭建简单的几何体(如立方体、圆柱体),常用于游戏原型设计和快速构建关卡雏形。
-
玩家出生点 (Player Start):定义玩家在关卡中开始游戏的位置和朝向。
♻️ Actor的生命周期:一个Actor的“生老病死”
每个Actor在关卡中都有其完整的生命历程,主要分为三个路径:
-
诞生(Spawn):这是动态创建Actor的路径。通过
SpawnActor函数触发。-
核心事件:
PostActorCreated(C++ Actor被创建) ->OnConstruction(蓝图构造脚本执行) ->PostInitializeComponents(所有组件完成初始化) ->BeginPlay(游戏逻辑正式开始)。
-
-
天生(Load from Disk):这是关卡中已放置Actor的路径。它们随关卡一同从磁盘加载。
-
核心事件:
PostLoad(Actor从磁盘加载完成) ->PostInitializeComponents->BeginPlay。
-
-
消亡(Destroy):Actor的销毁过程。无论是寿终正寝还是被手动销毁,都遵循此路径。
-
核心事件:
EndPlay(Actor即将从世界中移除) -> 标记为RF_PendingKill-> 等待垃圾回收。
-
⏱️ Tick事件:Actor的“心跳”
Tick事件是Actor每帧都会执行的更新函数,就像它的“心跳”。
-
使用:你可以在
Tick(float DeltaTime)函数中编写代码,让Actor执行持续性的逻辑,如移动、旋转、监测状态等。 -
性能:性能的关键在于“少即是多”。持续运行的Tick会消耗宝贵的CPU性能。如果某个Actor没有持续的行为逻辑,建议在C++中将
PrimaryActorTick.bCanEverTick设为false,或在蓝图中禁用“Start with Tick Enabled”,以优化游戏性能。
✨ Actor的生成与销毁
-
生成(Spawning):在C++中,使用
UWorld::SpawnActor()函数;在蓝图中,则使用“Spawn Actor from Class”节点。你需要在运行时指定Actor的类(Class)、生成位置(Spawn Location) 和旋转(Spawn Rotation)。 -
销毁(Destroying):在C++中调用
Actor->Destroy()函数;在蓝图中使用“Destroy Actor”节点。调用后,Actor会从关卡中移除,并被标记为待删除状态。
📞 Actor间的通信:如何“打电话”
在复杂的游戏中,不同Actor之间需要协同工作,虚幻引擎提供了多种通信方式。
| 通信方法 | 核心概念 | 适用场景举例 |
|---|---|---|
| 直接通信 | 获取A的引用,直接调用B的公开函数或变量 | 按下一个开关,直接控制它面前的那扇门打开 |
| 类型转换 | 获取一个通用类型的引用(如AActor*),将其尝试“转换”为特定类型(如MyCharacter*),成功后调用其特有函数 |
用射线检测到碰撞体,将其转换为AInteractiveObject*,然后调用它的Interact()函数 |
| 蓝图接口 | 定义一份“合同”(接口),多个不同类型的Actor共同履行这份合同(实现接口函数),调用方通过接口与它们通信,无需知道具体类型 | 玩家按下“交互”键,身边的门、NPC、宝箱都会做出不同的反应,但调用方式都是统一的Interact() |
| 事件分发器 | 类似于“广播”,一个Actor宣布某事发生,任何订阅了该事件的Actor都能收到通知并作出反应 | BOSS死亡后,“BOSS死亡”广播被触发,关卡门打开、播放胜利音乐、UI显示奖励 |
💻 C++与蓝图:两种Actor的使用方式
-
C++ (AActor):是所有Actor的根基,性能卓越,实现引擎底层功能,适合核心游戏逻辑和复杂算法。
-
蓝图 (Blueprint Actor):可视化脚本,上手快,迭代迅速,适合设计原型、配置数据和实现简单的游戏逻辑。
在实际开发中,最佳实践通常是用C++搭建稳健的“骨架”,用蓝图填充灵活的“血肉”。你可以创建一个C++ Actor基类,然后在蓝图中派生并完成具体的资源挂载和逻辑微调。
🎓 新手入门的最佳实践
对于开发者新手而言,可以参考这份Actor使用入门指南:
-
从继承开始:不要从零开始构建。根据你的需求,选择
AActor(需要完全自定义的对象)、AStaticMeshActor(静态物体)或APawn(玩家/NPC)作为父类。 -
优先使用组件:优先考虑用组件来实现功能。尽量在“构造脚本”或构造函数中完成组件的创建与附加,让Actor的结构从一开始就清晰明了。
-
管理Tick开销:遵循“非必要,不Tick”的原则。默认情况下,可以关闭新Actor的“Start with Tick Enabled”选项,仅在必要时开启。
-
掌握通信模式:根据通信关系的紧密程度选择合适的通信方式。比如,紧密的(门和开关)用直接通信;松耦合的(交互系统)用接口;一对多的(事件)用分发器。
感谢您的来访,获取更多精彩文章请收藏本站。








暂无评论内容