В 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);
}
Почему сделан обход с использованием контроллера?
- Это для обработки случая, когда снаряд это
SourceActor
?Так как снаряды не относятся к классу ARPGCharacterBase
, то удручение не удастся.Однако я не вижу, где установлен контроллер для снаряда , когда он порождается: Кроме того, снаряд актер знает символ уже с переменной-членом Instigator
. - Если нет, то в чем преимущество того, чтобы сначала пытаться найти символ через его контроллер вместо простого понижения
SourceActor
?