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

时间:2018-06-29 14:43:55

标签: c++ rpc unreal-engine4

因此,我刚刚开始在Unreal中进行一个新项目,该项目旨在成为一个简单的联网多人游戏。到目前为止,我所做的是制作一个Weapon类,用于处理弹丸的生成,并为玩家角色提供BeginPlay上的武器实例。

武器类很简单,但是我遇到的问题是,我没有从客户端调用服务器,而仅从服务器调用了用于生成弹丸的Server 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方法只是调用Server 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
        ....
    }
 }

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

此实现在服务器或Listen-Server上都很好,但是当我从客户端调用它时,我仅在Weapon上获得了本地Fire方法。客户端甚至从未调用服务器RPC。

我想我发现的一种解决方法是也将播放器角色的OnFire方法也用作服务器RPC,但这似乎不是实现此目的的最佳方法。

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

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