引擎版本:Unreal Engine 4.22

UObject

UE4的最基础类型是UObject,它提供了如下功能:

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

这样当我们编写需要使用以上功能的类时,继承一下UObject即可。

后面要讲的Actor和Component便是这样做的。

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

Actor种类

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

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

在UE编辑器的World Outliner窗口可以看到当前场景的所有Actor实例:

AActor

AActor类是可以放到游戏场景中的游戏对象的基本类型,另外它更强大的能力是可以挂载组件(Component)。

组件提供功能,想让一个实体Actor拥有更多的功能就可以通过挂载不同的组件实现。

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

你如果想放置任何有实质作用的东西到游戏场景中,应该继承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++开发之旅系列文章

Aery的UE4 C++游戏开发之旅(1)基础对象模型的更多相关文章

  1. Aery的UE4 C++游戏开发之旅(3)蓝图

    目录 蓝图 蓝图命名规范 蓝图优化 暴露C++至蓝图 暴露C++类 暴露C++属性 暴露C++函数 暴露C++结构体/枚举 暴露C++接口 蓝图和C++的结合方案 使用继承重写蓝图 使用组合重写蓝图 ...

  2. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  3. Aery的UE4 C++游戏开发之旅(2)编码规范

    目录 C++基础类型规范 命名规范 头文件规范 字符串规范 字符集规范 参考 C++基础类型规范 由于PC.XBOX.PS4等各平台的C++基础类型大小可能不同(实际上绝大部分都是整型类型的大小不同) ...

  4. Aery的UE4 C++游戏开发之旅(5)字符&字符串

    目录 TCHAR 字符 使用TEXT()宏包裹字符串字面量 转换字符编码 FString 字符串 FString 剖析 FString 使用 FName 字符串 FName 剖析 FName 使用 F ...

  5. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  6. 《cocos2d-x游戏开发之旅》问题2016-10-7

    今天按书上做,遇到问题卡住了 书P115 项目是 littlerunner

  7. Cocos2d-x 3.x游戏开发之旅 笔记

    #include "HelloWorldScene.h"#include "SimpleAudioEngine.h"#include "MyHello ...

  8. HTML5 Canvas游戏开发(一)基础知识

    一.绘制基本图形 在每次用canvas画布时,都有几步是“套路” 1.在HTML中创建Canvas画布: <canvas id="mycanvas" width=" ...

  9. Cocos2d-x手机游戏开发必备C++语言基础

    http://edu.51cto.com/course/course_id-1380-page-1.html

随机推荐

  1. C标准输入输出库

    这样的代码有什么问题? char c; while((c = getchar()) != EOF) ... 首先,保存getchar的返回值的变量必须是int型.EOF是getchar返回的“超出范围 ...

  2. [学习笔记] [数据分析] 01.Python入门

    1.安装Python与环境配置 ① ② 安装pip以及利用pip安装Python库 2.Anaconda安装 conda list 要在root环境下 3.常用数据分析库 ① Numpy 安装:con ...

  3. 56岁潘石屹生日当天宣布要学编程语言Python,网友:地产商来抢码农饭碗了!

    最近在码农界里,一个比较轰动的事情,就是地产大佬潘石屹,在56岁生日当天宣布要学习编程语言Python. 可能部分老铁不认识潘石屹,简单介绍下大佬背景: 潘石屹,1963年11月14日出生于甘肃天水, ...

  4. .Neter所应该彻底了解的委托

    本文将通过引出几个问题来,并且通过例子来剖析C#中的委托以及用法,做抛砖引玉的作用 对于委托我发现大部分人都有以下问题,或者可能在面试中遇过这样的: 委托是不是相当于C/C++的函数指针? 委托究竟是 ...

  5. Spring Boot 最简单整合Shiro+JWT方式

    简介 目前RESTful大多都采用JWT来做授权校验,在Spring Boot 中可以采用Shiro和JWT来做简单的权限以及认证验证,在和Spring Boot集成的过程中碰到了不少坑.便结合自身以 ...

  6. UIContainerView纯代码实现及原理介绍

    UIContainerView纯代码实现及原理介绍 1.1-在StoryBoard中使用UIContainerView 1.2-纯代码使用UIContainerView 1.3-UIContainer ...

  7. Python爬虫之cookie的获取、保存和使用【新手必学】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:huhanghao Cookie,指某些网站为了辨别用户身份.进行ses ...

  8. 笔记||Python3之面向对象

    面向对象编程:简称OOP. 是一种程序设计思想.oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 在python中,所有数据类型都可以视为对象,也可以自定义对象.自定义的对象数据类 ...

  9. 小白学 Python 爬虫(21):解析库 Beautiful Soup(上)

    小白学 Python 爬虫(21):解析库 Beautiful Soup(上) 人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前 ...

  10. 201871010119-帖佼佼《面向对象程序设计(java)》第十四周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...