문제 상황

애니메이션 연결 과정 중이었는데 실행하면 자꾸 엔진 터짐..

 

현재 실행 흐름 정리

트러블 슈팅 정리를 위해 간략하게 구조와 흐름을 설명하자면,

이 함수는 보스 캐릭터가 스폰될 때, BeginPlay()에서 호출되는 함수이다.

GAS를 사용하고 있어서 각 보스는 고유한 ID 값을 가지고 있고, 모듈화를 위해 각 ID 별 매칭된 DataAsset을 가지고 있다.

이 DataAsset에서는 각 보스별 ID 값과, 사용할 스켈레탈 메시, 애니메이션 블루프린트, BT, Ability 등을 가지고 있다.

나는 이 과정에서  ApplyBossPrimaryData()에서 이 데이터 에셋을 가져와서 보스의 스켈레탈 메시와 애니메이션 블루프린트를 연결해주고자 하였다.

 

관련 소스 코드

void ABaseBossCharacter::ApplyBossPrimaryData()
{
    if (!IsValid(LoadedBossData)) return;
    
    USkeletalMeshComponent* BossMesh = GetMesh();
    if (!IsValid(BossMesh)) return;
    
    USkeletalMesh* LoadedMesh = LoadedBossData->BossMesh.LoadSynchronous();
    if (IsValid(LoadedMesh))
    {
       BossMesh->SetSkeletalMesh(LoadedMesh);
    }
    else
    {
       LD_LOG(Log, TEXT("보스 메시 없음"));
       return;
    }
    
    if (BossMesh->GetSkeletalMeshAsset() != nullptr && !LoadedBossData->BossAnimBlueprint.IsNull())
    {
       if (UClass* AnimClass = LoadedBossData->BossAnimBlueprint.LoadSynchronous())
       {
          BossMesh->SetAnimInstanceClass(AnimClass);
          LD_LOG(Log, TEXT("ApplyBossData: AnimClass applied after Mesh validation."));
       }
    }
}

 

 

문제 상황에서의 애니메이션 블루프린트 노드 

그리고 보스의 애니메이션 블루프린트의 이벤트 창에서 다음과 같이 노드를 배치하였다.

 

이렇게 연결해주고 실행했더니

BossMesh->SetAnimInstanceClass(AnimClass);

이 줄에서 자꾸만 엔진이 튕기는 현상이 발생했다..

 

해결 과정

 코드 상에서는 전혀 문제가 될 부분이 보이지 않아서 애니메이션 블루프린트의 노드들을 하나씩 디버깅해봤다..

근데 저 Has Matching Gameplay Tag 노드에서 터지는걸 발견..

여기서 뭔가 저 Has Matching Gameplay Tag 노드의 Target 핀의 타입이 좀 이상하다는걸 느꼈다.

BossCharacter가 AbilitySystem Component를 가지고 있는데 왜 또 굳이 저 상아색? 노란색 핀으로 타입이 바뀌는지?

그래서 다시 Has Matching Gameplay Tag 노드를 검색해보았는데 이렇게 입력, 출력핀이 달려있는 다른 노드를 찾았다..
얘로 넣어주니 정상적으로 잘 작동한다.. 휴..

 

최종 애니메이션 블루프린트(문제해결)

최종 애니메이션 노드는 위의 이미지와 같다..

 

배운 내용 총정리

이 두 노드 절대 혼동하지 말 것.

 

찾아보니 두 노드의 차이점은 아래와 같다

 

위의 노드는 순수 노드라고 한다. 실행선이 없고, 이 노드는 뒤에 연결된 노드가 결과값을 요구할 때마다 매번 실시간으로 계산을 수행한다.

아래의 노드는 비순수 노드라고 한다. 실행선이 연결되어야 작동하고, 실행선이 노드를 통과하는 순간 딱 한 번만 계산을 수행한다. 특정 이벤트가 일어날 때 순차적으로 태그 검사해야하는 상황에서 사용한다.

 

그리고 아래 노드의 편지봉투 같은 마크는 인터페이스 메세지를 뜻한다.

대상이 태그 인터페이스를 가지고 있는지 확실하지 않은 액터나 컴포넌트를 연결해도, 엔진에서 태그 인터페이스가 있는지 확인한다음에 실행한다는 뜻이다. (안전성 측면에서 유용한듯 싶다) 

 

위의 노드는 인터페이스 자체를 의미한다. 그래서 엔진이 따로 확인하는 과정이 없어서 연결하려는 대상이 확실하게 인터페이스를 가지고 있어야하거나 형변환이 된 상태에서만 사용해야한다고 한다.