客户端权威移动
主要应用于一些需要优先保证客户端游玩体验的PVE类型的游戏,通过客户端的权威移动来解决由于网络延迟等造成的玩家位移发生拖拽等问题。
核心思想是服务端关闭对玩家运动的模拟,客户端按照一定的频率上报自己当前的位置,服务器将玩家上报的位置转发给其他的客户端,其他客户端接收到服务器转发的位置信息后进行平滑插值来模拟该角色的运动过程。
注:使用引擎为UE4.27,采用DS模式
基础的运动功能
新建一个UE4.27的第三人称模板工程,命名为ClientMovement,使用默认提供的AClientMovementCharacter并且继承自UCharacterMovementComponent创建一个UClientMovementComponent。
替换默认的运动组件
先继承出一个UClientMovementComponent,然后修改ClientMovementCharacter的构造函数,使用FObjectInitializer替换默认的CMC
1 | class AClientMovementCharacter : public ACharacter |
替换完成后重新编译并启动就可以在默认提供的角色蓝图中看到默认的CMC被替换为自行创建的CMC。
对UClientMovementComponent的修改
在UCharacterMovementComponent中可以找到一段注释,解释了CMC在服务端对客户端运动的重建以及纠正过程:
1 | /* |
UE在网络游戏架构下的运动系统为客户端预测+服务器校验回滚的模式,具体为当接收到移动输入后客户端会先运动并将运动信息上报给服务器,服务器根据客户端上报的运动信息模拟客户端并进行纠正,当客户端运动的位置于服务端模拟出的位置相差过大时会主动纠正客户端的位置。
因此要修改运动系统首先就要关闭服务器对客户端运动信息进行模拟的过程。
1 | class UClientMovementComponent : public UClientMovementComponent |
文件实现
1 |
|
对AClientMovementCharacter的修改
这里主要是完成位置信息的上报过程,这一步需要在角色的客户端按照一定的频率上报玩家角色当前的位置。
1 | // 在AClientMovementCharacter的头文件中的修改 |
到这一步便完成了基本的移动功能,接下来完成传送功能
对角色应用传送
在服务端权威的移动模式下,如果需要使用传送功能,一般需要在客户端上报,服务端调用TeleportTo() 方法进行长距离瞬间移动。
在客户端权威的移动下,可以直接在客户端更改角色的位置,然后再上报给服务器调用传送,具体代码如下。
1 | class AClientMovementCharacter : public ACharacter |
对角色应用冲刺
在服务器权威的移动模式中,对于短时间的距离改变,如果网络延迟较高的话可能会导致玩家冲刺或位移结束后位置发生回滚,一般可以通过使用位移动画+GAS来解决,不过在客户端权威的移动模式下,冲刺或者闪避过程可以直接在客户端进行。
使用施加力的位移
直接给玩家施加一个正前方向的力来实现位移效果:
1 | class AClientMovementCharacter : public ACharacter |
使用动画的位移
与使用施加力的方式达到位移效果不同的是,通过RootMotion来驱动角色移动时需要先暂时停止客户端给服务器的位置上报,等结束后再继续上报位置。
1 | // 头文件的修改 |
测试
启动两个客户端进行测试并手动设置网络延迟。
启动游戏后在控制台输入:stat net来查看当前的网络状态
在控制台输入:NetEmulation.PktLag 2000 将网络延迟设置为2000ms
在玩家的角色蓝图中绑定几个测试按钮用来测试传送、力驱动闪避、动画驱动闪避,正常情况下应该是本地客户端流畅运行不会发生任何的位置回滚行为,在其它客户端需要等待一会儿才会有反应。
完整源码
CMC
头文件
1 | // Fill out your copyright notice in the Description page of Project Settings. |
源文件
1 |
|
Character
头文件
1 | // Copyright Epic Games, Inc. All Rights Reserved. |
源文件
1 | // Copyright Epic Games, Inc. All Rights Reserved. |









