UE4网络同步

Actor是UE网络同步核心。所有的数据同步都是围绕Actor展开的。服务器将保留一份Actor列表并定期更新客户端,以便客户端保留每个Actor(那些需要被同步的Actor)的近似复本。(比如:玩家角色,武器等)

Actor主要通过两种方式进行更新: 属性复制 和 RPC(远程过程调用)

如此设计的原因是,如果按照协议模式开发,客户端和服务器架构不一样,负责人不一样,导致两边的逻辑各有一份代码,一边逻辑改动需要另一边的开发人员也配合做相应的修改。同时测试起来也很麻烦。UE的基于Actor为基础的同步方式是为了方便开发,便于维护。一块逻辑可以由一个人负责客户端和服务器全部代码。开发者只要考虑新的Actor哪些需要用RPC,哪些需要用属性复制就可以了。又因为提供PIE模式,客户端和服务器逻辑可以同时运行,更能方便调试。打包时可以直接把客户端打包成APP,Server端打包成Linux服务器。

开发过程中代码上要能区分是服务器或者客户端还是模拟端。一般情况使用权威、主控或者模拟权限来确保代码在什么地方运行。对于两个客户端A和B,可以让其中一个作为监听服务器,另一个作为单纯客户端,也可以两者都是客户端,然后开发一个专有服务器。这两种情况在实际开发中都有使用,视具体情况而定。但总之,只要是Server那它就具有“权威”属性,在C++代码中可以用HasAuthority()来判断。对于一个客户端A,其权限即为“主控”,对于它来说,其他的客户端权限即为“模拟”,C++代码中可以使用IsLocallyControlled() 判断是否为本地客户端。

如若需要Actor具有同步功能,需要在该Actor蓝图中勾选Replicates属性,如下图所示:

在这里插入图片描述

C++代码中使用 bReplicated = true;

属性复制

需要具备同步功能的变量,可以通过设置其Replication来实现。

在这里插入图片描述

None即为不复制,该变量不具备同步功能。

Replicated为复制,该变量的值会被服务器同步到客户端,在各个客户端保持相同的值(C++中在变量上方添加
UPROPERTY(Replicated))。

RepNotify也具有复制功能,当变量设置为该选项时,蓝图会生成一个Notify函数,在变量的值改变时,服务器会将改变的值同步给客户端,如果客户端中该属性原来的值与同步过来的值不一样,则会调用Notify函数,执行一些定义的操作(C++中需手动定义Notify函数,并在需要复制的变量上方声明UPROPERTY(ReplicatedUsing = 函数名))。

Replication Condition:属性复制条件,其各个选项功能如下:

COND_InitiaIOnIy该属性仅在初始数据时尝试发送
COND_OwnerOnly该属性仅发送至actor的所有者
COND_SkipOwner该属性将发送至除所有者之外的每个连接
COND_SimuIatedOnIy该属性仅发送至模拟actor
COND_AutonomousOnIy该属性仅发送给自治(主控)actor
COND_SimuIatedOrPhysics该属性仅发送给自治(主控)actor
COND_lnitialOrOwner该属性将发送初始数据包,或者发送至actor所有者
COND_Custom该属性没有特定条件,但需要通过SetCustomIsActiveOverride得到开启/关

RPC

RPC即远程过程调用,适用于函数,有如下几种使用形式:

在这里插入图片描述

Not Replicated:不启用复制功能。

Multicast:多播,若在服务器调用,服务器将使该函数在所有客户端执行;若在客户端调用,函数将只在本地执行。

Run On Server:服务器或客户端均可调用,函数将在服务器上执行。

Run On owning Client:服务器或客户端均可调用,若在服务器调用,将在Actor所属客户端执行(单独服务器无客户端的话就在服务器上执行),若在客户端调用,则在本地客户端执行。

总的来说,服务器调用RPC所有权如下:

在这里插入图片描述

客户端调用RPC所有权如下:

在这里插入图片描述

举个利用RPC实现同步的简单例子,如果客户端播放一个蒙太奇动画,想实现这个动画所有端都能同步播放的话,可以写一个自定义事件MulticastPlayMontage,将其设为Multicast,直接调用PlayMontage方法;再写一个自定义事件ServerPlayMontage,设为Run On Server,调用MulticastPlayMontage事件:

在这里插入图片描述

