개인 연습 프로젝트, 알고리즘 2문제
FVector2D Value = InValue.Get<FVector2D>();
float Value = InValue.Get<float>();
FInputActionValue는 Enhanced Input에서 InputActio의 갑을 담아서 넘겨주는 구조이다.
원하는 값을 가져와 Get<자료형>()으로 사용할 수 있다.
즉, FInputActionValue자체가 이동값이나 회전값인 것이 아니라, InputAction의 실제 값을 꺼내기 위한 포장지에 가깝다.
FVector Direction = currentLockOnTarget->GetActorLocation() - GetActorLocation();
Direction.Z = 0.0f;
const FRotator TargetRotation = Direction.Rotation();
TargetLocation - StartLocation은 나에게서 타겟으로 향하는 벡터를 만든다. 이 벡터는 거리 정보도 포함하고 있지만, 핵심은 어느 방향을 바라봐야 하는가이다.
Direction.Rotation()은 이 방향 벡터를 바라보기 위한 회전값으로 변환한다.
Direction.Z = 0.0f를 하는 이유는 캐릭터 몸을 위아래로 기울이지 않고, 수평 방향(Yaw)만 돌리기 위해서이다. 점프 중이어도 캐릭터 몸은 타겟 방향으로 좌우 회전만 하면 되기 때문에 Z를 제거한다.
abilitySystemComponent->GiveAbility(
FGameplayAbilitySpec(AbilityClass, 1, INDEX_NONE, this)
);
GiveAbility는 Ability를 바로 실행하는 함수가 아니다.
ASC에게 "이 캐릭터는 이 Ability를 사용할 수 있다"고 등록하는 함수다.
비유하면 스킬을 사용하는 것이 아니라, 스킬 목록에 스킬을 넣는 단계다.
FGameplayAbilitySpec(AbilityClass, 1, INDEX_NONE, this)
AbilityClass = 등록할 Ability 클래스
1 = Ability Level
INDEX_NONE = InputID를 사용하지 않음
this = SourceObject, 이 Ability를 준 주체 또는 참고 객체
즉 이 코드는 AbilityClass를 레벨 1짜리 Abillity로 ASC에 등록한다는 뜻
void UGAPlayerAttack::ActivateAbility(
const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
}
ActivateAbility()는 Ability가 실제로 실행될 때 호출되는 함수다.
여기 안에 공격 Trace, 회피 무적, Montage 재생, GameplayEffect 적용 같은 실제 스킬 내용을 작성한다.
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
EndAbility를 호출하지 않으면 Abiliity가 실행 중 상태로 남을 수 있기때문에 예외처리 하는 return 부분에 EndAbility를 다 적어줘야한다.
Ability는 Actor가 아니기 때문에 GetActorLocation()) 같은 Actor 함수를 직접 쓸 수 없다.
그래서 ActorInfo에서 실제 월드에 존재하는 캐릭터를 가져와야 한다.
AActor* AvatarActor = ActorInfo->AvatarActor.Get();
ACombatCharacterBase* OwnerCharacter = Cast<ACombatCharacterBase>(AvatarActor);
AvatarActor는 실제 월드에서 움직이고 공격하는 Actor다
현재 프로젝트에서는
abilitySystemComponent->InitAbilityActorInfo(this, this);
이렇게 초기화 했기 때문에 OwnerActor와 AvatarActor가 둘 다 플레이어 캐릭터다.
나중에 멀티플레이 구조에서는 OwnerActor가 PlayerState, AvatarActor가 Character가 되는 경우도 있다.