UE4入门-常见的对象-概述

来源:互联网 发布:比特币交易平台 知乎 编辑:程序博客网 时间:2024/04/20 05:29

游戏性类:Object 、Actor 和 Component

多数游戏性类派生自4个主要类型。他们是 UObject 、 AActor 、 UActorComponent 和 UStruct
UObject 层级树之外创建的类的典型用法有:整合第三方库、封装操作系统特定功能等


虚幻对象(UObject)

虚幻引擎中的基础构建块被称作 UObject。此类结合 UClass 提供引擎中最重要的若干基础服务:

  • 属性和方法反射
  • 属性序列化
  • 垃圾回收
  • 按命名查找 UObject
  • 可配置属性数值
  • 属性和方法网络支持

派生自 UObject 的每个类拥有为其创建的单例 UClass,此对象包含关于类实例的所有元数据。UObject 和 UClass 是游戏性对象在其生命周期中执行所有操作的根源。区分 UClass 和 UObject 的最佳方式:UClass 描述 UObject 实例的组成、可同于序列化的属性、网络等。多数的游戏性开发不会直接从 UObject 派生,而是从 AActor 和AActorComponent 进行派生。编写游戏性代码无需了解 UClass/UObject 的工作细节。但了解这些系统的存在也会有所帮助


AActor

AActor 是作为游戏体验的一部分对象。AActor 将被设计师放置在关卡中,或通过游戏性系统在运行时创建。所有可放入关卡的对象均延展自此类。范例有 AStaticMeshActor 、 ACameraActor 和 APointLightActor。AActor 派生自 UObject,因此可使用上一部分列出的所有标准功能。可用过游戏性代码(C++或蓝图)显式销毁 AActor。拥有关卡(AActor所在的关卡)从内存被卸载后,通过标准垃圾回收机制进行销毁。AActor 负责游戏对象的高级行为。AActor 还是可进行网络复制的基类。在网络复制中,AActor 还可分布 UActorComponent 的信息。UActorComponent 为需要网络支持的 AActor所拥有。

AActor 拥有其自身的行为(通过继承的特殊化),但它们仍作为 UActorComponent 层级的容器(通过合成的特殊化)。这通过 AActor 的 RootComponent 成员完成。此成员包含一个单一 UActorComponent ,而这个组件又可依次包含其他组件。在 AActor 可被放入关卡之前,它必须包含至少一个 USceneComponent 。此组件包含此 AActor 的平移、旋转和尺寸。

AActor 拥有一系列事件,跨在生命周期中进行调用。以下列表是说明生命周期的简化事件集。

  • BeginPlay - 对象首次出现在游戏进程中是调用
  • Tick - 每帧调用一次,在一段时间内执行操作
  • EndPlay - 对象离开游戏进程是调用

运行时的生命周期

Actor 加载,出现,随后关卡被卸载,Actor 被销毁。
虚幻引擎在运行时生成调用 AActor 的创建。较之于在游戏中创建一个普通对象,Actor 的生成稍显复杂。原因是 AActor 需要通过各种运行时系统进行注册,以满足所有的需要。需要设置 Actor 的初始位置和旋转。物理可能需要知晓这些信息。负责告知 Actor 进行 Tick 的管理器需要知晓这些信息。诸如此类。因此,有一个用于 Actor 生成的方法:

UWorld::SpawnActor() 用于 AActor 的生成。一旦 Actor 生成后,它的 BeginPlay() 方法将被调用,下一帧将出现 Tick()

一旦 Actor 的生命周期完结,即可调用 Destroy() 将其销毁。在此过程中将调用 EndPlay(),在此可设置自定义销毁逻辑。控制 Actor 存在时长的另一个选项是 Lifespan 成员。可在对象的构造函数中设置时间段,或通过运行时的其他代码进行设置。时间量耗尽后,Actor 将自动调用 Destroy()


UActorComponent

UActorComponent 拥有其自身的行为,通常负责在多种类型 AActor 之间共享的功能,如提供可视网络体、粒子效果、摄像机透视和物理互动。通常为 AActor 指定的是与其在游戏中全局作用相关的高级目标,而 UActorComponent 通常执行的是支持这些高级目标的单个任务。组件也可以附着到其他组件,或为 Actor 的根组件。组件只能附着到一个父组件或 Actor,但可被多个子组件附着。一个组件树,子组件和父组件或 Actor 有相对的位置、旋转和尺寸。

使用 Actor 和 Component 的方法有多种,而理解 Actor - Component 关系的方式是:

Actor 会提出问题“这是什么”
Component 会回答“这是由什么组成的”

  • RootComponent - 这是在 AActor 组件树中拥有顶层组件的 AActor 成员
  • Ticking - 组件作为拥有 AActor Tick() 的部分被点击

剖析第一人称角色

以基于第一人称模板创建新项目时创建的蓝图为例:
下图是 FirstPersonCharacter Actor 的组件树。 RootComponentCapsuleComponent。附着到 CapsuleComponent 的是ArrowComponentMesh 组件和 FirstPersonCameraCompoment 。叶子最多的组件是以 FirstPersonCameraComponent 为父项的 Mesh1P 组件,以为这第一人称网格体与第一人称相机相对

视觉外观而言,组件树与下图相似,可看到除 Mesh 组件外的所有组件均在3D空间中

此组件树被附着到一个 Actor 类。从此例中可了解到 - 使用继承和合成可构建复杂的游戏性对象。需要对现有 AActor 或 UActorComponent 进行自定义时使用继承。需要多个不同 AActor 类型共享功能时使用合成


UStruct

使用 UStruct 是不必从任意特定类进行延展,只需要使用 USTRUCT() 标记结构体,编译工具将执行基础工作。和 UObject 不同,UStruct 不会被垃圾回收。如果创建其动态实例,则必须自行管理器生命周期。UStruct 为纯旧式数据类型。它们拥有 UObject 反射支持,以便在虚幻编辑器、蓝图操作、序列化和网络通信中进行编辑。


虚幻引擎的反射系统

这个就不搬运了,请移步凡事看本质大佬的博客主页,他对虚幻的反射机制做了很详细的剖析

原创粉丝点击