一、游戏框架

想象兔子与蜗牛比赛。游戏框架的基础是GameMode。GameMode设置了游戏的规则,比如“最先经过终点的玩家获胜”,他也处理players的生成。

Player在PlayerController中设置,PlayerController可以拥有一个Pawn,Pawn是一个游戏中Player可操作的对象(物理上的代表),当Controller拥有这个Pawn,并且可以为其行为设置规则。在我们的例子中,将有两个Pawn,一个是蜗牛,一个是兔子。兔子将设置为Character类(Pawn的一个特殊子类),Character中有已经封装好的移动功能组件Character Movement Component,包含跑跳等常规动作。因为蜗牛有区别有兔子的运动风格,所以他从pawn类直接继承。

你可以在Pawn中设计自己的移动逻辑或其他游戏逻辑,这些功能也可以在Controller中设计。一个Controller可以是从人类玩家获得输入的PlayerController,也可以是由电脑自动控制的AIController。在这个例子中,玩家将会控制蜗牛,所以PlayerController控制蜗牛Pawn。AI控制兔子,AIController持有兔子这个角色并且在之中设置了何时他应该停止,冲刺以及瞌睡的游戏逻辑。只有人类玩家关心由摄像机提供的视角,所以只有蜗牛Pawn中的一个Camera Component会被使用。

在游戏过程中,来自玩家的输入将会移动蜗牛,HUD重叠在摄像机提供的视角上,显示当前排名以及花费的比赛时间。

二、游戏框架快速参考

1、使用玩家输入或者AI逻辑控制Pawns

  • Controller是一个负责指导Pawn的Actor。它们通常有两种版本,AIController和PlayerController。控制器可以“拥有”一个Pawn来控制它。
  • PlayerController是Pawn与玩家控制他之间的接口。其代表了玩家的意志。
  • AIController是一个可以控制Pawn的模拟意志。

2、代表世界的玩家、朋友、敌人

  • Pawn是一个actor。Pawn可以被Controller持有,他们可以接收输入,可以做很多游戏逻辑。
  • Character是一个人形风格的Pawn,继承自Pawn。他默认自带一个胶囊体碰撞器角色运动组件。他可以做到基本的人形移动,他可以平滑的复制移动并且有一些动画相关的功能。

3、向玩家展现信息

  • HUD是一个抬头显示器。可以显示健康、弹药等,每个PlayerController通常有一个。
  • Camera相当于玩家的眼球并且管理他的行为。每个PlayerController通常也有其中一个。

4、设置与追踪游戏的规则

  • 游戏模式(GameMode)游戏的概念分为两类。GameMode与GameState是游戏的定义,包括像游戏规则的事情,胜利的条件。他只存在于服务器上。他通常没有太多的数据变化,也没有客户端需要了解的瞬态数据。
  • 游戏状态(GameState)包括像关联球员名单得分,那里的作品是一盘棋,或者游戏中的任务完成列表。GameState存在于所有服务器与客户端上,可自由复制使所有计算机保持最新状态。
  • 玩家状态(PlayerState)是游戏参与者的状态,PlayerState包含玩家姓名,得分,类似MOBA的匹配等级。所有玩家的PlayerState存在于所有机器上,可以自由复制保持同步。

5、框架类之间关系

三、游戏模式和游戏状态

有两个主要类别处理有关正在玩的游戏的信息:Game ModeGame State

即使是最开放的游戏也有规则,这些规则构成了Game Mode。在最基本的层面上,这些规则包括:

  • 现有的球员和观众人数,以及允许的最大球员和观众人数。
  • 玩家怎样进入游戏,其中包括选择生成位置和其他生成/重生行为的规则。
  • 是否可以暂停游戏,以及如何开始游戏的暂停。
  • 关卡之间的切换,包括游戏是否应该以电影模式启动。

游戏中与规则相关的事件发生并需要跟踪并与所有玩家共享时,该信息将通过Game State进行存储和同步。这些信息包括:

  • 游戏运行了多长时间(包括本地玩家加入前的运行时间)。
  • 当每个玩家加入游戏时,以及该玩家的当前状态。
  • 当前游戏模式的基类。
  • 游戏是否已经开始。

Game Modes

虽然某些基本要素,比如需要玩的玩家数量,或者这些玩家加入游戏的方法,对于许多类型的游戏来说都是常见的,根据正在开发的特定游戏,可以实现无限的规则变化。无论这些规则是什么,Game Modes都旨在定义和实现它们。目前有两种常用的Game Modes基类。

