Итак, я только начал работать над новым проектом в Unreal, который предназначен для простой сетевой многопользовательской игры. На данный момент я создал класс оружия, который обрабатывает метательные снаряды и дает игроку персонажа экземпляр оружия на 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 для этого, чтобы я мог убедиться, что он действительно работает.
Эта реализация хорошо работает на сервере или Listen-сервере, но когда я вызываю ее с клиента, я получаю только локальный метод Fire
для Оружия. Клиент никогда даже не вызывает сервер RPC.
Обход, который я нашел, состоит в том, чтобы сделать метод OnFire
персонажа игрока также серверным RPC, но кажется, что это не лучший способ сделать это.
Может ли кто-нибудь объяснить, почему это происходит?