由于某种原因,客户端未调用服务器 RPC

Posted

技术标签:

【中文标题】由于某种原因,客户端未调用服务器 RPC【英文标题】:Server RPC is not called by client for some reason 【发布时间】:2018-06-29 14:43:55 【问题描述】:

所以我刚刚开始在 Unreal 中开发一个新项目,该项目旨在成为一款简单的联网多人游戏。到目前为止,我所做的是创建一个武器类来处理弹丸的产生,并在 BeginPlay 上为玩家角色提供一个武器实例。

武器类很简单,但我遇到的问题是我用于生成射弹的服务器 RPC 不是从客户端调用的,而是从服务器调用的。

我是这样称呼这个 RPC 的:

玩家角色有一个OnFire 方法,绑定到一个输入动作。 然后在玩家拥有的当前武器上调用Fire 方法。

// Bind fire event
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AMultiplayerFPSCharacter::OnFire);

 ...

 void AMultiplayerFPSCharacter::OnFire()
 
      // Call our weapon's fire method
      if (CurrentWeapon)
      
          CurrentWeapon->Fire(GetControlRotation());
      
 

现在,武器的 Fire 方法只是调用服务器 RPC 来实际处理生成射弹。

 void AWeapon::Fire(const FRotator SpawnRotation)
 
      UE_LOG(LogTemp, Warning, TEXT("LOCAL Fire"));


      Server_Fire(SpawnRotation);
 

 void AWeapon::Server_Fire_Implementation(const FRotator SpawnRotation)
 
    UE_LOG(LogTemp, Warning, TEXT("SERVER RPC: Called RPC"));


    // try and fire a projectile
    if (ProjectileClass != NULL)
    
        // Spawn Projectile
        ....
    
 

我还有服务器 RPC 的验证方法,它只是为此返回 true,因此我可以确保它确实有效。

这个实现在服务器或 Listen-Server 上都很好,但是当我从客户端调用它时,我只能得到 Weapon 上的本地 Fire 方法。客户端甚至从不调用服务器 RPC。

我想我发现的一个解决方法是让玩家角色的OnFire 方法也成为服务器 RPC,但感觉这不是最好的方法。

谁能解释为什么会这样?

【问题讨论】:

【参考方案1】:

客户端只能在网络拥有的参与者上调用服务器 RPC。例如,一个客户端网络拥有他的 PlayerController,因此您可以向其中添加一个 RPC 并调用它。如果您在服务器拥有的对象上调用它,就像我假设您的 AWeapon 演员一样,日志将显示类似“无法在非拥有的对象上调用 RPC”。

【讨论】:

是的,这最终成为了问题,我不得不改变我在玩家身上生成武器的方式,以确保它只发生在服务器上,以及设置武器的所有者!感谢您的评论 @BenjaFriend 你能发布一个你的解决方案的例子吗?

以上是关于由于某种原因,客户端未调用服务器 RPC的主要内容,如果未能解决你的问题,请参考以下文章

Java枚举类型在RPC调用时由于版本不一致遇见的问题

稳定性 耗时 监控原因分析-- dubbo rpc 框架 的线程池,io 连接模型. 客户端,服务端

干货RMI与RPC的区别

RabbitMQ学习 (远程过程调用(RPC))

常用的RPC框架

RPC 框架原理详解