UE4联网1——子弹同步

首先在ue4中联机有个专业术语叫——Replication(复制)

这保证服务器和客户端的实时同步,服务器会不断地向客户端发送更新数据。

 

在ue4中射击类型的游戏在运行的时使用多个玩家,并在窗口上运行。会有一个窗口充当服务器,其余的时客户端在没有实现同步的时候,经常会给人一种很违和的感觉。比如客户端射击生成子弹在服务器这边则没有任何效果。服务端生成子弹在客户端上也没有任何效果。也就是服务端和客户端是不同步的。

 

在子弹类构造函数中添加以下代码

UE4联网1——子弹同步_第1张图片

 

编译运行游戏,发现现在控制服务端角色可以在客户端中同步发射子弹,而控制客户端角色不能在服务端中同步发射子弹。

这是合理的,因为在client - server 结构中应该以服务器为准。 如果你只是客户端不调用服务器的方法的只能在本地发射子弹。你的代码控制无法影响到服务器。

 

所以解决方法就是调用服务器方法。

由于生成子弹是在角色类中的开火方法所以要用使用服务器方法重新这个开火的方法

头文件中应该如下定义 reliable是确保客户端和服务器能够最终连接。

 

UE4联网1——子弹同步_第2张图片

三种 RPC 函数区别

  • UFUNCTION(Server, Reliable, WithValidation) 客户端请求,服务端执行。
  • 使用场景:涉及到数据安全的行为,比如:砍一刀扣血,扣血条件判定以及血量修改,都应该放在服务端执行。
  • UFUNCTION(Client, Reliable) 服务端请求,客户端执行,也可能是服务端执行(详细描述见下文)。NM_Standalone模式下,Client函数也会执行。
  • 使用场景:只是表现相关,不涉及数据修改的行为,比如:装备升级,整备的属性修改发生在服务端,升级成功后的外观变化,服务端需要通知客户端替换武器 Mesh 和材质。
  • UFUNCTION(NetMulticast, Reliable) 服务端先执行,然后所有连接的客户端再执行。默认情况下只在服务端执行(详细描述见下文)。
  • 使用场景:当前客户端做的表现也希望其他客户端也看到,比如:播放攻击动作,客户端A控制的角色A播放攻击动作,希望所有其他客户端也能看见角色A播放了攻击动作。
  • NetMulticast一般可以设置为 Unreliable ,表示如果网络不通畅,不重新发送 UDP 消息,比如上述装备升级,如果网络问题导致客户端未能更新装备外观,影响也不大,Unreliable 可以节省带宽。
  • UFUNCTION(Client, Unreliable) 并不表示是一定在客户端执行!!!也可能是服务端执行。官方文档: Since the server can own actors itself, a “Run on Owning Client” event may actually run on the server, despite its name.
  • 官方文档:Multiplayer in Blueprints
  • https://docs.unrealengine.com/latest/INT/Gameplay/Networking/Blueprints/index.html

 

服务器函数和一般的函数实现起来有点不一样

他是有两部分构成的而且函数名也是和声明中有点不一样。实现的时候需要如下后缀

实现的里面把原来的逻辑粘过来即可,验证数据不需要做检查声明的话直接return true就行了。

UE4联网1——子弹同步_第3张图片

 

并在原来的开火函数里调用服务器方法。

 

UE4联网1——子弹同步_第4张图片

生成的方法处理完了,接着处理子弹销毁的方法

因为之前已经把子弹设置成rpc了,所以实际上子弹只在服务器上生成,客户端上的是由服务器上复制同步过来的。子弹由服务器所有。销毁应该也应该在服务器上执行。噪音也在服务器上执行,ai逻辑都应该放在服务器上执行,应该让服务执行ai决策。同样服务器上执行完会复制给客户端,如下编译运行脚本。

UE4联网1——子弹同步_第5张图片

 

理解授权关键字

https://www.cnblogs.com/timy/p/9877247.html

https://blog.csdn.net/XIAOZHI0999/article/details/79665692

现在客户端可以和服务器同步生成子弹了。

 

你可能感兴趣的:(UE4多人联网,unreal)