由于某种原因,客户端未调用服务器 RPC
Server RPC is not called by client for some reason
所以我刚刚开始在 Unreal 中开发一个新项目,该项目旨在成为一个简单的联网多人游戏。到目前为止,我所做的是制作一个 Weapon class 来处理射弹的生成,并在 BeginPlay 上为玩家角色提供一个武器实例。
武器 class 很简单,但我遇到的问题是我用于生成射弹的服务器 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 的验证方法,它只是 returns 正确,所以我可以确保它确实有效。
这个实现在服务器或 Listen-Server 上都很好,但是当我从客户端调用它时,我只得到武器上的本地 Fire
方法。客户端甚至从不调用服务器 RPC。
我认为我找到的一个变通方法是将玩家角色的 OnFire
方法也设为服务器 RPC,但感觉这并不是执行此操作的最佳方法。
谁能解释为什么会这样?
客户端只能调用网络拥有的actor 上的服务器RPC。例如,客户端网络拥有他的 PlayerController,因此您可以向其添加 RPC 并调用它。如果你在服务器拥有的对象上调用它,就像我假设你的 AWeapon actor 一样,日志将显示类似 "can't call RPC on non-owned object".
的内容
所以我刚刚开始在 Unreal 中开发一个新项目,该项目旨在成为一个简单的联网多人游戏。到目前为止,我所做的是制作一个 Weapon class 来处理射弹的生成,并在 BeginPlay 上为玩家角色提供一个武器实例。
武器 class 很简单,但我遇到的问题是我用于生成射弹的服务器 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 的验证方法,它只是 returns 正确,所以我可以确保它确实有效。
这个实现在服务器或 Listen-Server 上都很好,但是当我从客户端调用它时,我只得到武器上的本地 Fire
方法。客户端甚至从不调用服务器 RPC。
我认为我找到的一个变通方法是将玩家角色的 OnFire
方法也设为服务器 RPC,但感觉这并不是执行此操作的最佳方法。
谁能解释为什么会这样?
客户端只能调用网络拥有的actor 上的服务器RPC。例如,客户端网络拥有他的 PlayerController,因此您可以向其添加 RPC 并调用它。如果你在服务器拥有的对象上调用它,就像我假设你的 AWeapon actor 一样,日志将显示类似 "can't call RPC on non-owned object".
的内容