UE4-游戏框架——GameMode、GameState、PlayerState、
Cont。。。
⼀、游戏框架
想象兔⼦与蜗⽜⽐赛。游戏框架的基础是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 Mode和Game 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),并且通过A
GameModeBase初始化参数和⽣产其辅助类。
这是在任何Actor运⾏PreInitializeComponents之前调⽤的,包括Game Mode实例本⾝。
PreLogin
(预登陆)接受或拒绝尝试加⼊服务器的玩家。Login函数设置ErrorMessage为⾮空字符串,则导致该
函数失败。PreLogin在Login之前调⽤,并且在调⽤Login之前可能会经过⼤量时间,特别是
如果加⼊的玩家需要下载游戏内容。PostLogin (处理登陆)成功登录后调⽤。这是第⼀个可以安全地在PlayerController调⽤复制函数的地⽅。
OnPostLogin可以在Blueprint中实现以添加额外的逻辑。
HandleStartingNewPlayer (处理启动的新玩家)在PostLogin或者⽆缝旅⾏之后调⽤,可以在蓝图中覆盖,以改变新玩家的情况。默认情况
下,它会为玩家创建⼀个pawn。
vb正则不包含某个单词
RestartPlayer (重新启动玩家)
被调⽤来开始产⽣⼀个玩家的Pawn。如果你想命令Pawn将在哪⾥⽣产同样有有
RestartPlayerAtPlayerStart和RestartPlayerAtTransform可⽤。OnRestartPlayer可以
在Blueprint中实现在函数结束后添加逻辑。SpawnDefaultPawnAtTransform
(在指定transform⽣产默认Pawn)
shelly用英语怎么说这实际上产⽣了玩家的Pawn,并且可以在蓝图中被覆盖。Logout
(登出)当玩家离开游戏或被摧毁时调⽤。OnLogout可以实现蓝图逻辑。
AGameModeBase可以为游戏每种⽐赛形式,任务类型或特殊区域创建该类的⼦类。游戏可以具有任意数量的游戏模式,因此可以具有AGameModeBase该类的⼦类; 但是,在任何给定时间只能使⽤⼀种游戏模式。每次通过该UGameEngine::LoadMap()函数初始化关卡以进⾏游戏时,都会实例化Game Mode Actor 。Game Mode不会复制到任何加⼊多⼈游戏的远程客户端; 它只存在于服务器上,因此本地客户端可以看到所使⽤的游戏模式类(或蓝图),但⽆法访问实际实例并检查其变量以查看游戏进展时发⽣的变化。如果玩家确实需要与当前游戏模式相关的最新信息,则该信息通过存储在AGameStateBase Actor 上保持同步,这将与游戏模式⼀起创建,然后复制到所有远程客户端。
AGameMode AGameMode是AGameModeBase⼀个⼦类,有⼀些额外的功能来⽀持多⼈匹配和遗留⾏为。所有新创建的项⽬都默认使⽤
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类
类
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。有关更多信息,请参阅。
< /Game/Maps/MyMap?game=MyGameMode -game游戏辅助框架免root
最后,可以/Script/Engine.WorldSettings/在DefaultEngine.ini⽂件的部分中设置映射前缀(以及URL⽅法的别名)。这些前缀为具有给定前缀的所有地图设置默认游戏模式。
[/Script/EngineSettings.GameMapsSettings]
+GameModeMapPrefixes=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")
+GameModeClassAliases=(Name="DM",GameMode="/Script/UnrealTournament.UTDMGameMode")获取accesstoken失败怎么办
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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论