Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 110
Нужно, чтобы метод OnRep_MyReplicatedProperty(), который вызывается при репликации соответствующей переменной MyReplicatedProperty, выполнял часть функциональности на всех клиентах, а часть только на Owner'е Actor'а, полем которого является данная реплицируемая переменная.
Не нахожу, как проверить, на Owning клиенте ли выполняется код?
Предполагаю, что это должно быть как-то аналогично проверке, на сервере ли выполняется код: if (Role == ROLE_Authority)
Спасибо.
Аватара пользователя
Пользователь
Сообщения: 110
Ближайшее, что встретилось - проверка на (Role == ROLE_AutonomousProxy), но не вполне понятно, будет ли эта проверка срабатывать ДЛЯ ВСЕХ акторов, у которых Owner'ом является контроллер пешки данного игрока? И будет ли срабатывать это условие ТОЛЬКО для таких акторов? В документации эта и другие роли описаны опираясь на возможность вызова RPC-методов, поэтому как-то неоднозначно.
Аватара пользователя
Тех. администратор
Сообщения: 367
Насколько я помню/понимаю, если актор не является Pawn-ом, управляемым в данный момент PlayerController-ом игрока, то в сетевом плане принадлежит он серверу (если отбросить всякие крайние случай, вроде акторов, заспауненых локально или с отключенной связью).
Таким образом, с точки зрения сети они все равны.
Вполне возможно, что я в корне ошибаюсь, и было-бы очень полезно это дело как-то выяснить, но мне всё лень.
Аватара пользователя
Пользователь
Сообщения: 110
Мне интересно как раз в приложении к пешкам (в мультиплеере). Нужно выстрел отрабатывать на сервере, но UI перерисовать нужно только у owner'а. В меру возможностей по времени проверил. Вроде моё предположение об (Role == ROLE_AutonomousProxy) таки верно. Т.е.:
    * ROLE_Authority имеет серверная версия игрового объекта,
    * ROLE_AutonomousProxy - версия на клиентской стороне игрока, управляющего данной пешкой,
    * а ROLE_SimulatedProxy - на всех других игроках, которые эту пешку просто могут видеть.

UPDATED: Аннет, ... Не работает для акторов, заспауненных на сервере (возможно причина как раз в том, о чём писал MOZGIII). Несмотря на то, что им установлена owner-пешка:

AActor* NewGun = GetWorld()->SpawnActor<AMyActorGun>(Class, Loc, Rot, Params);
NewGun->SetOwner(OwnerPawn);


почему-то в методе OnRep_MyGunSomeVar(), объявленном в классе AMyActorGun, Role всегда равно ROLE_SimulatedProxy ...
Последний раз редактировалось SaShka 14 сен 2015, 13:13, всего редактировалось 1 раз.
Аватара пользователя
Тех. администратор
Сообщения: 367
SetOwningPawn - это вообще откуда?
Аватара пользователя
Пользователь
Сообщения: 110
MOZGIII писал(а):
SetOwningPawn - это вообще откуда?

Спасибо за замечание. Исправил. Речь шла о SetOwner(..).
Аватара пользователя
Пользователь
Сообщения: 110
Решил вопрос используя такую вспомогательную функцию:

Код:
bool IsActorLocallyControlled(const AActor* Actor)
{
    auto* Owner = Cast<APawn>(Actor->GetOwner());
    if (!Owner)
        return false;

    return Owner->IsLocallyControlled();
}


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница