ue4-Network相关-rpc调用


蓝图的Rpc调用

  • Run On Server(蓝图)

  • 蓝图中如果指定这个方法为 Run On Server,那么只会在服务端执行,客户端不会执行,比如spawn一个粒子特效,只会在服务端生产。如果此时需要其他客户端也也可以生产这个粒子特效,可以在粒子特效蓝图中勾选复制(Class Default -> Replication -> Replicates : checked)

  • Events Replicates 选择:

  • Not Replicated:默认值,只会在当前调用的客户端或服务器上执行
  • Multicast:如果在服务器上调用,会同步调用所有连接的客户端;如果客户端调用,将会视为 Not Replicated,只会在当前客户端上执行
  • Run On Server:如果在服务端调用,只会在服务端上执行;如果在客户端调用,将会远程调用到服务器上的这个方法,这是比较基础的向服务器发送数据的方法。
  • Run On Owning Client:如果在服务端调用,会在拥有该Actor的客户端上调用;如果在客户端调用,将会视为 Not Replicated,只会在当前客户端上执行
  • 参考:https://docs-origin.unrealengine.com/latest/INT/Gameplay/HowTo/Networking/ReplicateFunction/Blueprints/index.html

  • c++的Rpc调用

    • Server标记(c++)

        UFUNCTION(Reliable, Server, WithValidation)
            void MyServerFunc(int32 health);
        void MyServerFunc_Implementation(int32 health);
        bool MyServerFunc_Validate(int32 health);
    
        void AMyNetCharacter::MyServerFunc_Implementation(int32 health)
    {
        FString msg = FString::Printf(TEXT("--- MyServerFunc_Implementation health:%d, role:%d"), health, (int32)Role);
            GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, *msg);
    }
    
    bool AMyNetCharacter::MyServerFunc_Validate(int32 health)
    {
        FString msg = FString::Printf(TEXT("--- MyServerFunc_Validate health:%d"), health);
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, *msg);
        /*if (health < 222)
            return false;*/
        return true;
    }
     
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 带验证的rpc调用。他的流程是:

    1. 客户端调用 MyServerFunc 方法
    2. 服务器执行 MyServerFunc_Validate 方法进行验证
      • return true 表示通过,则可以执行服务端中的 MyServerFunc_Implementation 方法,然后可以在这里做变量赋值(这个变量是Replication Var)同步给其他客户端。
      • return false 表示不通过 ,不会执行 MyServerFunc_Implementation 方法,同时也会 断掉 当前调用 MyServerFunc 方法的客户端的连接。
  • c++中的方法标记(对应蓝图中的Events Replicates)选择:

    • 默认不标记则为 Not Replicated
    • NetMulticast
    • Server
    • Client
  • 参考:https://docs-origin.unrealengine.com/latest/INT/Gameplay/Networking/Actors/RPCs/index.html

  • rpc广播调用

    • 客户端如果想调用一个方法然后同步调用其他 所有客户端和服务器,不能直接调用一个 Multicast 方法,必须先调用一个服务器上的方法 Run On Server,然后在调用 Multicast 方法。例如 Spawn 一个 Not Replicated 的 Actor特效
      1. 先调用一个 Run On Server 方法 CallServerSpawnEffect
        这里写图片描述
      2. CallServerSpawnEffect 再调用一个 Multicast 方法 MulticastSpawnEffect
        这里写图片描述
      3. MulticastSpawnEffect 全球广播 Spawn 一个 Not Replicated 的 Actor特效,这样所有客户端都可以看见特效
        这里写图片描述
      4. 可以进一步优化,服务端不用展示特效,判断一下
        这里写图片描述

    rpc调用的可靠性

    • 方法调用的 Reliable or Unreliable,官方的解释是:
      • Reliable:保证调用。但可能会产生 延迟更多流量。要避免经常使用 Reliable,特别是每帧调用的 Tick 中,因为引擎内部的 Reliable Events 缓冲池可能会溢出,当发这种情况发生时,当前客户端将会和服务器 断开连接
      • Unreliable:不一定会调用。在 网络丢包 或者 待发送的消息队列中严重拥堵。因此比 Reliable 消耗更少流量,且调用也是安全的不会造成断开连接的情况。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值