Aery的UE4 C++游戏开发之旅(1)基础对象模型

引擎版本:Unreal Engine 4.22网络

UObject

UE4的最基础类型是UObject,它提供了以下功能:编辑器

  • GC机制(垃圾回收机制)
  • 引用自动更新
  • 运行时类型识别
  • 反射机制
  • 序列化
  • 自动检测默认变量的变动
  • 属性自动初始化
  • UE4编辑器的自动整合
  • 网络复制
  • ...

这样当咱们编写须要使用以上功能的类时,继承一下UObject便可。
后面要讲的Actor和Component即是这样作的。ide

更多功能或细节,可参考源文件Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h函数

Actor种类

每一个游戏引擎都会有一个很是重要的游戏对象类型,在cocos2d-x里是Node(节点),在Unity3D里是GameObject(游戏对象),而在UE4里,这个重要的角色则是Actor(演员)。学习

可能在UE4引擎设计者的眼里,游戏世界是一个舞台,把各个Actor放置在舞台上面,便能展示出一出好戏。this

在UE编辑器的World Outliner窗口能够看到当前场景的全部Actor实例:设计

AActor

AActor类是能够放到游戏场景中的游戏对象的基本类型,另外它更强大的能力是能够挂载组件(Component)。
组件提供功能,想让一个实体Actor拥有更多的功能就能够经过挂载不一样的组件实现。3d

能够看到AActor继承于UObject,而后再派生出各式各样的Actor类(例如APawn)。这是由于舞台须要放置各式各样的演员,而在UE4的世界观里,演员不只包含游戏世界里的角色、NPC、载具,还能够是一间房子、一把武器、一个掉落的苹果,甚至一个抽象的游戏规则、看不见的玩家控制器...code

你若是想放置任何有实质做用的东西到游戏场景中,应该继承AActor类。

APawn(可操控单位)

简单来讲,APawn类是一个表明可被控制的游戏对象(玩家角色、怪物、NPC、载具等),它继承于AActor。
对于开发者,每次建立Pawn都得从Pawn类继承,而后写各类各样的实现/添加各类各样的组件。
因而UE4提供了几个派生类做为模板,以便快速编写本身的Pawn。

  • ADefaultPawn (默认的可操控单位)

    DefaultPawn继承于APawn,是一个默认的Pawn模板。它默认带了一个DefaultPawnMovementComponent、SphericalCollisionComponent和StaticMeshComponent。

  • ASpectatorPawn(观察者)

    SpectatorPawn继承于APawn,是适用于观战的Pawn模板,拥有摄像机“漫游”的能力。它实际就是提供了一个基本的USpectatorPawnMovement(不带重力漫游),并关闭了StaticMesh的显示,碰撞也设置到了“Spectator”通道。

  • ACharacter(角色)

    Character继承于APawn,是一个包含了行走,跑步,跳跃以及更多动做的Pawn模板。它含有像人同样行走的CharacterMovementComponent,尽可能贴合的CapsuleComponent,再加上骨骼上蒙皮的网格。

AController(控制器)

AController继承于AActor,Controller经过接受玩家的设备(键盘、鼠标等)输入或者被AI输入来控制Pawn。实际上一个Pawn能够被多个Controller操控(例如载具可由一个玩家驾驶,另外一个玩家操控车顶机枪),也能够切换Controller(例如,完成一段剧本演出时,玩家不能控制主角,而交由剧本脚本控制。)

  • APlayerController(玩家控制器)

    APlayerController继承于AController,负责接受玩家设备输入从而控制Pawn,它提供了Camera(控制玩家视角)、设备输入处理、关联UPlayer、显示HUD等功能、切换Level...

  • AAIController(AI控制器)

    AAIController继承于AController,负责提供AI从而控制Pawn,它提供了导航网格寻路、AI行为树、Task系统...

AGameMode(游戏模式)

AGameMode继承于AActor,这是一个很重要的类。由于一个GameMode定义了游戏的规则(例如如何得分或者其余方面的系统逻辑内容),咱们常常须要继承于它编写本身游戏的全局规则/全局游戏逻辑。
因为游戏逻辑规则每每是单例的,咱们能够经过UGameplayStatics::GetGameMode这个静态函数来获取GameMode的实例:

AMyGameMode* MyGameMode;
   //获得本身定义的AMyGameMode实例
   MyGameMode = Cast<AMyGameMode>(UGameplayStatics::GetGameMode(this));

此外GameMode默认是不打开每帧调用Tick事件的,这里我就被坑了下。

AHUD(HUD)

AHUD继承于AActor,它是平面显示界面,就是平时咱们玩3D游戏提供给玩家的2D菜单界面。AHUD类提供了渲染文字、贴图、矩形和材质的渲染,建立后也能够经过蓝图来编辑界面。

...

Component种类

随意点击一个Actor,能够查看该Actor的全部Component(组件):

UActorComponent(基本组件)

UActorComponent继承于UObject,是最基本的组件类型。不过须要注意的是,它没有Transform,也没有提供嵌套包含其余Actor组件的功能。
这是由于在UE看来,Actor并不仅是3D世界中的表示,一些不在世界中展现的“不可见对象”也能够是Actor,好比AInfo等,因此这些Actor的组件也就没有自带Transform了。

USceneComponent(场景组件)

继承于UActorComponent,它封装了Transform来表示其位置。因此须要位置表示的Actor就能够向Actor中添加SceneComponent做为其RootComponent(例如APawn就自动建立了SceneComponent)。
与此同时,得益于Transform(能够计算相对位置),SceneComponent能够容许嵌套包含其余Actor组件(例如一我的体组件包含身体组件,一个身体组件又能够包含手组件)。

实际中大部分的Actor是有Transform的,因此咱们会常常设置获取它的坐标。常理来讲,咱们的须要先获取下SceneComponent,而后才能操做其Transform等相应接口。可是这样太过繁琐,所以UE为咱们直接提供了基于Actor的接口,如(Get/Set)ActorLocation,但其实这些接口内部也是转发到RootComponent的。
同理,Actor能接收处理Input事件的能力,其实也是转发到Actor内部的UInputComponent* InputComponent;

UChildActorComponent(子演员组件)

继承于USceneComponent,提供了Component之下再叠加Actor的能力,担负着Actor之间互相组合的胶水。这货在蓝图里静态存在的时候其实并不真正的建立Actor,而是在以后Component实例化的时候才真正建立。

UStaticMeshComponent(静态网格组件)

继承于USceneComponent,是一个静态网格组件,也就是提供一个静态网格物体的渲染效果/物理碰撞等。

...

总结

实际上,UE4的Actor-Component系统就与Unity3D的GameObject-Component系统很类似。
一个游戏场景里摆放若干个演员(Actor),每一个演员虽然空无一物(没穿衣服),可是能够经过给它添加不一样的服饰、台词等(Component)从而展示出不少不一样的性质,从而呈现出一款精彩的游戏舞剧。

而Actor的各类派生类实际上只是Acotr加上提早准备好这些特定的服饰台词,简单来讲就是提供一种特殊演员的模板。

简要的UObject-Actor-Component UML类图:

参考


博主最近在经过UE4捣弄关于地形生成的DEMO,顺便学习UE4,所以接下来还会有几篇UE4笔记和地形生成研究的博客,敬请期待:)

至于博客的标题,算是致敬笨木头前辈的《cocos2d-x游戏开发之旅》吧。

系列其余文章:Aery的UE4 C++开发之旅系列文章

相关文章
相关标签/搜索