代码之家  ›  专栏  ›  技术社区  ›  BenjaFriend

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

  •  0
  • BenjaFriend  · 技术社区  · 6 年前

    因此,我刚刚开始在一个新的项目在虚幻,这是一个简单的网络多人游戏。到目前为止,我所做的是创建一个武器类来处理炮弹的生成,并在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());
          }
     }
    

    现在,武器是 方法只需调用服务器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,这样我就可以确保它实际工作。

    这个实现在服务器或侦听服务器上都很好,但是当我从客户端调用它时,我只得到本地的 武器上的方法。客户端甚至从不调用服务器rpc。

    我想我找到的一个办法是 昂菲尔 方法也可以是服务器rpc,但这似乎不是执行此操作的最佳方法。

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bas in het Veld    6 年前

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