내일배움캠프/TIL

TIL260511 - Unreal

옆집히드라 2026. 5. 11. 20:38

1. 핵심 개념


  • GameplayTag: 새로 생성 시 리디렉션 정리할 것
  • widget
  • 언리얼 포인터 사용
  • 언리얼에서 순수가상함수는 PURE_VIRTUAL(SomeClass::SomeFunction, return type;);
  • UCLASS, UFINCTION, UENUM, UPROPERTY 매크로
  • Delegate: Singlecast vs Multicast vs event

2. 상세 내용


2.1. widget

위젯 클래스는 UMG(Unreal Motion Graphics), UMG의 기반인 Slate, CommonUI로 나뉘어 볼 수 있다.

UMG widget

  • UUserWidget: 위젯의 최상위 부모 클래스; 디자이너 툴에서 UI 요소 배치 + 로직 작성 시 사용
  • UWidget: Button, Image, Text 등 개별적인 UI 컴포넌트들의 기본 클래스
  • UPanelWidget: 다른 위젯들을 자식으로 가질 수 있는 컨테이너 클래스
    • Canvas Panel, Vertical Box, Horizontal Box, Scroll Box etc

Common UI(플러그인)

Common UI Plugin for Advanced User Interfaces in Unreal Engine | Unreal Engine 5.0 Documentation | Epic Developer Community

  • UCommonUserWidget: UUserWidget을 확장한 클래스로, Input 처리 강화

Slate(C++ 하위 레이어)

블루프린트에서 접근 불가능하며, 성능이 중요하거나 에디터 자체 수정 시 사용

  • SWidget: Slate 시스템의 최상위 클래스; 기본적으로 위젯은 SWidget를 래핑해서 작동
  • SCompoundWidget: 커스텀 Slate 위젯 클래스 만들 때 사용

기타

  • UEditorUtilityWidget: 사용자가 직접 에디터 내에 커스텀 툴바나 창 만들 때 사용, 블루프린트로 에디터기능 제어 가능
  • UWidgetComponent: 3D 월드 공간에 UI 배치 시 사용(머리 위 체력바 등)
  • AHUD: 관리 클래스인데 액터라서 레벨 바뀌면 파괴됨
  • UCommonActivatableWidget: CommonUI에서 제공하는 위젯 클래스로 입력과 포커스 관리에 필요한 UI요소를 구현할 때 사용되는 기본 컨테이너 클래스
    • Stack: 레이어드 팝업 구현에 사용
    • Queue: 연속적인 튜토리얼, 보상 알림
    • Switche: 인덱스 전환; 페이지 교체

2.2. 언리얼에서의 포인터

방식 대상 레퍼카운트 특징
생 포인터 + UPROPERTY UObject GC 마킹 고전적 방식, 실수하면 댕글링 포인터 위험
TObjectPtr UObject GC 마킹 UE5 표준, 멤버 변수용, 디버깅 최적화
TWeakObjectPtr UObject 없음 자동 null 초기화, 생명주기 영향 X
TSharedPtr 일반 C++ 있음 (RC) UI 데이터 모델 등 Non-UObject 관리용

소유권이 나에게 없을 때: "내 자식"이 아니라 "그냥 아는 사이"인 객체를 가리킬 때 씁니다.

2.3. UCLASS, UFINCTION, UENUM, UPROPERTY 매크로

[!caution] caution
제미나이 pro 모델로 정리함

UCLASS

UCLASS는 C++ 클래스를 언리얼 엔진의 리플렉션 시스템에 등록하여, 가비지 컬렉션(GC)의 보호를 받게 하고 블루프린트와 상호작용할 수 있게 해주는 가장 핵심적인 매크로입니다.

주요 지정자 (Class Specifiers)

UCLASS([주요 지정자 나열], meta = (MetaKey1 = "Value"))
class PROJECT_API UMyClass : public UObject // (또는 AActor, UUserWidget 등)
{
    GENERATED_BODY()
};