引擎版本4.14引入AGameModeBase,它是所有Game Modes的基类,AGameModeBase是经典简化版本AGameMode。AGameMode是版本4.14之前的游戏模式基类仍然存在并且像以前一样运行,但现在是AGameModeBase的一个子类。AGameMode由于其实现了匹配状态的概念,因此更适合标准游戏类型,如多人射击游戏。AGameModeBase是新代码项目中包含的新默认游戏模式,因为它简单而有效。

AGameModeBase

所有Game Modes都是AGameModeBase子类,其中包含可以覆盖的相当多的基本功能。一些常见功能包括:

函数/事件

目的

InitGame

(初始化游戏)

InitGame事件在任何其他脚本之前调用(包括PreInitializeComponents),并且通过AGameModeBase初始化参数和生产其辅助类。

这是在任何Actor运行PreInitializeComponents之前调用的,包括Game Mode实例本身。

PreLogin

(预登陆)

接受或拒绝尝试加入服务器的玩家。Login函数设置ErrorMessage为非空字符串,则导致该函数失败。PreLogin在Login之前调用,并且在调用Login之前可能会经过大量时间,特别是如果加入的玩家需要下载游戏内容。

PostLogin

(处理登陆)

成功登录后调用。这是第一个可以安全地在PlayerController调用复制函数的地方。OnPostLogin可以在Blueprint中实现以添加额外的逻辑。

HandleStartingNewPlayer

(处理启动的新玩家)

在PostLogin或者无缝旅行之后调用,可以在蓝图中覆盖,以改变新玩家的情况。默认情况下,它会为玩家创建一个pawn。

RestartPlayer

(重新启动玩家)

被调用来开始产生一个玩家的Pawn。如果你想命令Pawn将在哪里生产同样有有RestartPlayerAtPlayerStart和RestartPlayerAtTransform可用。OnRestartPlayer可以在Blueprint中实现在函数结束后添加逻辑。

SpawnDefaultPawnAtTransform

(在指定transform生产默认Pawn)

这实际上产生了玩家的Pawn,并且可以在蓝图中被覆盖。

Logout

(登出)

当玩家离开游戏或被摧毁时调用。OnLogout可以实现蓝图逻辑。

AGameModeBase可以为游戏每种比赛形式,任务类型或特殊区域创建该类的子类。游戏可以具有任意数量的游戏模式,因此可以具有AGameModeBase该类的子类; 但是,在任何给定时间只能使用一种游戏模式。每次通过该UGameEngine::LoadMap()函数初始化关卡以进行游戏时,都会实例化Game Mode Actor 。

Game Mode不会复制到任何加入多人游戏的远程客户端;它只存在于服务器上,因此本地客户端可以看到所使用的游戏模式类(或蓝图),但无法访问实际实例并检查其变量以查看游戏进展时发生的变化。如果玩家确实需要与当前游戏模式相关的最新信息,则该信息通过存储在AGameStateBase Actor上保持同步,这将与游戏模式一起创建,然后复制到所有远程客户端。

AGameMode

AGameModeAGameModeBase一个子类,有一些额外的功能来支持多人匹配和遗留行为。所有新创建的项目都默认使用AGameModeBase,但如果需要此额外行为,则可以切换到继承AGameMode。如果继承AGameMode,则还应继承游戏状态AGameState,这也支持匹配状态机。

AGameMode包含一个跟踪匹配状态或一般游戏流程的状态机。要查询目前的状态,您可以使用GetMatchState,或像HasMatchStarted,IsMatchInProgress和HasMatchEnded包装。以下是可能的匹配状态:

  • EnteringMap是最初的状态。actor还没有每帧更新,世界还没有完全初始化。当物品完全加载时,它将转换到下一个状态。
  • WaitingToStart是下一个状态,HandleMatchIsWaitingToStart在进入时被调用。玩家正在每帧更新,但Players还没有产生。如果ReadyToStartMatch返回true,或者如果StartMatch被调用,它将转换到下一个状态。
  • InProgress是游戏的主要部分将发生的状态。HandleMatchHasStarted在输入时调用,然后在所有Actors调用BeginPlay。此时,正常的游戏玩法正在进行中。当ReadyToEndMatch返回true或被EndMatch调用时,匹配将转换到下一个状态。
  • WaitingPostMatch是倒数第二个状态,HandleMatchHasEnded在进入时被调用。actors仍然在每帧更新着,但新玩家无法加入。当地图传输开始时,它会转换到下一个状态。
  • LeavingMap是正常流程中的最后一个状态,并在进入时调用HandleLeavingMap。该匹配在转移到新地图时保持此状态,并将转换回该地图EnteringMap。
  • Aborted是故障状态,可以通过调用AbortMatch启动。当存在不可恢复的错误时设置此项。

