Game Develop

[UE5] 프로젝트 오픈 시, 75%에서 멈췄던 현상 (ConstructorHelpers) 본문

UnrealEngine5/이것저것

[UE5] 프로젝트 오픈 시, 75%에서 멈췄던 현상 (ConstructorHelpers)

MaxLevel 2023. 1. 13. 20:11

C++코드 이것저것 시험하다가 한번 에디터 껐다 켰는데, 프로젝트를 여는 도중에 75%에서 더이상 진행이 안되는 현상이 발생했었다.

작업관리자에서 확인해보니 아예 CPU할당이 0%이길래 바로 관련해서 구글링을 하며 관련 해결글을 찾아봤다.

이것저것 찾아본 결과, 일단 내가 생성한 블루프린트파일을 하나씩 삭제하면서 에디터를 켜보기로 했다.

 

결과적으로 플레이어캐릭터에 관한 CPP파일을 상속받는 블루프린트파일을 삭제하고 프로젝트를 열었더니 다행히 잘 열리긴 했다.

그러나 기존처럼 똑같이 셋팅하고 언리얼에디터를 껐다키면 마찬가지로 75%에서 멈췄다.

약간 여기서 C++코드에 문제가 있지 않나...라는 생각이 들었다.

 

아래는 메인플레이어캐릭터의 생성자 코드이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
AMainPlayer::AMainPlayer() :
    m_ArmLengthTo(0.0f),
    m_ArmRotationTo(FRotator::ZeroRotator),
    m_ArmLengthSpeed(0.0f),
    m_ArmRotationSpeed(0.0f),
    m_WalkSpeed(300.0f),
    m_RunSpeed(700.0f),
    m_CurSpeed(0.0f),
    m_bIsRun(false)
{
    // Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;
 
    GetCapsuleComponent()->SetCapsuleHalfHeight(100.0f);
    GetCapsuleComponent()->SetCapsuleRadius(30.0f);
 
    // 메쉬 로드.
    static ConstructorHelpers::FObjectFinder<USkeletalMesh>
        tempMesh(TEXT("SkeletalMesh'/Game/MainPlayerAsset/Mesh/MainPlayer'"));
 
    if (tempMesh.Succeeded())
    {
        GetMesh()->SetSkeletalMesh(tempMesh.Object);
        GetMesh()->SetRelativeLocationAndRotation(FVector(00-90), FRotator(0-900)); // 
    }
 
    //애니메이션 모드 설정
    GetMesh()->SetAnimationMode(EAnimationMode::AnimationBlueprint);
    ConstructorHelpers::FClassFinder<UAnimInstance> <---- 
        MainPlayer_AnimInstance(TEXT("AnimBlueprint'/Game/Blueprints/ABP_MainPlayer.ABP_MainPlayer_C'"));
 
    if (MainPlayer_AnimInstance.Succeeded())
    {
        GetMesh()->SetAnimInstanceClass(MainPlayer_AnimInstance.Class);
    }
 
 
    initControlSetting();
    m_CurState = EMainPlayerStates::Idle;
 
    temp = { 3 };
}
cs
 

 

애니메이션 모드 설정하는부분을 보면, 생성자에서만 호출할 수 있는 ConstructorHelpers를 통해 ABP_MainPlayer라는 AnimInstance파일을 찾아서 메쉬에다가 Set해주는 부분이 있다.

원래는 코드로 하지않고 그냥 블루프린트파일에서 직접 설정했었는데, 역시 코드로 명시적으로 보이는게 좋을 것 같아서 코드로 작성해놨다.

근데 이 부분에서 static이 붙어있을 때, 즉

static ConstructorHelpers::FClassFinder<UAnimInstance> 
MainPlayer_AnimInstance(TEXT("AnimBlueprint'/Game/Blueprints/ABP_MainPlayer.ABP_MainPlayer_C'"));

 

이렇게 작성되어있을 때 문제가 발생하는걸 알 수 있었다. static을 붙이고 빌드 후, 에디터를 끄고 다시 프로젝트를 키면 75%에서 멈추는 현상이 발생하는걸 확인했다.

 

사실 아직 정확히 원인파악은 하지 못했다. 다른 사람들의 코드를 보면 생성자에서 보통 저런 블루프린트 인스턴스라던가 아니면 메쉬를 로드할 때  static ConstructorHelpers로 보통 호출하고들 한다.

 

로드해야하는 애셋의 경로를 프로그래머가 정확히 알고 있고, 해당 오브젝트 생성시 일부분으로 설정하는 경우. ConstructorHelpers라는 특수클래스가 사용되고, 클래스 생성 단계 도중 오브젝트 혹은 오브젝트 클래스를 찾게 해준다.

생성자 이외에서 에셋이나 클래스를 로드하고싶을 경우, LoadObject같은 클래스를 사용하면된다.

사실 이러한 부분들에서도 상당히 디테일하게 나뉘어져 있어서 꽤 복잡하다.

이런것도 공식문서를 바탕으로, 사람들의 경험에 기반한 정리글을 보는게 제일 좋다. 

 

어쨌든 정확한 원인파악은 못해서 상당히 찝찝하지만, 보통 이런 경우 계속해서 엔진을 사용하다보면 깨우치는 경우가 많다. DirectX11을 할 때도 그랬고, 아직 해당 구조에 익숙하지 않은상태에서 지금 당장 일일이 다 파악하려고 하면 시간이 너무 많이 소비된다는 경험을 수없이 많이 경험했기 때문에 일단은 글만 남겨놓고, 나중에 확실히 알면 글을 수정할것이다.

 

 

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/Assets/ReferencingAssets/

 

애셋 참조

 

docs.unrealengine.com