글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자입니다

 

목차

     

     


     

     

    GetDefault, GetMutableDefault


     

     

    GetDefault

     

     

    /**
     * Gets the default object of a class.
     *
     * In most cases, class default objects should not be modified. This method therefore returns
     * an immutable pointer. If you need to modify the default object, use GetMutableDefault instead.
     *
     * @param Class - The class to get the CDO for.
     *
     * @return Class default object (CDO).
     *
     * @see GetMutableDefault
     */
    template< class T > 
    inline const T* GetDefault(UClass *Class)
    {
    	check(Class->GetDefaultObject()->IsA(T::StaticClass()));
    	return (const T*)Class->GetDefaultObject();
    }

     

     

    예시 코드 1: 읽기 전용 접근 (GetDefault)

    UClass* PlayerClass = AMyPlayerCharacter::StaticClass();
    const AMyPlayerCharacter* DefaultPlayer = GetDefault<AMyPlayerCharacter>(PlayerClass);
    
    UE_LOG(LogTemp, Log, TEXT("Default HP: %f"), DefaultPlayer->Health);

     

    이 예시에서는

    • AMyPlayerCharacter의 CDO를 읽어
    • 기본 체력값(Health)을 출력합니다.

    이 CDO의 Health 값을 변경하려고 하면 (const 포인터이기 때문에) 컴파일 에러가 납니다.

     

     

    예시 코드2: 읽기 전용 접근 (GetDefault)

    const FString& TexturePath = GetDefault<UCustomTextureSettings>()->CustomTexturePath;

     

     

    GetMutableDefault

     

     

    /**
     * Gets the mutable default object of a class.
     *
     * @param Class - The class to get the CDO for.
     *
     * @return Class default object (CDO).
     *
     * @see GetDefault
     */
    template< class T > 
    inline T* GetMutableDefault(UClass *Class)
    {
    	check(Class->GetDefaultObject()->IsA(T::StaticClass()));
    	return (T*)Class->GetDefaultObject();
    }

     

     

    예시 코드: 수정 가능한 접근 (GetMutableDefault)

    UClass* PlayerClass = AMyPlayerCharacter::StaticClass();
    AMyPlayerCharacter* MutableCDO = GetMutableDefault<AMyPlayerCharacter>(PlayerClass);
    
    MutableCDO->Health = 200.0f; // 수정 가능

    이 경우에는 에디터 초기화나 게임 모듈 초기 설정 시,
    기본값을 동적으로 변경하고 싶을 때 사용합니다.

    예를 들어, 특정 설정 파일에 따라
    게임 실행 시점에 CDO의 기본 체력을 바꾸는 식으로 쓸 수 있습니다.

     

    ⚠️ 주의:
    런타임 중에 CDO를 변경하는 것은 이미 생성된 인스턴스에는 영향을 주지 않습니다.
    CDO는 "미래에 생성될 객체의 초기 템플릿"이기 때문입니다.


     

     

    비교

     

    함수 반환 타입 수정 가능 여부  용도
    GetDefault<T>() const T* ❌ 불가능 CDO를 읽기 전용으로 가져옴
    GetMutableDefault<T>() T* ✅ 가능 CDO를 수정 가능 상태로 가져옴 (에디터나 시스템 초기화 시)

     

     

    일반적인 CDO 접근 방법 비교

    방식 설명
    Class->GetDefaultObject<T>() CDO를 얻는 일반적인 멤버 함수
    GetDefault<T>() 위 함수를 템플릿 형태로 래핑한 함수 (타입 안정성 및 간결성 제공)
    GetMutableDefault<T>() 수정 가능한 버전 (CDO 편집용)

     

    항목  설명
    CDO 클래스의 기본 객체로, 새 인스턴스 생성 시 초기값 복사본의 원본
    GetDefault() 읽기 전용 CDO를 반환 (const T*)
    GetMutableDefault() 수정 가능한 CDO를 반환 (T*)
    주의점 런타임 중 수정해도 기존 객체에는 영향 없음

     

    예시 코드

     

    // 게임 세팅 초기화 중
    void UGameConfig::ApplyDefaults()
    {
        AMyEnemyCharacter* EnemyCDO = GetMutableDefault<AMyEnemyCharacter>(AMyEnemyCharacter::StaticClass());
        EnemyCDO->BaseDamage = ConfiguredBaseDamage; // 설정 파일에서 불러온 값으로 변경
    }
     

    이렇게 하면 이후 생성되는 AMyEnemyCharacter 인스턴스들은 ConfiguredBaseDamage 값을 기본값으로 사용하게 됩니다.