언리얼 엔진/언리얼 엔진 개념

Unreal Engine - CallInEditor 정리 및 활용 방법

로안님 2025. 1. 23. 21:59

CallInEditor란?

**CallInEditor**는 Unreal Engine에서 **UFUNCTION()**의 속성 중 하나로, 에디터에서 디테일 패널을 통해 특정 함수를 실행할 수 있도록 만들어줍니다. 이를 통해 게임 실행 없이도 간단한 작업이나 테스트를 에디터 환경에서 바로 수행할 수 있습니다.


사용 예제

다음은 CallInEditor를 사용하여 액터의 위치를 초기화하는 간단한 함수 예제입니다.

코드 예제: 액터 위치 초기화

헤더 파일

UCLASS()
class MYPROJECT_API ATransformableObject : public AActor
{
    GENERATED_BODY()

public:
    // 에디터에서 호출할 수 있는 함수
    UFUNCTION(CallInEditor, Category = "Transform")
    void ResetActorPosition();
};

CPP 파일

#include "TransformableObject.h"

void ATransformableObject::ResetActorPosition()
{
    SetActorLocation(FVector::ZeroVector); // 액터 위치 초기화
    UE_LOG(LogTemp, Warning, TEXT("Actor position reset to (0, 0, 0)"));
}

결과

  1. 에디터에서 이 액터를 선택하면 디테일 패널에 "ResetActorPosition" 버튼이 표시됩니다.
  2. 버튼을 클릭하면 함수가 실행되어 액터의 위치가 **(0, 0, 0)**으로 초기화됩니다.

CallInEditor의 주요 특징

1. 에디터 전용

  • CallInEditor는 에디터 환경에서만 동작합니다.
  • 게임 실행 중(Play in Editor)에는 버튼이 비활성화되며, 함수를 호출할 수 없습니다.

2. 디테일 패널에서만 사용 가능

  • 디테일 패널에 버튼 형태로 나타나므로, 블루프린트 그래프나 블루프린트 에디터 화면에서는 사용할 수 없습니다.
  • 뷰포트에서 액터를 선택한 후 디테일 패널에서 버튼을 클릭해야 함.

Modify()와 MarkPackageDirty()의 역할

CallInEditor로 작성한 함수에서 변경 작업이 이루어질 경우, 두 가지 추가적인 처리를 고려해야 합니다: **Modify()**와 MarkPackageDirty().

1. Modify()

  • 목적: Undo/Redo 기능을 지원하기 위해 변경 사항을 기록.
  • 설명:
    • 에디터에서 작업 후 Ctrl+Z(Undo) 또는 Ctrl+Y(Redo)로 상태를 되돌릴 수 있게 합니다.
  • 언제 필요한가?
    • 디테일 패널 버튼으로 실행한 작업을 되돌리거나 다시 적용할 필요가 있을 때.

코드 예제

void ATransformableObject::ResetActorPosition()
{
    Modify(); // Undo/Redo 기록
    SetActorLocation(FVector::ZeroVector); // 위치 초기화
}

2. MarkPackageDirty()

  • 목적: 에디터에게 "레벨이 수정되었음을 알림".
  • 설명:
    • 레벨 이름 옆에 "*" 표시를 추가하여 변경 사항이 있음을 나타냅니다.
    • 레벨을 저장하지 않고 닫으려 하면 경고 메시지가 나타납니다.
  • 언제 필요한가?
    • Unreal Engine이 자동으로 변경 사항을 감지하지 못하는 작업에서 사용.
      • 예: 커스텀 데이터, 배열, 또는 트랜스폼 이외의 속성 변경.

코드 예제

void ATransformableObject::ResetActorPosition()
{
    Modify(); // Undo/Redo 기록
    SetActorLocation(FVector::ZeroVector); // 위치 초기화
    MarkPackageDirty(); // 레벨 수정 알림
}

Modify()와 MarkPackageDirty()는 항상 필요한가?

1. 꼭 필요하지 않은 경우

  • 트랜스폼 변경 작업(위치, 회전, 스케일)에는 Unreal Engine이 변경 사항을 자동으로 감지합니다.
  • 이 경우 MarkPackageDirty(); 없이도 레벨 저장 경고가 뜨며, 변경 사항이 적용됩니다.

2. 꼭 필요한 경우

  • 커스텀 데이터나 특수 작업을 수정한 경우:
    • 예: 배열 추가, 사용자 정의 속성 변경 등.
  • Undo/Redo를 지원해야 하는 경우:
    • 사용자가 Ctrl+Z로 변경 사항을 되돌릴 필요가 있을 때.

CallInEditor의 활용 사례

1. 데이터 초기화

  • 예: 액터의 위치, 속성, 또는 배열을 초기화하는 작업.
  • 간단히 버튼 클릭으로 작업 가능.

2. 테스트 및 디버깅 도구

  • 예: 특정 조건을 재현하거나 테스트 데이터를 설정.

3. 레벨 정리 작업

  • 예: 여러 액터를 특정 위치로 이동시키거나 일괄적으로 정렬.

마무리

CallInEditor는 Unreal Engine 에디터 작업을 간소화하고 반복 작업을 줄이는 데 매우 유용한 도구입니다. 특히 디테일 패널을 활용한 간단한 워크플로 개선에 적합하며, Modify()와 MarkPackageDirty()를 적절히 사용하여 Undo/Redo 및 저장 경고까지 지원하면 더욱 강력한 에디터 도구를 만들 수 있습니다.