Сервер RPC по какой-то причине не вызывается клиентом - PullRequest
0 голосов
/ 29 июня 2018

Итак, я только начал работать над новым проектом в 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, но кажется, что это не лучший способ сделать это.

Может ли кто-нибудь объяснить, почему это происходит?

1 Ответ

0 голосов
/ 01 июля 2018

Клиент может вызывать RPC-сервер только на сетевом актере. Например, клиент владеет сетью своего PlayerController, поэтому вы можете добавить к нему RPC и вызвать его. Если вы вызываете его для объекта, принадлежащего серверу, как я предполагаю, что ваш актер AWeapon есть, в журнале будет отображаться что-то вроде «не могу вызвать RPC для объекта, не принадлежащего».

...