您的位置:首页 > 产品设计 > UI/UE

ue4 rpc调用不起作用

2016-05-24 15:57 183 查看
在项目开发过程中,遇到了一个问题,在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还没有被赋值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: