ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] CDO Constructor fail to find
    Unreal Engine 5._ 2023. 9. 6. 17:49

    언리얼 개발 도중, 개발 작업물을 안드로이드 환경에서 실행하는 도중 제목과 같은 문제가 발생했습니다.

    두 가지 해결 방안을 찾았는데, 이에 대해 공유해보고자 합니다.

     

    본문은 아래 Unreal Development Community의 글을 참조하고 있습니다.

    [Feature Request] bDontLoadBlueprintOutsideEditor=false by default

     


     

    1. 문제

     

    문제가 되는 코드의 예시는 다음과 같습니다.

    UObject* MyObj = 
        ConstructorHelpers::FObjectFinder<UObject>(
            TEXT("Blueprint'/Game/MyContent/MyBlueprint.MyBlueprint'"));
    
    UBlueprint* BP_MyObj = Cast<UBlueprint>(MyObj);
    
    FTransform SpawnTransform;
    GetWorld()->SpawnActor<AActor>(BP_MyObj->GeneratedClass, SpawnTransform);

    위 코드는 Blueprint객체를 읽어와서 스폰하는 코드입니다.

    실제로 저 코드를 함께 사용할 경우 실행되지 않으니, 의사코드의 느낌으로 봐주시기 바랍니다.

    (ConstructorHelpers는 생성자에서만 사용 가능하고, SpawnActor는 생성자에서 사용할 수 없습니다.)

    위와 같은 형태의 코드는 Editor에서 실행했을 때는 문제가 없었으나, 환경을 안드로이드로 바꾸자 문제가 발생했습니다.


    2. 원인

     

    언리얼 프로젝트의 Config폴더에 있는 DefaultEditor.ini에는 다음과 같은 설정이 있습니다.

    bDontLoadBlueprintOutsideEditor=true

    이는 이름 그대로, Editor환경 밖에서 Blueprint의 로드를 막는 여부입니다.

    기본 값은 true로 설정되어 있습니다.


    3. 해결 (bDontLoadBlueprintOutsideEditor 수정)

     

    원인이 DefaultEditor.ini의 bDontLoadBlueprintOutsideEditor이었으니, 이 값을 false로 바꿔주는 것으로 해결 할 수 있습니다.

    하지만, 기본 값이 true로 설정된 데에는 이유가 있을 것 같아 찾아본 결과, 서론의 링크를 찾을 수 있게 되었습니다.


    4. 해결 (Class 직접 이용)

     

    언리얼 엔진에서, 레벨에 스폰되는 액터들은 원본 액터의 복사본 입니다.

    원본 액터가 미리 생성되어 있고, 이 복사본을 이용하는 것으로 생성 시간을 단축할 수 있고, 다수의 같은 액터를 이용하는 데에 부담이 적어지도록 하는 것 입니다.

     

    문단 1(문제)의 코드는, 원본 Blueprint를 직접적으로 참조 후 생성된 클래스(Generated class)를 이용하는 방식입니다.

    바로 위 문단의 엔진의 작동 방식을 생각해본다면, 이는 적절하지 않다고 추측할 수 있습니다.

    이에 소개할 다음 코드는, 클래스를 직접 참조하는 방식입니다.

    UClass* MyObj = 
        ConstructorHelpers::FObjectFinder<UClass>(
            TEXT("Class'/Game/MyContent/MyBlueprint.MyBlueprint_C'"));
    
    FTransform SpawnTransform;
    GetWorld()->SpawnActor<AActor>(Class, SpawnTransform);

    위 코드는 Blueprint로부터 생성된 클래스를 참조하는 코드입니다.

    구체적으로 MyObj의 형식이 바뀌었고, ConstructorHelpers가 참조하는 경로가 바뀌었습니다.

     


     

    이번 글의 제목과 본문은 CDO Constructor를 지정하고 있습니다.

    하지만 CDO외에도 Blueprint를 참조하는 코드 (StaticLoad등..)에는 위와 같은 사항이 적용됩니다.

    이 글이 도움이 되셨기를 바랍니다.

     

    감사합니다.

    댓글

Designed by Tistory.