匹配状态几乎总是处在InProgress因为这是BeginPlay被调用的状态,并且actors开始每帧更新的时候。然而,个别游戏可以覆盖这些状态的行为以构建具有更复杂规则的多人游戏,例如允许玩家在等待其他玩家加入多人射击游戏时自由地飞行。

GameMode Blueprints 游戏模式蓝图

可以创建从Game Mode类派生的蓝图,并将它们用作项目或关卡的默认Game Mode。

从Game Mode派生的BP可以设置以下默认值:

  • 默认Pawn类
  • HUD类
  • PlayerController类
  • Spectator类
  • Game State类
  • Player State类

此外,Game Modes蓝图非常有用,因为它们可以在不改变代码的情况下调整变量,因此可以用于使单个Game Mode适应多个不同关卡,而无需使用硬编码资产引用或需要工程支持和代码更改每一次调整。

Setting the Game Mode 设置游戏模式

有几种方法可以为一个关卡设置游戏模式,从最低优先级到最高优先级排序:

  • 设置/Script/EngineSettings.GameMapsSettingsDefaultEngine.ini文件部分中的GlobalDefaultGameMode条目将为项目中的所有地图设置默认游戏模式。

[/Script/EngineSettings.GameMapsSettings]

GlobalDefaultGameMode="/Script/MyGame.MyGameGameMode"

GlobalDefaultServerGameMode="/Script/MyGame.MyGameGameMode"

  • 要覆盖单个地图的项目设置,请在编辑器的世界设置选项卡中设置GameMode覆盖

转存失败重新上传取消

  • URL可以传递给可执行文件,以强制游戏加载特定选项。使用该game选项设置Game Mode。有关更多信息,请参阅命令行参数。

UE4Editor.exe /Game/Maps/MyMap?game=MyGameMode -game

  • 最后,可以/Script/Engine.WorldSettings/在DefaultEngine.ini文件的部分中设置映射前缀(以及URL方法的别名)。这些前缀为具有给定前缀的所有地图设置默认游戏模式。

[/Script/EngineSettings.GameMapsSettings]

+GameModeMapPrefixes=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")

+GameModeClassAliases=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")

Game State游戏状态

该Game State是负责使客户能够监视游戏的状态。从概念上讲,Game State应该管理想让所有连接的客户端知道的信息,并且特定于Game Mode,但不是特定于任何单个玩家它可以跟踪游戏范围内的属性。(例如连接的玩家列表,Capture The Flag游戏中的队伍得分,在开放世界游戏中完成的任务,等等)

Game State不是追踪玩家特定事物的最佳位置,例如特定玩家在Capture The Flag比赛中为球队得分的数量,因为Player State可以更清晰地处理。通常,GameState应该跟踪在游戏过程中发生变化的属性,并且对每个人都是相关且可见的。虽然Game Mode仅存在于服务器上,但Game State存在于服务器上并被复制到所有客户端,随着游戏的进行使所有连接的计算机保持最新状态。

AGameStateBase是基本实现,它的一些默认功能包括:

功能或变量

使用

GetServerWorldTimeSeconds

(获取服务器世界时间)

这是服务器的UWorld功能版本,GetTimeSeconds将在客户端和服务器上同步,因此可以用于复制。

PlayerArray

(玩家数组)

这是所有APlayerState对象的数组,为游戏中的所有玩家做某事时非常有用。

HasBegunPlay

(是否开始游玩)

如果BeginPlay已在游戏中的actor上调用该函数,则返回true 。

AGameStateBase通常在C ++或蓝图中进行扩展,以包含让玩家了解游戏中发生的事情所需的其他变量和函数。所做的具体修改通常基于制作游戏状态的配对游戏模式。游戏模式本身也可以将其默认的游戏状态类型覆盖为任何C ++类或派生自的蓝图AGameStateBase。

