Introduction to C++ Programming in UE4 阅读笔记

发表于2016-01-15
评论2 692浏览

四大基类:UObject, AActor, UActorComponent, UStruct

 一、UObject:最基本的构建基类

 UObject + UClass 提供了最主要的服务:

  属性和方法的映射(Reflection of properties and methods)

  属性的序列化(Serialization of properties)

  垃圾回收(Garbage collections)

  根据name找到UObject(Finding UObjects by name)

  可配置的属性值(Configurable values for properties)

  属性和方法的网络支持(Networking support for properties and methods)

  每个UObject的导出类都会自动创建一个单独的UClass,里面包含了关于实例的所有元数据(meta data)。UObject和UClass是一个游戏对象(gameplay object)在它生存时间内做的任何事情的根源(UObject and UClass together are at the root of everything that a gameplay object does during its lifetime)。帮助我们区别UClass和UObject之间的不同地方的途径是,UClass是描述了一些东西,比如一个UObject实例长什么样子,什么属性是可以被序列化的,网络相关的东西等等。大多数游戏开发工作都不会直接从UObject继承,而是使用AActor或UActorComponent。为了写游戏代码,开发者不必知道UClass/UObject的工作细节,不过知道有这两个东西存在还是有好处的。 

二、AActor:

  AActor的对象,是游戏体验中的一部分。AActor对象可以被关卡设计者放置到关卡中,或者在运行时通过游戏系统创建。所有继承于AActor的类的对象都可以放置在一个Level中,例如AStaticMeshActor,ACameraActor, APointLight .AActor从UObject派生,所以它可以享受前一节提到的所有服务。AActor可以通过游戏代码(c++/蓝图)显式地回收,或者当它所属的Level对象被移除时通过标准垃圾回收机制回收。AActor负责游戏对象的高级行为。同时,AActor也是网络服务中可以被重用的对象的基类(AActors are also the base type that can be replicated during networking?)。在网络应答期间,AActor还可以为所有需要网络支持的AActor里的UActorComponent对象分发信息。

  虽然AActor拥有自己的行为(特别是通过继承得到的),但是它也可以作为UActorComponents层级的容器(特别是通过组合的)。这是通过AActor的RootComponent组件来完成的,它包含了一个UActorComponent,

当然,也可以包含很多个。在AActor对象被放置在Level里面之前,AActor必须至少包含一个USceneComponent对象来保证AActor能进行平移,旋转,缩放操作。

  在AActor的生存周期里,有一系列事件会被调用。下面的事件列表简单地表明它的生存周期。

  BeginPlay——当对象第一次进入游戏实体时被调用

  Tick——随着时间的流逝,每帧被调用一次

  EndPlay——当对象离开游戏空间时被调用

运行时的生命周期:

  上面我们已经讨论过AActor的生命周期的一部分内容。Actor对象们是被放置在一个level里面的,所以很容易想象到:actor对象是进入level实体是被加载,然后在level被卸载时actor就被销毁(destroyed)。那么在运行时的创建和销毁是怎么运行的呢?Unreal Engine 把AActor的创建称为运行时生成(runtime spawning)。在游戏里面,生成Actor对象比创建普通对象复杂一点点。因为AActor对象需要在各种运行时系统(runtime systems)里面注册,来保证它所需要的服务。例如,Actor对象的初始位置和初始角度要被设置,因为物理相关的部分要知道这些;一个manager需要知道某个actor对象,因为它负责调用actor对象的tick()方法。类似的例子还有很多。基于以上原因,我们(Unreal Engine)为生成Actor对象提供了一个方法,UWorld::SpawnActor()。在下一帧Actor对象成功生成后,它的BeginPlay()方法会被调用,随后,Tick()方法在下一帧开始被调用。

  当actor对象没有存在的意义后,你可以调用Destroy()方法来干掉它。在销毁过程中,EndPlay()方法会被调用,在里面你可以做一些自定义的销毁逻辑。用Lifespan属性(InitialLifeSpan)可以控制actor对象的生存时间。你可以在对象的构造方法里面设置它的生存时间,或者已通过一些其他的代码。当生存时间用完,actor对象会自动地调用Destroy()方法。

 三、UActorComponent:

  UActorComponent对象拥有他们自己的行为,通常负责不同类型AActor间作交流的功能。例如,提供可视化的静态网格,例子效果,镜头透视,还有物理交互。在游戏中,AActor通常为全部角色提供高级关系目标,UActorComponent通常执行一些独特的任务,来支持那些更高级的目标。Components也可以附加在其他Components之上,还可以作为Actor对象的根组件(RootComponent)。一个Component只能从属于另一个Components或Actor,但它可以被很多Components所依附。可以把Components想象成一棵树的结构。子Component的位置,角度,缩放等属性是相对于它的父Component或者Actor的。

  可以通过很多种途径来使用Actor和Component。其中一种想象Actor和Component之间关系的想法是,Actor可以告诉你,这个是什么东西。而Components可以告诉你,这个东西是由什么构成的。

  RootComponent - 这是AActor的一个属性,表明这个Component位于AActor的组件树中最高一层。

  Ticking - AActor每Tick()一次,它拥有的所有Component都会跟着Tick()一次。

 四、UStruct:

  想使用UStruct,你不需要继承任何特殊的类,只要用USTRUCT()标记一个结构体,然后构建工具便会帮你做完底层的工作了。不像UObject,UStructs没有垃圾回收机制。如果你动态创建了它的实例,你需要自己管理他们的生存周期。UStructs的工作是,在Unreal Editor,使用蓝图,序列化,网络支持等等机制之间,处理古老的数据类型以便于支持UObject的反射机制。

  想要更快了解最新资讯,想要专业人员指导,想要丰厚的奖品,想要认识更多志同道合的小伙伴,可以加入我们的核心用户Q群:484290331

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

2个评论

  • 毛豆小弟 2016-01-16 1楼
    阅读笔记 棒棒的
  • 苏慈 2016-01-16 2楼
    文章很赞,谢谢分享