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



所以我刚刚开始在虚幻引擎中开发一个新项目,该项目旨在成为一个简单的联网多人游戏。到目前为止,我所做的是创建一个处理射弹生成的武器类,并在 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,所以我可以确保它实际工作。

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

我认为我发现的一个解决方法是将玩家角色的OnFire方法也设置为服务器 RPC,但这感觉这不是执行此操作的最佳方法。

谁能解释为什么会发生这种情况?

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

最新更新