// 작성 예시 (블루프린트 생성 가능, 특정 카테고리 숨김)
UCLASS(Blueprintable, HideCategories = ("Rendering", "Input"))
class PROJECT_API AMyMonster : public ACharacter
{ ... };
구분 지정자 (Specifier) 역할 및 특징
블루프린트 Blueprintable 에디터에서 이 C++ 클래스를 부모로 하는 블루프린트 클래스를 생성할 수 있게 허용합니다.
  NotBlueprintable 블루프린트 클래스 생성을 강제로 막습니다. (기본값인 경우가 많음)
  BlueprintType 이 클래스를 블루프린트에서 '변수 타입'으로 사용할 수 있게 허용합니다.
인스턴스화 Abstract 추상 클래스로 선언합니다. 에디터 뷰포트에 배치하거나 직접 생성할 수 없으며, 무조건 상속(부모)용으로만 쓰입니다.
에디터 UI HideCategories = ("A", "B") 에디터의 디테일 패널에서 특정 카테고리(폴더)를 아예 숨깁니다. (기획자가 건드리면 안 되는 물리 설정 등을 가릴 때 유용)
  ShowCategories = ("A") 부모 클래스에서 숨겼던 카테고리를 자식 클래스에서 다시 보여줍니다.
데이터 Config = Game 클래스의 특정 UPROPERTY 값을 .ini 파일(설정 파일)에 저장하고 불러올 수 있게 준비합니다.

주요 메타 데이터 (meta = (...))

메타 키 (Meta Key) 값(Value) 지정 여부 역할 및 특징
BlueprintSpawnableComponent (값 없음) 이 클래스가 UActorComponent를 상속받았을 때, 블루프린트 에디터의 [컴포넌트 추가] 버튼 목록에 뜨게 만들어 줍니다.
DisplayName ="이름" 언리얼 에디터에서 보일 클래스의 별명(표시 이름)을 지정합니다.
ShortTooltip ="설명" 에디터에서 마우스를 올렸을 때 나타나는 짧은 설명말을 추가합니다.

UFUNCTION

C++

// 1. 기본 구조
UFUNCTION([주요 지정자 나열], Category = "카테고리명", meta = (MetaKey1 = "Value"))
반환타입 함수이름(매개변수);

// 작성 예시 1: 블루프린트에서 호출할 수 있는 일반 함수 (실행 핀 있음)
UFUNCTION(BlueprintCallable, Category = "Player|Combat")
void FireWeapon();

// 작성 예시 2: 값을 반환하기만 하는 순수 함수 (실행 핀 없음, 녹색 노드)
UFUNCTION(BlueprintPure, Category = "Player|Stat")
float GetCurrentHealth() const;

블루프린트 관련 주요 지정자 (가장 많이 씀)

C++ 프로그래머와 블루프린트를 사용하는 디자이너/기획자가 협업할 때 핵심이 되는 지정자들입니다.

지정자 (Specifier) 노드 형태 역할 및 특징
BlueprintCallable 파란색 (실행 핀 O) 블루프린트에서 이 C++ 함수를 호출(실행)할 수 있게 합니다.
BlueprintPure 초록색 (실행 핀 X) 상태를 변경하지 않고 값만 반환(Get)하는 함수에 씁니다. (예: GetHP(), 수학 계산 함수 등)
BlueprintImplementableEvent 빨간색 (이벤트) C++에서는 껍데기(선언)만 만들고, 실제 구현은 블루프린트에서 하도록 떠넘깁니다. (.cpp 파일에 함수 구현부를 작성하면 컴파일 에러가 납니다.)
BlueprintNativeEvent 빨간색 + 파란색 C++에서 기본 동작을 구현해 두되, 원한다면 블루프린트에서 덮어쓰기(Override)할 수 있게 합니다.

 

네트워크 및 기타 지정자

멀티플레이어 게임이나 디버깅을 위해 사용되는 특수 지정자입니다.

