GamePlay的理解

GamePlay框架的理解

UE4的Gameplay框架是一套用于构建游戏逻辑和玩法的框架和工具集合。

UObject

UObject类的理解

UObject是所有其他类的基类
它提供了一些基本的功能,支持对象的生命周期、内存管理、属性管理和事件系统。继承他的类,都拥有这些功能。
它提供了一套反射系统,对于参与反射系统的数据,我们可以动态调用这些数据。
它提供了GC垃圾回收,程序运行时自动释放不再使用的内存资源,以便重用和回收内存空间。
它支持蓝图脚本编程

Actor

Actor类的理解

Actor类是Object的派生类。
其对象是可以被放置到场景(Level)中。
它是组件的容器。

我们所创建Actor的派生类(无论是蓝图派生类还是C++派生类),只要是Actor的派生类对象,都可以被放入关卡中。

口头所说的Actor的含义

口头所说的Actor有三种含义
第一种,是Actor类本身,Actor类是Object的派生类。所有想放入关卡中的对象,对象所在的类都必须继承Actor类。

第二种理解,就是Actor派生类,我们把这些Actor的派生类也称为Actor。

第三种理解,我们也把这些被放入关卡中的Actor派生类的对象,直接称作Actor
当我们提到Actor的时候,得根据情况区分是哪种含义。

Actor的继承结构

Component组件

Component的理解

Component类可以被添加到Actor中,作为Actor的一部分,为Actor提供能力。
一般与业务逻辑无关
可跨游戏使用

以汽车蓝图为例,汽车蓝图里的引擎、车轮这些基本单元,就是蓝图的组件,每一个组件都为汽车提供了一定的功能

Component的分类


Component可以分为两种,一种是SceneComponent,一种是ActorComponent.

SceneComponent是拥有Transform的Component,除了给actor提供功能,还能在游戏世界中存在。拥有Transform意思是它在游戏世界中有自己的位置,旋转,以及缩放,表明它一种在可以在场景中存在的组件。
SceneComponent可以互相嵌套

ActorComponent,只是给actor提供功能的模块,扩展Actor的功能
它没有ransform它通常在世界中是没有自己的位置和位置和变换信息的,只是作为Actor的一部分存在。
ActorComponent不可以互相嵌套的。

Component的举例

APawn

Apawn类的理解

Pawn类是Actor的派生类
Pawn类是具有控制器Actor类,其对象不仅可以放到场景中,也可以被控制器操控。 也就是说,Pawn可以接受外界的输入,并且做出一定的响应。
Pawn的派生类也是pawn

APawn的继承结构

ADefaultPawn的理解
是pawn的派生类。
是默认的带了DefaultPawnMovementComponent,
spherical CollisionComponent(球形碰撞组件),
StaticMeshComponent,这三个组件的pawn类

我们每次想自己搞Pawn都得从Pawn派生过来,然后再一个个添加组件。UE知道我们大家都很懒,所以提供了一个默认的Pawn

SpectatorPawn的理解
是ADefaultPawn的派生类
在ADefaultPawn类的基础上USpectatorPawnMovement(不带重力漫游组件)
关闭了StaticMesh的显示,碰撞也设置到了“Spectator”通道。
是一种观赛的pawn,玩家可以操控他进行观赛

ACharacter

ACharacter类的理解

ACharacter类是APawn的派生类
他是具有人形角色移动组件的Pawn,人形角色移动组件封装与人形角色移动相关的功能和数据。
其对象不仅可以放到场景中被控制器操控,通过角色移动组件,ACharacter对象还可以模拟人形角色的移动行为,包括行走、奔跑、跳跃等。

总的来说ACharacter类是继承自APawn类的派生类,里面封装着一些人形角色相关的属性和行为。开发者可以用ACharacter类创建各种游戏中的人形角色。

Controller控制器

Controller类的理解

Controller类是Actor的派生类
是用于控制角色的类。
它负责接玩家收输入、解析输入,然后根据输入去控制角色的移动、旋转和其他操作,来实现玩家与游戏世界的交互。

AController继承结构


APlayerController类的理解
是AController类的派生类。
APlayerController主要是接收玩家的输入,控制玩家角色

AAIController类的理解
AAIController主要接收AI输入,控制AI角色

APlayerState玩家状态

APlayerState类的理解

APlayerState类是AInfo的派生类
用于记录与玩家相关的状态和信息。
每个玩家在游戏中都会有一个对应的PlayerState对象与之关联,用于跟踪和存储该玩家的个人信息和游戏状态。

跟APlayerState相关的继承机构


APlayerState是生成在Level中的,跟Pawn和Controller是平级的关系。
Controller只是保存了APlayerState的指针

AGameState

AGameState的理解

AGameState类是AInfo的派生类。
主要是用来存储当前游戏的全局状态数据,包括关卡信息、玩家得分、时间等与游戏状态相关的数据。

继承结构

AGameMode

GameMode的理解

GameMode类是AIofo的派生类
是UE4的游戏规则类,主要是用来定义一些游戏规则和游戏玩法。 比如当前游戏游戏的胜利条件等。

GameMode和Level Blueprint的区别

GameMode应该专注于游戏玩法的逻辑的实现
LevelScriptActor应该专注于本Level的逻辑,比如改变Level内某些Actor的运动轨迹,或者某一个区域的重力,或者触发一段特效或动画。

ULevel

ULevel的理解

是UObject的派生类
它是Actor的容器
Level是指游戏中的一个独立场景或地图,这个独立场景可以包含各种场景元素、地形、静态和动态物体、灯光、粒子效果等。
他是构成World的版块
资源上对应.umap,*