UE4-游戏框架——GameMode、GameState、PlayerState、Controller、Pawn相关推荐

  1. 基于C#面向对象的特性搭建游戏框架

    最近入手了一个RPG游戏,用来学习C#游戏编程与继承游戏框架的搭建,游戏是场景以LowPoly的底面模型进行搭建,玩家扮演士兵与怪兽进行战斗以提升自身等级与战斗力,游戏中也同时包含的传送门的功能,玩家 ...

  2. 【游戏框架】Unity应用设计模式架构赛车游戏

    原文转载自http://jxwgame.blog.51cto.com/943299/1597706 随着游戏的日益盛行,赛车游戏一直以来很受玩家喜爱,比如:极品飞车,侠盗飞车等.很多人可能会想如果我设 ...

  3. Unity3D 学习笔记4 —— UGUI+uLua游戏框架

    Unity3D 学习笔记4 -- UGUI+uLua游戏框架 使用到的资料下载地址以及基础知识 框架讲解 拓展热更过程 在这里我们使用的是uLua/cstolua技术空间所以提供的UGUI+uLua的 ...

  4. JavaScript | 益智类数字棋牌小游戏,无游戏框架,浏览器直接运行JavaScript(js)小游戏【源码+解析】

    游戏界面 曾几何时想有一款自己编写的游戏,通过不断学习,终于掌握了一点JavaScript基础,捣鼓了一个益智类的数字棋牌游戏,没有使用任何游戏框架,就简单使用HTML做布局,CSS做动画,JavaS ...

  5. cgf通用游戏框架设计(一)

    最近在用 JAVA 做游戏开发,看了公司同事写的框架有些复杂,于是决定重新架构一个通用游戏框架,主要目的是方便开发流程.我叫它common game framework (cgf) ,通用游戏框架. ...

  6. 【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)

    返回目录 1.为什么我们需要外部输入模块? 在游戏中我们常常用到类似这样的操作:鼠标点击某位置,玩家对象移动到该位置,或者按鼠标方向键,玩家向不同方向移动,等等.这些操作无一不用与外部输入设备打交道. ...

  7. 基础知识漫谈(3) 组合基础知识,设计游戏框架

    如何让画面动起来? 都知道动画的原理,想想看跑马灯,在任意时刻把跑马灯按停,面对眼睛的那附图,它叫做帧(Frame). 帧,就是一串儿连贯动画里的单个截面. 玩儿游戏的人知道,要达到基本流畅的水准,3 ...

  8. swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程

    swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程 1.2.3  注册非免费苹果账号swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程 免费的苹果账号在 ...

  9. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C  介绍:本教程是国内唯一的Swift版的Spritekit教程 ...

最新文章

  1. Windows Phone 7 Tip (5) -- App liftcycle
  2. 【jquery】$.each的使用方法
  3. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  4. 计算机二级测试试题及答案,2017计算机二级测试题及答案解释
  5. LFS,编译自己的Linux系统 - 前言
  6. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)解题报告
  7. r语言legend_R语言画热图时图例(legend)过多超出画图边界
  8. clustered和nonclustered索引的区别
  9. 485通讯协议_HART协议和RS485协议有什么区别?
  10. python数据容器专题
  11. 常用模块 re模块
  12. mysql or order by_MySQL 2 SQL数据使用(检索、排序、过滤:SELECT/FROM/LIMIT/ORDER BY/DESC/WHERE/AND/OR/IN/NOT)...
  13. 基于Vivado和Ego1的密码锁设计
  14. 2.11 数值分析: 事后误差估计和迭代改善
  15. setting文件详解
  16. win10非核心版本的计算机上
  17. 千里追踪“假疫苗”产销链
  18. KubeCon + CloudNativeCon + Open Source Summit 2019大会上海开幕看点不断!
  19. 讲座回顾|2021/4/7|青源美团|CVPR 2021 预讲 · 美团专场,覆盖实例分割,图像分割,表情识别,特征选择和对齐...
  20. 移远之Quectel_QuecPython_EC600S 开发板小记(上)

热门文章

  1. 《Python3网络爬虫开发实战》学习笔记_P1
  2. Python中对table(表格)的应用
  3. 阿里钉钉、ICBU、CBU、蚂蚁、国际化中台Java后台面经
  4. Java基础整理笔记
  5. 全球的生活服务型机器人产业发展得比较迅猛
  6. AB压力测试开源WAF性能分析
  7. 凌动x7可以用linux吗,英特尔凌动x7-Z8700性能跑分评测 | ZMMOO
  8. 如何利用PHP防范CC攻击
  9. Ubuntu 成功安装google正常使用Bing等其他搜索引擎
  10. Linux系统简介及简要shell命令介绍(2)