蓝图 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,只会在当前客户端上执行
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调用。他的流程是:
- 客户端调用 MyServerFunc 方法
- 服务器执行 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特效
- 先调用一个 Run On Server 方法 CallServerSpawnEffect
- CallServerSpawnEffect 再调用一个 Multicast 方法 MulticastSpawnEffect
- MulticastSpawnEffect 全球广播 Spawn 一个 Not Replicated 的 Actor特效,这样所有客户端都可以看见特效
- 可以进一步优化,服务端不用展示特效,判断一下
- 先调用一个 Run On Server 方法 CallServerSpawnEffect
rpc调用的可靠性
- 方法调用的 Reliable or Unreliable,官方的解释是:
- Reliable:保证调用。但可能会产生 延迟 和 更多流量。要避免经常使用 Reliable,特别是每帧调用的 Tick 中,因为引擎内部的 Reliable Events 缓冲池可能会溢出,当发这种情况发生时,当前客户端将会和服务器 断开连接。
- Unreliable:不一定会调用。在 网络丢包 或者 待发送的消息队列中严重拥堵。因此比 Reliable 消耗更少流量,且调用也是安全的不会造成断开连接的情况。
作者:yangxuan0261 发表于2017/1/28 15:04:32 原文链接
阅读:47 评论:0 查看评论