지정자 (Specifier) 분야 역할 및 특징
Server 네트워크 (RPC) 클라이언트(유저)가 호출하면, 서버에서 실행되는 함수입니다. (주로 공격, 아이템 획득 등 검증이 필요한 행동)
Client 네트워크 (RPC) 서버가 호출하면, 특정 클라이언트의 화면에서만 실행되는 함수입니다. (주로 UI 업데이트, 히트마커 표시 등)
NetMulticast 네트워크 (RPC) 서버가 호출하면, 서버와 연결된 모든 클라이언트에서 동시에 실행됩니다. (주로 폭발 이펙트, 전체 공지 등)
Exec 디버깅 게임 플레이 중 콘솔창(~ 키)을 열고 함수 이름을 쳐서 직접 실행할 수 있게 합니다. (예: GodMode, AddGold 100)

주요 메타 데이터 (meta = (...))

블루프린트 에디터에서 노드가 어떻게 보이고 작동할지 세밀하게 제어합니다.

메타 키 (Meta Key) 값(Value) 지정 여부 역할 및 특징
DisplayName ="이름" 블루프린트 노드에 표시될 예쁜 이름(별명)을 지정합니다. (예: DisplayName = "무기 발사")
ToolTip ="설명" 노드에 마우스를 올렸을 때 나타나는 설명말을 작성합니다.
DefaultToSelf ="매개변수명" 특정 매개변수의 기본값을 '자기 자신(Self)'으로 자동 연결해 줍니다.
HidePin ="매개변수명" 특정 매개변수의 핀을 블루프린트 노드에서 숨깁니다.
AdvancedDisplay ="매개변수명" 특정 매개변수 핀을 기본적으로 숨기고, 노드 하단의 화살표를 눌러야만 보이게 만듭니다. (복잡한 옵션에 사용)

UENUM

// 1. UENUM 선언
UENUM([주요 지정자 나열])
enum class EMyEnumName : uint8 // 2. 반드시 enum class 와 uint8 사용 권장
{
    // 3. 각 항목 뒤에 UMETA를 붙여 에디터 표시 설정
    Value1  UMETA(DisplayName = "첫 번째 값"), 
    Value2  UMETA(DisplayName = "두 번째 값"),
    Value3  UMETA(Hidden)
};

주요 지정자 (Enum Specifiers)

지정자 (Specifier) 역할 및 특징
BlueprintType 이 Enum을 블루프린트에서 '변수 타입'으로 생성하고 사용할 수 있게 허용합니다. 사실상 UENUM을 쓸 때 거의 필수적으로 붙이는 지정자입니다.

UMETA (항목별 메타 데이터)

Enum 내부의 각 값(Value) 뒤에 붙여서 에디터에 어떻게 표시될지 세밀하게 조작합니다.

메타 키 (Meta Key) 값(Value) 지정 여부 역할 및 특징
DisplayName ="이름" 블루프린트 드롭다운 메뉴에 보일 예쁜 이름(한글/영문 띄어쓰기 포함)을 지정합니다.
Hidden (값 없음) 특정 Enum 값을 에디터와 블루프린트 드롭다운 목록에서 숨깁니다. (내부 로직용으로만 쓸 때 사용)
ToolTip ="설명" 해당 Enum 항목에 마우스를 올렸을 때 보이는 설명말을 작성합니다.

UPROPERTY

C++

UPROPERTY([주요 지정자 나열], Category = "카테고리명", meta = (MetaKey1 = "Value", MetaKey2))
데이터타입 변수명;

// 작성 예시
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "UI|State", meta = (AllowPrivateAccess = "true"))
EUIState CurrentState;

주요 지정자 (Specifiers)

에디터 노출, 블루프린트 권한, 메모리 속성 등을 결정합니다. 쉼표(,)로 구분하여 여러 개를 섞어 쓸 수 있습니다.

디폴트는 블루프린트 에디터 상단 툴바에 Class Defaults로 접근

