UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍相关的知识,希望对你有一定的参考价值。

前言

在UE4中,很多C++类或者说是游戏性对象都会继承自这四个类,此文旨在简单介绍此四个类分别是干什么的以及有什么特点,后续有机会再深入学习-----

UObject

UE4本身的一套系统让UE4的C++比普通的C++多了很多功能,其中最基本的类,也就是U++的对象类,UObject便结合UClass提供引擎中最重要的若干基础服务:
使得UE4中的C++拥有了C#相似的面向对象高级特性

  • 属性和方法反射
  • 属性序列化
  • 垃圾回收
  • 按命名查找UObject
  • 可配置属性数值
  • 属性和方法网络支持
    派生自UObject的每个类拥有一个为其创建的单例UClass,此对象包含关于类实例的所有元数据。UObject和 UClass是游戏性对象在其生命期中执行所有操作的根源。多数的游戏性开发不会直接从UObject进行派生,而从AActor和UActorComponent进行派生。编写游戏性代码无须了解UClass/UObject的工作细节。但了解这些系统的存在也会有所帮助。

AActor

AActor是作为游戏体验一部分的对象。AActor将被设计师放置在关卡中,或通过游戏性系统在运行时创建。所有可放入关卡的对象均延展自此类。范例有AStaticMeshActor ,ACameraActor和APointLightactor。AActor派生自UObject,因此可使用上一部分列出的所有标准功能。可通过游戏性代码(C++或蓝图)显式销毁AActor。
拥有关卡从内存被卸载后,通过标准垃圾回收机制进行销毁。
AActor负责游戏对象的高级行为。AActor还是可进行网络复制的基类。在网络复制中,AActor还可分布UActorComponent 的信息。UActorComponent为需要网络支持的AActor所拥有。
AActor拥有其自身的行为(通过继承的特殊化),但它们仍作为UActorComponent 层级的容器(通过合成的特殊化)。这通过AActor的RootComponent成员完成。此成员包含一个单一UActorComponent,而这个组件又可依次包含其他组件。在AActor可被放入关卡之前,它必须包含至少一个USceneComponent。此组件包含此 AActor的平移、旋转和尺寸。
这是我们用的可以说是最多的类了,而且每当此类被创建,我们可以在代码中看到三个方法

  • BeginPlay :对象首次出现在游戏进程中时调用。相当于Unity的Start
  • Tick :每帧调用一次,在一段时间内执行操作。相当于Unity的Update
  • EndPlay :对象离开游戏进程时调用。

UActorComponent

UActorComponent即相当于组件,而且继承此类的实现可以在蓝图中的AddComponent中看到,他们都是拥有自己特定功能的组件,通过添加组件的组合,可以很好的制作成不同的游戏对象,Unity也是这么做的,如图

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

UStruct

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

简单的生命周期介绍

之前我们讨论了AActor生命周期的一个子集。

  • BeginPlay :对象首次出现在游戏进程中时调用。相当于Unity的Start
  • Tick :每帧调用一次,在一段时间内执行操作。相当于Unity的Update
  • EndPlay :对象离开游戏进程时调用。
    对于放置在关卡中的Actor而言,通过想象便可轻松理解生命周期: Actor 加载,出现,随后关卡被卸载,Actor被销毁。
    运行时创建和销毁的过程是怎样的?UE4在运行时生成调用AActor的创建。较之于在游戏中创建一个普通对象,Actor 的生成稍显复杂。原因是AActor需要通过各种运行时系统进行注册,以满足所有需要。需要设置Actor的初始位置和旋转。物理可能需要知晓这些信息。负责告知Actor进行tick的管理器需要知晓这些信息。诸如此类。
    因此,我们拥有一个用于Actor生成的方法:UWorld::SpawnActor()。一旦Actor成功生成后,它的BeginPlay()方法将被调用,下一帧将出现Tick()。
    一旦Actor的生命期完结,即可调用Destroy()将其销毁。在此过程中将调用EndPlay(),在此可设置自定义销毁逻辑。控制Actor存在时长的另一个选项是使用寿命成员。可在对象的构建函数中设置时间段,或通过运行时的其他代码进行设置。时间量耗尽后,Actor将自动调用Destroy()。

UE4第三人称模板的组件剖析

当我们用第一人称FPS模板创建成功工程文件后,我们打开人物的蓝图,可以看到他的组件排列情况如下图
RootComponent为CapsuleComponent。附着到CapsuleComponent 的是 ArrowComponent、Mesh组件和FirstPersonCameraComponent。以“FirstPersonCameraComponent”为父项的“Mesh1P”组件,意味着第一人称网格体与第一人称摄像机相对

3D中效果如下

此组件树被附着到一个Actor类。从此例中可了解到:使用继承和合成可构建复杂的游戏性对象。
需要对现有AActor或 UActorComponent进行自定义时使用继承。也就是继承AActor在C++层次实现很多功能。
需要多个不同AActor类型共享功能时使用合成。即添加UActorComponent即组件快速得到某功能。

结束!如果觉得我写的还不错,不要吝啬一个赞奥,这是对我的最大支持了,谢谢大家,下篇再见!

以上是关于UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路1-C++和蓝图的关系和介绍

UE4 C++入门之路5-热重载Compile(编译项目的三种方式)

UE4 C++入门之路5-热重载Compile(编译项目的三种方式)

UE4 C++入门之路3-C++和蓝图的互相调用

UE4 C++入门之路2-C++中的UPROPERTY宏详解