ue4 rpc调用不起作用

在项目开发过程中,遇到了一个问题,在Pawn派生类的蓝图中,在Event Possessed事件处理过程中,出发一个自定义事件(记为CustomEvent),该自定义事件标记为 Multicast,但是遇到一个奇怪的问题,当地客户端登陆后,收不到CustomEvent事件,但是如果我在触发CustomEvent的时候加一个延迟,客户端就可以收到CustomEvent事件,这里很容易就联想,服务器和客户端需要等到一个时机以后才可以正常进行rpc调用。那这个具体的时机是什么呢,我们看源码来分析一下。

在调试源码的过程中,我发现第一次调用失败,是因为如下函数返回了:

void UIpNetDriver::ProcessRemoteFunction(class AActor* Actor, UFunction* Function, void* Parameters, FOutParmRec* OutParms, FFrame* Stack, class UObject* SubObject )

for (int32 i=0; i<ClientConnections.Num(); ++i)
{
Connection = ClientConnections[i];
if (Connection && Connection->ViewTarget)
{

服务器在处理远程调用时,遍历客户端连接,第一次调用CustomEvent时,Connection->ViewTarget是NULL,导致本次远程调用失败,那Connection->ViewTarget为什么会是NULL呢,继续分析发现Connection->ViewTarget是在如下函数中赋值的,

int32 UNetDriver::ServerReplicateActors(float DeltaSeconds)

但是只有在以下判断成功的情况下才进行, 

AActor* OwningActor = Connection->OwningActor;
if (OwningActor != NULL && Connection->State == USOCK_Open && (Connection->Driver->Time - Connection->LastReceiveTime < 1.5f))
{

继续调试,发现第一次调用CustomEvent时,Connection->OwningActor是空的,间接导致Connection->ViewTarget为NULL

继续跟踪发现Connection->OwningActor被赋值的地方是在void APlayerController::SetPlayer( UPlayer* InPlayer )进行的,而其他客户端登陆时,服务器是在收到客户端的NMT_Join消息,会Spawn PlayerController,从而调用SetPlayer。 

rpc不起作用的原因就在于在Pawn派生类的蓝图收到Possessed事件时,Connection->ViewTarget还没有被赋值


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值