ALevelScriptActor类的理解

是Actor的派生类
每个Level都可以包含一个ALevelScriptActor
ALevelScriptActor主要是用来实现Level的逻辑
ALevelScriptActor可以理解为是Level的蓝图脚本,正如每个Actor可以支持蓝图脚本编写,ALevelScriptActor就是level的蓝图脚本

UWorld

UWorld的理解

World是指整个游戏世界的容器
它是一个高级别的容器,用于管理和组织游戏中的各个关卡、角色、物体、碰撞检测、事件处理等。
它包含了所有的关卡(Level)
通过UWorld,开发者可以管理游戏中的所有关卡,进行关卡的切换、加载和卸载。
还包含了其他一些全局游戏相关数据。
World还负责管理全局性的操作。 包括时间流逝、物理模拟、碰撞检测等。

Persistent Level的理解

每个World支持一个PersistentLevel和多个其他Level
Persistent Level可以被看作是整个世界的主要关卡,它在整个游戏过程中保持存在,它通常包含了游戏中的常驻元素,比如地形、主要角色、重要的游戏逻辑等。
其他的关卡,例如过渡关卡或临时关卡,可以在游戏过程中被加载和卸载。

WorldContext

world的类型

World就不是只有一种类型,比如编辑器本身就也是一个World,里面显示的游戏场景也是一个World,这两个World互相协作构成了我们的编辑体验。然后点播放的时候,引擎又可以生成新的类型World来让我们测试。

WorldContext的理解

它是存储着当前世界的上下文信息的结构体,例如当前世界的引用、游戏模式、游戏状态等。
切换世界时,它会保存切换过程中的信息和目标世界的上下文信息。 当需要从一个World切换到另一个World的时候,比如说当点击播放时,就是从Preview切换到PIE。,FWorldContext保存切换过程信息和目标World上下文信息。
FWorldContext还保存着World里Level切换的上下文信息, 以确保在切换关卡时能够正确处理相关的上下文状态和数据。

player

UPlayer类的理解

UPlayer类是UObject类的派生类
UPlayer类代表了一个玩家
每个玩家在游戏中都有一个对应的UPlayer实例,用于跟踪和管理该玩家的状态和行为。
它用于管理玩家的输入、控制器、角色
管理玩家的输入:UPlayer负责接收和处理玩家的输入,并将其传递给相关的控制器和角色。
管理玩家的控制器:每个玩家都有一个控制器,UPlayer负责管理控制器的创建、绑定和切换。
管理玩家的角色:UPlayer负责管理玩家的角色(Character),包括创建角色、切换角色、销毁角色等操作.

ULocalPlayer的理解

它是UPlayer的派生类
ULocalPlayer类表示一个本地玩家
用于管理与本地玩家相关的输入、控制器、角色

UNetConnection的理解

它是UPlayer的派生类
用于管理网络的连接和数据传输
每个玩家都有一个唯一的网络连接
玩家通过网络连接与游戏服务器进行通信和交互,它用于发送玩家的输入、同步游戏状态。从这个角度看,一个网络连接也是个Player,它发送玩家的输入到服务器,控制着服务器那边的角色

Player的继承结构



GameInstance

GameInstance类的理解

是UObject的派生类
GameInstance类是UE4中用于管理游戏实例的类,当我们打开游戏的时,一个游戏实例被创建,而GameInstance就是用来管理这个游戏实例。
GameInstance实例在游戏开始时创建,并在整个游戏过程中存在
它保存与游戏实例相关的全局数据,例如玩家配置、游戏设置、存档数据等。
它可以跨关卡的数据传递

继承结构

UEngine

UEngine类的理解

UEngine是一个抽象基类
它负责协调和管理游戏的运行过程、渲染、物理模拟、输入处理、资源管理等核心功能。

UGameEngine类的理解

UGameEngine是UEngine的派生类。
UGameEngine是用于游戏运行时的引擎类。
UGameEngine通常在游戏开始时创建,负责初始化游戏所需的各种系统和资源、渲染场景、处理游戏逻辑等功能。

UEditorEngine类的理解

UEditorEngine是UEngine的派生类。
UEditorEngine是用于编辑器环境的引擎类。
它提供了在编辑器中创建、编辑游戏内容的功能, UEditorEngine允许开发者在编辑器中实时预览内容,以及构建和修改游戏世界

继承结构

SaveGame类

SaveGame类的理解

SaveGame类是的UObject派生类
SaveGame是UE4的存档类,用于实现游戏的存档功能。 它可以把将游戏的数据,比如玩家的的数据信息生成存档文件保存起来,在需要时进行加载和恢复。

Subsystem

Subsystem的理解

Subsystems是一套可以自动实例化和释放的类的框架。
Subsystem有五类生命周期,Subsystem类派生出五个派生类,选择不同的Subsystem类作为父类会决定新的类的对象生命周期。

五类生命周期的理解

Subsystem有五个派生类,
1.UEngineSubsystem
2.UEditorSubsystem
3.UGameInstanceSubsystem
4.UWorldSubsystem
5.ULocalPlayerSubsystem
你可以在这五个类中,选择一个为父类,派生出一个新的类。
比如你选择了UGameInstanceSubsystem作为父类,那么这个新的类的对象生命周期就取决于GameInstance对象的生命周期,随着GameInstance对象的创建而创建,随着GameInstance对象的销毁而销毁。选择哪个Subsystem类作为父类,就选择了哪种生命周期。

总结

GamePlay框架图

整体类图