提供给你一个跟踪A和B两队得分的例子。我们假设有一个Custom Event在获得团分的时候被调用。
它传递一个布尔值,使我们知道是哪个队得分。在后续Replication章节你就能看到只有服务器能复制变量,所以我们得确保只有服务器能调起这个事件。它是由另一个类(例如枪击中敌人)调用的,而这总是只能在服务器上发生,所以我们不需要用RPC。
由于这些变量和GameState游戏状态被复制,你能在别的类中使用他们,例如把积分变量在记分牌UI上显示。
要实现这个例子需要多点代码,但除去函数本身,每个类只需设置一次Replication即可。
你在后续Replication章节能获得更多信息!
Player State
APlayerState类对特定玩家来说是最重要的类。它保存关于玩家当前状态的信息。每个玩家都有独立的PlayerState。PlayerState类也会被复制到每个人,用来在其他客户端上检索和展示数据。有个访问全部PlayerStates的好方法,就是调用GameState类里的PlayerArray。
你可能需要用到的一些信息:
PlayerName —— 当前连接服务器的玩家姓名
Score —— 当前连接服务器的玩家积分
Ping —— 当前连接服务器的玩家ping
GuildID —— Player所属队伍ID
还有其他玩家需要知道的复制信息。
Example and Usage
在多人游戏中,PlayerState类就是用来保存连接玩家的状态。有包括:姓名,积分,ping,还有你的自定义变量。
由于被复制了,所以能很容易地检索其他客户端的数据。
Blueprint
有个遗憾,在我写这篇文章的时候,重要的函数还未被公开到蓝图。所以我只能在C++部分介绍PlayerState的例子。但是我们能够先看看其中一些有用的变量:
这些变量都是被复制的,因此他们在所有客户端上同步。
遗憾的是,他们不能在蓝图里面设置,但当然你可以新建属于你的专属版本,那你可以干任何事。
举个例子,你可以通过'ChangeName'函数类设定PlayerName,这是一个GameMode的函数。
PlayerState类还用于关卡切换或者发生意外时,保存玩家的数据。
PlayerState类有两个函数可以帮助断线重连玩家 还有更换关卡玩家保存当前游戏数据。
我在4.13版本证实了这两个函数属于PlayerState类并可以在蓝图中调用。
PlayerState类负责将已保存的信息传递给新PlayerSate,断线或者过关情况下都会被创建。
当然也有C++实现的方法。
这些方法能帮助你将你的要实现的内容保存到你自定义的PlayerState里面。记得加override关键字,和调用父类Super方法,这样可以保留函数原始作用。
Pawn
APawn类是玩家控制的Actor类。大多数情况下是人形角色,但当然也可以是猫啊、船啊、方块啊等等的。
一个玩家在同一时间只能拥有一个Pawn,但如果想切换到其他Pawn,也很简单。
Pawn类几乎复制到所有客户端。
Pawn的子类ACharacter类是经常用到的类,因为他自带一个MovementComp移动组件,控制着被操控角色可被复制的位置、旋转等。
NOTE:不是客户端移动角色。是服务器接收到来自客户端的移动输入请求,然后服务器再进行角色移动和复制此信息给客户端。