在本地客户端中需要同步播放蒙太奇动画的地方直接调用ServerPlayMontage,方法将由客户端调用,在服务器执行,然后服务器又会执行MulticastPlayMontage方法多播给所有客户端,实现所有端的同步播放。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UE4(Unreal Engine 4)是一款强大的游戏开发引擎,它提供了多种网络功能,包括TCP客户端。 在UE4中,可以通过蓝图或C++代码实现TCP客户端。首先需要创建一个Socket对象并将其连接到服务器。可以使用Socket子系统来处理与TCP服务器的通信。 在连接建立之后,可以使用Socket对象发送和接收数据。可以使用Socket的Send()函数向服务器发送数据,使用Recv()函数接收服务器的响应数据。 在客户端代码中,可以根据游戏逻辑和需求,编写相应的处理逻辑。例如,可以使用线程来异步接收服务器的响应数据,并在主线程中处理接收到的数据。 同时,需要在客户端代码中处理TCP连接的错误和异常情况,以确保网络通信的稳定性和可靠性。可以使用Try/Catch块来捕获可能发生的异常,并进行相应的处理。 除了基本的TCP客户端功能,UE4还提供了其他更高级的网络功能,如RPC(Remote Procedure Call)和Replication(复制),用于处理远程函数调用和多人游戏中的数据同步等问题。 总的来说,UE4提供了方便易用的TCP客户端功能,开发人员可以根据自己的需求使用蓝图或C++代码编写相应的网络逻辑,实现与服务器的通信。 ### 回答2: UE4是一款流行的游戏引擎,它提供了强大的功能和工具,用于开发高质量的游戏和应用程序。UE4通过使用蓝图和C++编程语言来创建游戏逻辑和功能。 UE4中的TCP客户端是一种用于建立基于TCP/IP协议的网络通信的工具。TCP(传输控制协议)是一种可靠的连接型协议,它能够确保数据的可靠传输和顺序传递。TCP客户端可以与远程服务器进行通信,发送和接收数据。 在UE4中创建TCP客户端需要以下步骤: 1. 导入网络模块:首先,需要在UE4项目中导入网络模块,以在蓝图或代码中使用相应的网络功能。 2. 创建TCP套接字:通过使用UE4提供的套接字类创建一个TCP套接字对象。套接字是一种网络通信的接口,它可以在客户端和服务器之间建立连接。 3. 连接到服务器:使用套接字对象的Connect函数来连接到远程服务器。在连接之前,需要提供服务器的IP地址和端口号。 4. 发送和接收数据:一旦连接建立成功,可以使用套接字对象的Send和Receive函数来发送和接收数据。可以通过字符串或字节数组的方式发送和接收数据。 5. 关闭连接:当通信结束时,需要使用套接字对象的Close函数来关闭连接,并释放相关资源。 通过以上步骤,我们就可以在UE4中创建一个TCP客户端,实现与远程服务器的通信。这样可以打开许多可能性,比如实时多人游戏中的玩家之间的通信、在线排行榜的更新等等。TCP客户端在网络通信中具有可靠性和稳定性,因此在很多场景下都是一个重要的组件。 ### 回答3: UE4是一款强大的游戏开发引擎,支持使用TCP协议进行网络通信。下面是关于UE4 TCP客户端的详细说明: 首先,UE4提供了一系列的网络编程功能来实现TCP客户端。要创建一个TCP客户端,首先需要在项目中添加网络功能模块。然后,在游戏中创建一个Socket对象,该对象将用于与服务器进行通信。 接下来,需要通过Socket对象连接到服务器。在连接之前,需要指定服务器的IP地址和端口号。一旦连接成功,就可以通过Socket对象发送和接收消息。 要发送消息,可以使用UE4的Send方法,通过Socket对象将消息数据发送给服务器。要接收消息,可以使用UE4的Recv方法,通过Socket对象从服务器接收消息数据。使用这些方法可以实现与服务器的双向通信。 在实际应用中,可以根据游戏的需求和设计来使用TCP客户端。例如,可以在游戏中实现多人联机功能,通过TCP客户端来与其他玩家进行通信。还可以使用TCP客户端在游戏中获取服务器提供的数据,例如排行榜信息或者游戏状态更新等。 总结来说,UE4提供了丰富的网络编程功能,可以轻松实现TCP客户端。通过连接服务器、发送和接收消息,可以与服务器进行双向通信。这为游戏开发者提供了很多可能性,可以实现各种有趣的网络功能和游戏玩法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值