# Gameplay概览

为了展示游戏框架的不同部分是如何相互影响的,这有一个简单的例子。想象一个简单的游戏,兔子追蜗牛,游戏框架的基础是GameMode。GameMode用来设定游戏的规则,就像第一个跑到终点线的玩家就是赢家,它也处理生成玩家的逻辑。

player是在PlayerController里建立的,它会拥有一个Pawn,Pawn就是玩家在游戏中的物理代表,同时Controller拥有Pawn然后给它的行为设置规则。在我们的例子里,会有两个Pawn,一个代表蜗牛,一个代表兔子,兔子实际上是一个Character,Pawn的一种特殊子类,它拥有内置的移动功能包括跑和跳。蜗牛,从另一方面来说有一种不同的移动方式,它是直接从Pawn继承的。

一个Pawn会包含它自己的移动规则和其他的游戏逻辑,但这些功能也可以包含在Controller中,一个控制器可能是一个PlayerController,用来接收人的输入,或者是一个AIController,用来被电脑自动控制。在这个例子里,如果是玩家控制蜗牛,那这蜗牛会被PlayerController拥有,那兔子会被AI控制,被一个AIController拥有,同时在这里定义它应该什么时候跑,跳,或者打盹。只有人类玩家才会关心摄像机提供的视角,因此只有蜗牛Pawn上的CameraComponent被PlayerCamera使用。

在游戏运行中,玩家会控制蜗牛在关卡中移动,同时HUD会覆盖在Camera提供的视口上,显示谁第一个到达终点,用于跑步时间是多少。

# 游戏流程

我们会讲下引擎启动然后开始游戏的过程,主要有两种方式:通过编辑器或者是单独启动。事件的一般顺序是初始化引擎,创建并初始化一个GameInstance,然后加载一个关卡,最后是开始玩。但是单独启动和编辑器启动还是有一些区别的,这两种模式里都会有一些函数以一个准确的顺序来被调用,下面的流程图平行地展示了两种方式,然后汇聚在游戏开始的地方。

GameFlowCharts

# 单独启动

在单独启动模式里,是在编辑器外面运行的,玩游戏过程中需要使用的对象会在引擎一开始初始化的时候创建和初始化。像GameInstance这样的对象,会在启动引擎之前创建和初始化(不同于创建和初始化引擎),开始地图会在引擎的开始函数被调用的时候加载,Gameplay在关卡创建合适的游戏模式和游戏状态时算是正式开始,然后是创建其他Actors。

# 编辑器模式启动

在编辑器模式中,会有Play In Editor和Simulate In Editor,一个不同的工作流被使用,引擎会立即初始化然后启动,因为它需要运行编辑器,但是像GameInstance这样的对象的初始化是推迟到用户按下PIE或SIE按钮的时候,除此之外,关卡中的Actors会被复制,这样游戏运行中做出的改变是不会影响编辑器中的关卡的,以及其中的任何对象,包括GameInstance对象,在每个PIE实例中有一个单独的拷贝。编辑器模式同单独运行模式在UWorld类的BeginPlay中交融到一块。