UE4联网开发翻译(二)

Game Mode类

NOTE:在UE 4.14引擎中,GameMode类被划分成 GameModeBase类 和 GameMode类。

GameModeBase类:功能很少,因为用老版本做的一些游戏没需要到那么多功能特性。

AGameMode类:用于制定你游戏的规则。包括一些常用类,例如APawn类、APlayerController类、APlayerSate类等等。它只在服务器上有效。客户端没有GameMode类的对象,而且你想在客户端上接受GameMode类对象的话,只会变成空指针。

Example:

GameMode类是什么东西呢?就是我们常玩的那些:死亡竞赛、团队死亡竞赛和争夺旗帜类型游戏。

意思是你可以通过GameMode类定义:

1.我们是一个团队得分还是每个人单独得分

2.胜利条件是什么?要一个团队要达成多少击杀才算胜利?

3.怎么获得积分?击杀玩家?还是偷旗帜?

4.使用什么角色?允许使用什么武器?只允许手枪?

 

Examples and Usage

在多人游戏中,GameMode类还可以实现一些有趣的功能,例如管理玩家 或者 规划比赛流程。

Blueprint

首先你得学会用蓝图重写函数:你能为这些函数实现自己的逻辑,以满足你的游戏规则。包括可以修改GameMode生成默认Pawn的方式 或者 决定你正式游戏开始的条件。例如:检查是否所有玩家都进入并准备好了。

 

当然在游戏运行中也可以通过Events(事件)的方式来响应对应逻辑。

一个我常用的比较好的例子,就是‘OnPostLogin’ 事件。每当一个新玩家加入游戏的时候,这个事件就会触发。

迟点将会介绍连接过程的知识,但现在先跳过。

这个事件传递一个PlayerController(玩家控制器)给你,这个控制器由这个玩家连接过程有用。(迟点介绍)

这可以用于与玩家交互,生成一个玩家控制器给玩家 或者 只是生成这个控制器并将他放置于数组里面而供后续使用。

 

就如果之前提及的一样,你可以用GameMode来管理你的游戏流程。这同样有函数以供使用,就例如‘Ready to start Match’。

这些函数和事件可以帮助你控制你的游戏状态。这些函数和事件大多数在“Ready to”函数返回值为true时自动调用。当然你也可以手动调用。

‘New State’是一个‘FName’类型,你可能会问:“为什么GameState类不处理这问题?”。实际上这些GameMode类函数是和GameState类协同工作的。这仅仅是提供给你 在远离客户端时可以管理游戏状态 的一个方法,因为GameMode只存在于服务器上。

 

GameMode还有很多重要的变量提供给你使用。

这是默认继承好的变量清单图。其中,有些变量可以在GameMode蓝图中通过ClassDefaults来设置。

大多数的变量都可以通过名字知道他的含义,例如‘Default Player Name’,就是允许您为每个连接的玩家提供一个可以通过PlayerState类访问的默认玩家姓名。还有,‘bDelayedStart’,就是阻止游戏开始。还有,‘Ready to start Match’检查所有开始需满足的条件。

其中一个更重要的变量,叫‘Options String’。这些选项根据‘?’问号分隔(如图),你可以通过‘OpenLevel’函数 或者 当你在控制台命令中调用‘ServerTravel’的时候 去传递这些选项信息。

你可以用‘Parse Option’这样的函数去提取传递的信息,例如你输入‘MaxNumPlayers’来提取最大玩家数。

 

以上用蓝图实现的东西也能通过c++来实现,就不再重复写了。我提供部分代码例子。

因为‘ReadyToStartMatch’是蓝图原生事件,C++实现的函数叫‘ReadyToStartMatch_Implementation’。重写它:

 

蓝图里面的‘OnPostLogin’函数是虚函数,在C++中叫‘PostLogin’,我们也来重写它:

 

当然,所有匹配-处理 函数都可以重写和更改,我在这里就不一一列举了。你可以查询官方文档,标题为GameMode的API文档。

我再写一个C++例子,‘Options String’的:

 

 

Game State

NOTE:在UE 4.14引擎里,GameState类被划分为GameStateBase类 和 GameState类。

GameStateBase类:同GameModeBase一样用于老版GameState类,功能简单。

AGameState类:在服务器和客户端之间,共享信息所需最重要的类。GameState类常用于跟踪当前游戏状态。对于多人游戏来说,这包含一个所有连接玩家状态的列表。

GameState类被复制到所有客户端。所以每个人都可以访问它。所以这个类是多人游戏最核心的类。

当GameMode类要求我们要达到多少击杀才能获得胜利的时候,GameState就会跟踪当前每个玩家/每个团队已获得的击杀数。

你在这个类中存储什么信息完全由你决定。可以存储一个已获得分数的数组,或者是一个自定义结构用于记录工会或者团队状态的数组。

 

 

Examples and Usage

在多人游戏中,GameState类用于跟踪游戏当前状态,其中还包含玩家和玩家状态。GameMode确保GameState中的匹配状态函数会被调用,而GameState本身也给予你在客户端上调用它那些函数的机会。

Blueprint

我们可以从基本GameState类中得到一些我们可以使用的变量。

PlayerArray* 、MatchState和ElapsedTime都会被复制,所以客户端能够访问到他们。

但这不包括AuthorityGameMode。因为GameMode只存在于服务器上所以只有服务器才能访问他。

* PlayerArray不被直接复制,但其中每个PlayerState都是直接被复制,它们在构造时添加到PlayerArray中。当他们一旦被创建,则GameState立刻收集他们。

 

这些PlayerState和GameState的实例(生成时)全部发生在服务器和客户端上。

猜你喜欢

转载自blog.csdn.net/qq_16468937/article/details/94588568