TECHARTNOMAD | TECHARTFLOWIO.COM

UNREAL ENGINE

TAutoConsoleVariable 와 FAutoConsoleVariableRef

jplee 2025. 2. 26. 13:47

TAutoConsoleVariable와 FAutoConsoleVariableRef는 언리얼 엔진에서 **콘솔 변수(Console Variables, CVars)**를 선언하고 활용하기 위한 두 가지 주요 클래스입니다. 두 가지 모두 개발 중 혹은 디버그 목적으로 사용되며, 서로 다른 방식으로 콘솔 변수를 다루는 데 사용됩니다.


1. TAutoConsoleVariable

TAutoConsoleVariable은 콘솔 변수를 직접 선언하고 관리하기 위한 템플릿 클래스입니다. 선언된 콘솔 변수는 게임 실행 중 직접 값을 설정하거나 확인할 수 있으며, 데이터 타입에 따라 다양한 설정을 지원합니다.

주요 특징

  • 직접적으로 변수의 값을 저장하고 관리합니다.
  • 템플릿 형식으로 제공되며, 변수를 정적으로 선언하여 사용할 수 있습니다.
  • Get() 메서드를 통해 현재 값을 가져올 수 있습니다.

정의

TAutoConsoleVariable을 통해 정의된 콘솔 변수는 다음과 같은 방식으로 구현됩니다:

template <typename T>
class TAutoConsoleVariable

사용 예시

static TAutoConsoleVariable<int32> CVarMyVariable(
    TEXT("Game.MyVariable"),
    42, // 초기값
    TEXT("Example variable for demonstrating TAutoConsoleVariable usage."),
    ECVF_Default
);

// 해당 변수의 값 가져오기
int32 CurrentValue = CVarMyVariable.GetValueOnGameThread();

주요 메서드

  1. GetValueOnGameThread(): 게임 스레드에서 변수 값을 가져옵니다.
  2. GetValueOnRenderThread(): 렌더링 스레드에서 변수 값을 가져옵니다.

2. FAutoConsoleVariableRef

FAutoConsoleVariableRef는 이미 선언된 콘솔 변수를 참조하여 그 값을 연결하거나 사용하는 클래스입니다. 즉, FAutoConsoleVariableRef는 실제로 값을 저장하지 않고, 다른 TAutoConsoleVariable과 연결된 변수를 참조합니다.

주요 특징

  • 변수 자체를 선언하지 않고, 이미 선언된 콘솔 변수와 바인딩하여 값을 동기화합니다.
  • 보통 전역 상태의 변수를 다른 개체와 공유하거나 다루기 위해 사용됩니다.
  • 함수 포인터 및 콜백 함수를 통해 값 변화를 감지하거나 추가 로직을 실행할 수 있습니다.

정의

class FAutoConsoleVariableRef
static int32 MyVariable = 42;

static FAutoConsoleVariableRef CVarMyVariableRef(
    TEXT("Game.MyVariableRef"),
    MyVariable,
    TEXT("Example variable for demonstrating FAutoConsoleVariableRef usage."),
    ECVF_Default
);

// 연결된 변수 값 변경
MyVariable = 100; // Console command or code updates it

주요 활용

  1. 새로운 TAutoConsoleVariable을 선언하지 않고, 이미 정의되어 있는 변수에 바인딩하여 간접적인 관리가 가능합니다.
  2. 콜백 함수를 등록하여 콘솔 변수 값이 변경될 때 추가 로직을 실행할 수 있습니다.

콜백 사용 예시

static float MyFloatVariable = 3.14f;

static void OnConsoleVariableChanged(IConsoleVariable* Var)
{
    // 값 변화 시 실행되는 로직
    float NewValue = Var->GetFloat();
    UE_LOG(LogTemp, Log, TEXT("MyFloatVariable has changed to: %f"), NewValue);
}

static FAutoConsoleVariableRef CVarFloatRef(
    TEXT("Game.MyFloatVariable"),
    MyFloatVariable,
    TEXT("Monitors changes to MyFloatVariable."),
    ECVF_Default,
    FConsoleVariableDelegate::CreateStatic(&OnConsoleVariableChanged)
);

이 코드는 MyFloatVariable 값이 변할 때마다 로그를 출력합니다.


3. 차이점 요약

특성 TAutoConsoleVariable FAutoConsoleVariableRef

변수 선언 여부 새롭게 콘솔 변수 정의 이미 존재하는 콘솔 변수 참조
값 저장 여부 자체적으로 값을 저장 외부 변수와 참조 연결
사용 목적 콘솔 변수를 독립적으로 생성하고 직접 사용할 때 이미 선언된 변수에 연결하거나, 값 변화를 감지하여 추가 기능을 실행할 때
콜백 함수 지원 여부 지원하지 않음 값 변경 시 콜백을 통해 추가 로직 실행 가능
사용 예 실제 변수를 생성하여 초기 값을 설정 및 관리 외부 변수 혹은 함수와 연결하여 간접적으로 관리

4. 활용법

TAutoConsoleVariable

  1. 독립적인 변수 관리:
    • 디버그용으로 특정 변수를 정의하고 이를 활용할 필요가 있을 때 사용합니다.
  2. 게임/렌더링 스레드 동작:
    • 값을 설정하고 이를 게임 및 렌더링 관련 로직에서 동기적으로 활용할 때 적합합니다.

FAutoConsoleVariableRef

  1. 기존 변수를 연결:
    • 다른 모듈 혹은 코드에서 선언된 변수를 참조하거나, 해당 변수를 콘솔 커맨드를 통해 수정할 때 유용합니다.
  2. 값 변화 감지 로직:
    • 콜백을 통해 값 변화에 따라 특정한 로직을 수행하거나 로그를 출력하는 등 동기화 작업이 필요할 때 적합합니다.

5. 상황별 예시

A. 디버그용 변수 생성

static TAutoConsoleVariable<bool> CVarDebugFeature(
    TEXT("Game.DebugFeature"),
    false, // 디폴트 비활성화
    TEXT("Enables or disables a debug feature."),
    ECVF_Default
);

if (CVarDebugFeature.GetValueOnGameThread())
{
    // 디버그 기능 활성화
}

B. 값 변화 감지 후 로직 실행

static int32 NewResolutionValue = 1920;

static void OnResolutionChanged(IConsoleVariable* Var)
{
    int32 CurrentValue = Var->GetInt();
    UE_LOG(LogTemp, Log, TEXT("Resolution is set to: %d"), CurrentValue);
}

static FAutoConsoleVariableRef CVarResolution(
    TEXT("Game.Settings.ResolutionWidth"),
    NewResolutionValue,
    TEXT("Change resolution width dynamically."),
    ECVF_Default,
    FConsoleVariableDelegate::CreateStatic(&OnResolutionChanged)
);