因此,我刚刚开始在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,但这似乎不是实现此目的的最佳方法。
有人可以解释为什么会这样吗?
答案 0 :(得分:1)
客户端只能在网络参与者上调用服务器RPC。例如,客户端拥有自己的PlayerController,因此您可以在其中添加一个RPC并调用它。如果您在服务器拥有的对象上调用它,就像我假设您的AWeapon actor是这样,日志将显示类似“无法在非拥有对象上调用RPC”的信息。