Нереальная ARPG: зачем сначала пытаться получить персонажа из контроллера - PullRequest
0 голосов
/ 06 октября 2018

В RPG-игре Unreal Action (пример проекта для Unreal Система игровых возможностей ) атрибут здоровья персонажа (игрока или ИИ) изменяется в URPGAttributeSet::PostGameplayEffectExecute().

Там AActor* SourceActor устанавливается через FGameplayAbilityActorInfo::AvatarActor.

SourceActor = Source->AbilityActorInfo->AvatarActor.Get()

Эта переменная используется для получения исходного символа (ARPGCharacterBase* SourceCharacter, производногокласс AActor), который необходим для нанесения урона.

Теперь - чтобы получить персонажа - вместо понижения прямо из SourceActor код пытается получить символ через его контроллер заранее;и просто, если это не удается, он использует SourceActor напрямую:

SourceActor = Source->AbilityActorInfo->AvatarActor.Get();
SourceController = Source->AbilityActorInfo->PlayerController.Get();
if (SourceController == nullptr && SourceActor != nullptr)
{
    if (APawn* Pawn = Cast<APawn>(SourceActor))
    {
        SourceController = Pawn->GetController();
    }
}

// Use the controller to find the source pawn
if (SourceController)
{
    SourceCharacter = Cast<ARPGCharacterBase>(SourceController->GetPawn());
}
else
{
    SourceCharacter = Cast<ARPGCharacterBase>(SourceActor);
}

Почему сделан обход с использованием контроллера?

  1. Это для обработки случая, когда снаряд это SourceActor?Так как снаряды не относятся к классу ARPGCharacterBase, то удручение не удастся.Однако я не вижу, где установлен контроллер для снаряда , когда он порождается: SpawnProjectileActor Кроме того, снаряд актер знает символ уже с переменной-членом Instigator.
  2. Если нет, то в чем преимущество того, чтобы сначала пытаться найти символ через его контроллер вместо простого понижения SourceActor?
...