구분 지정자 (Specifier) 역할 및 특징 주로 쓰이는 곳
에디터 노출 EditAnywhere 디폴트(원본) 및 개별 배치된 인스턴스 모두 수정 가능 일반적인 수치 조정 (체력, 속도 등)
  EditDefaultsOnly 클래스 디폴트(원본)에서만 수정 가능 공통 세팅 (최대 레벨, 기본 스탯 등)
  VisibleAnywhere 디테일 패널에서 보기만 가능 (수정 불가) 컴포넌트 포인터 (USpringArm 등)
  VisibleInstanceOnly 월드에 배치된 개별 인스턴스에서만 보기 가능 런타임 디버깅 데이터 등
블루프린트 BlueprintReadWrite 블루프린트에서 Get(읽기) / Set(쓰기) 노드 모두 사용 가능 동적으로 변하는 데이터
  BlueprintReadOnly 블루프린트에서 Get(읽기) 노드만 사용 가능 외부 수정으로부터 보호할 데이터
메모리/저장 Transient 디스크에 저장(Serialize)하지 않음 (런타임 임시 데이터) UI 애니메이션, 타이머 변수 등
  SaveGame 언리얼 세이브 시스템을 통해 파일에 기록될 변수 플레이어 진행도, 소지품 등

Category (카테고리 분류)

언리얼 에디터의 디테일 패널이나 블루프린트 노드 검색 창에서 변수를 시각적으로 묶어주는 역할을 합니다.

파라미터 작성 형식 역할 및 특징
기본 폴더 Category = "이름" 변수를 그룹화할 최상위 폴더명을 지정합니다.
하위 폴더 Category = "대분류 소분류"`

meta (메타 데이터)

엔진과 에디터의 특수한 동작이나 UI(UMG) 바인딩을 세밀하게 제어합니다. meta = (...) 괄호 안에 작성합니다.

AllowPrivateAccess가 true이면 코드 내에서는 캡슐화가 유지되지만 블루프린트 에디터에는 공개됨

메타 키 (Meta Key) 값(Value) 지정 여부 역할 및 특징
AllowPrivateAccess ="true" C++에서 private/protected인 변수를 블루프린트에 강제 노출하여 캡슐화를 유지합니다.
BindWidget (값 없음) C++ 변수명과 동일한 이름의 UMG 위젯 에셋을 런타임에 자동 연결합니다. (없으면 에러)
BindWidgetOptional (값 없음) 위젯을 자동 연결하되, 블루프린트에 위젯이 없어도 에러를 내지 않고 nullptr로 처리합니다.
BindWidgetAnim (값 없음) C++ 변수명과 동일한 이름의 UMG 타임라인 애니메이션을 자동 연결합니다.
BindWidgetAnimOptional (값 없음) 애니메이션을 자동 연결하되, 타임라인에 없어도 에러를 무시합니다.
ClampMin / ClampMax ="숫자" 에디터 패널에서 값 입력이나 슬라이더 조작 시, 최소/최대 범위를 강제로 제한합니다. (예: ClampMin="0.0")

Delegate

  • SingleCastDelegate: 1대1 바인딩; 리턴값 존재
  • MultiCastDelegate: 1대n 바인딩; 리턴값 없음
  • DynamicDelegate: 빌드타임이 아닌 런타임에 바인딩을 가능하게 함
  • Event: MultiCastDelegate와 유사하지만 Event를 선언한 클래스만 Broadcast, IsBound, Clear 호출이 가능하다.(c#에 event와 delegate와 유사)

3. 질문 및 해결 (Q&A)


4. 관련 문서 (Links)


'내일배움캠프 > TIL' 카테고리의 다른 글

TIL260513 - Unreal  (0) 2026.05.13
TIL260512 - Unreal  (0) 2026.05.12
TIL260508 - CPP  (0) 2026.05.08
TIL260507 - Quaternion  (0) 2026.05.07
TIL260506 - Quaternion  (0) 2026.05.06