Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

ue4-Network相关-rpc调用

$
0
0

蓝图 or c++ 的 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;
    }
    • 带验证的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 消耗更少流量,且调用也是安全的不会造成断开连接的情况。
作者:yangxuan0261 发表于2017/1/28 15:04:32 原文链接
阅读:47 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>