什么是虚幻引擎Actor

在虚幻引擎中,Actor是构成游戏世界最根本的“物体”。几乎所有你能在游戏关卡里看到、触摸到、或者与之进行交互的对象,比如角色、光源、声音、障碍物等,本质上都是Actor

可以把Actor理解为一个带有位置信息的功能容器。它本身不负责具体功能,而是通过挂载不同的 “零件” ,也就是组件,来获得视觉外观、物理碰撞、声音播放等能力

图片[1]-什么是虚幻引擎Actor-虚幻引擎

🧩 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在关卡中都有其完整的生命历程,主要分为三个路径:

  1. 诞生(Spawn):这是动态创建Actor的路径。通过SpawnActor函数触发。

    • 核心事件:PostActorCreated (C++ Actor被创建) -> OnConstruction (蓝图构造脚本执行) -> PostInitializeComponents (所有组件完成初始化) -> BeginPlay (游戏逻辑正式开始)

  2. 天生(Load from Disk):这是关卡中已放置Actor的路径。它们随关卡一同从磁盘加载。

    • 核心事件:PostLoad (Actor从磁盘加载完成) -> PostInitializeComponents -> BeginPlay

  3. 消亡(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使用入门指南:

  1. 从继承开始:不要从零开始构建。根据你的需求,选择AActor(需要完全自定义的对象)、AStaticMeshActor(静态物体)或APawn(玩家/NPC)作为父类。

  2. 优先使用组件:优先考虑用组件来实现功能。尽量在“构造脚本”或构造函数中完成组件的创建与附加,让Actor的结构从一开始就清晰明了。

  3. 管理Tick开销:遵循“非必要,不Tick”的原则。默认情况下,可以关闭新Actor的“Start with Tick Enabled”选项,仅在必要时开启。

  4. 掌握通信模式:根据通信关系的紧密程度选择合适的通信方式。比如,紧密的(门和开关)用直接通信;松耦合的(交互系统)用接口;一对多的(事件)用分发器。

感谢您的来访,获取更多精彩文章请收藏本站。

THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容