언리얼 엔진 용어 및 개념 정리 2

  1. Live Coding

    엔진이 실행 중인 동안 애플리케이션의 C++ 코드를 리빌드하고 바이너리를 패치할 수 있는 시스템이다. C++ 파일을 수정하고 재빌드 없이 에디터에 반영 시켜 게임 개발 생산성을 향상하는데 많은 도움이 된다.

    Visual Studio에서 C++ 파일 작업을 마친 후, CTRL+ALT+F11을 누르면 에디터에 반영된다.

  2. Unreal Engine Reflection System

    리플렉션 시스템은 클래스, 변수, 함수 등의 정보를 런타임 또는 에디터에서 동적으로 조회하거나 제어할 수 있는 시스템을 말한다. 게임 디자이너나 툴에서 데이터를 쉽게 접근 및 조작할 수 있도록 만들어주는 핵심 기술이다.

    Unreal에서는 이 시스템을 통해

    • 에디터에 변수 노출(UPROPERTY)
    • 함수 호출(UFUNCTION)
    • 시리얼라이즈(저장/로드)
    • 네트워크 동기화(Replicate)
    • 블루프린트 연동 등이 가능하다.

    대표적인 매크로로

    • UCLASS()
    • UPROPERTY()
    • UFUNCTION()
    • GENERATED_BODY 등이 있다.
  3. UCLASS()

    클래스 선언 앞에 사용되며, 해당 클래스가 언리얼 오브젝트 시스템에 의해 관리될 것을 나타낸다. UCLASS() 매크로를 사용하면 블루프린트, 메타 데이터 지정 등 다양한 엔진 기능을 활용할 수 있다.

     UCLASS()
     class FirstProject_API AExampleClass : public AActor
     {
         GENERATED_BODY()
    	
     public:
         // 변수, 함수 등	
     };
    
  4. UPROPERTY()

    엔진 및 에디터에서 프로퍼티의 작동방식을 지정하기 위해 사용되는 매크로이다. 프로퍼티 지정자를 통해 성질을 정할 수 있으며, 매크로를 사용한 변수는 에디터에서 확인 가능하다.

    프로퍼티 지정자 문서 링크

     UCLASS()
     class FirstProject_API AExampleClass : public AActor
     {
         GENERATED_BODY()
    	
     public:
         UPROPERTY(EditAnywhere, Category="Test")
         int ex1;
    	
         UPROPERTY(VisibleAnywhere, Category="Test")
         FVector ex2;
     };
    
  5. UFUNCTION()

    언리얼 엔진 리플렉션 시스템에 등록하고 싶은 C++ 함수에 사용하는 매크로이다. 모든 UObject 또는 블루프린트 함수 라이브러리는 UFUNCTION() 매크로를 헤더 파일 내 함수 선언 윗줄에 배치하여 멤버 함수를 UFunction으로 선언할 수 있다. 이 매크로는 함수 지정자(Function Specifiers)가 언리얼 엔진의 함수 해석 및 사용 방식을 변경하도록 지원한다.

    함수 지정자 문서 링크

     UCLASS()
     class FirstProject_API AExampleClass : public AActor
     {
         GENERATED_BODY()
    	
     public:
         UFUNCTION(BlueprintPure)
         int32 GetHp() const;
     };
    
  6. GENERATED_BODY()

    Unreal Header Tool(UHT)이 자동으로 생성한 리플렉션용 코드들을 포함시켜주는 매크로이다. 언리얼은 C++의 기본 기능만으로는 블루프린트, 시리얼라이제이션, 에디터 노출 등을 처리할 수 없다. 그래서 Unreal은 자체 전처리기(UHT)를 통해 리플렉션 정보를 생성하고, GENERATED_BODY() 자리에 해당 코드를 삽입한다.

    GENERATED_BODY()는 아래와 같은 코드를 생성한다.

    • 클래스 등록 정보(StaticClass())
    • 리플렉션 데이터 테이블
    • 시리얼라이즈 관련 함수
    • RPC/네트워크 함수 핸들러
    • 블루프린트 연동용 바인딩 정보 등

    주의할 점은, GENERATED_BODY()는 항상 클래스 정의의 첫 번째 public: 앞에 위치해야 한다.

  7. Unreal Header Tool(UHT)

    언리얼은 일반적인 C++ 프로그램과 다르게 자체적으로 리플렉션 시스템을 구현하기 위해 UCLASS(), UPROPERTY(), UFUNCTION() 등 매크로를 사용하는데, 이 매크로를 해석해서 C++ 컴파일러가 읽을 수 있게 코드를 재생성(.generated.h, .gen.cpp) 해주는 역할을 한다. UHT는 언리얼이 C++ 코드를 컴파일하기 전에 모든 헤더 파일을 순회하면서 언리얼 리플렉션 시스템에 필요한 정보들을 읽어들인 후 .generated.h 파일과 .gen.cpp 파일을 Intermediate 폴더에 생성한다.

    라이브러리 파일 위치 : (Unreal version)/Engine/Binaries/DotNET/UnrealBuildTool/EpicGames.UHT.dll

    빌드 순서 : 프로그래머 빌드 명령 - UBT 실행 - .build.cs, .target.cs 컴파일 - UHT 실행 - C++ 컴파일러 실행

  8. Delegate

    Delegate는 이벤트 기반 프로그래밍을 구현하기 위한 함수 포인터 시스템이다. C++의 Callback을 언리얼 스타일로 만든 것이다.

    대표적인 용도는 아래와 같다.

    • 버튼 클릭, 충돌 등 이벤트 발생 시 콜백 함수 호출
    • 클래스 간 느슨한 연결(Loose Coupling)
    • 여러 개의 함수 바인딩 가능(Multicast Delegate)

    Delegate의 종류

    • DECLARE_DELEGATE : 매개변수 없는 단일 함수
    • DECLARE_DYNAMIC_DELEGATE : 블루프린트에서 사용 가능
    • DECLARE_MULTICAST_DELEGATE : 여러 함수 바인딩 가능
    • DECLARE_DYNAMIC_MULTICAST_DELEGATE : 블루프린트 + 멀티
  9. CDO(Class Default Object)

    UClass의 Default 값을 가지고 있는 오브젝트 인스턴스이다. 기본값 복사본이라고 생각하면 된다.

    • 생성 시기 : 클래스가 처음 로드될 때 UClass에 따라 자동으로 한 번만 생성된다. 즉, AActor, UUserWidget, UPlayerAnimInstance 같은 클래스가 있을 때, 언리얼은 이 클래스의 기본값을 보관할 CDO 객체를 자동 생성해 둔다.

    • 목적
      1. 기본값 저장 : 변수의 초기값을 복사할 때 기준이 됨
      2. 블루프린트 상속 : 부모 클래스의 초기 상태를 자식에게 전달할 때 사용
      3. 성능 최적화 : 새 인스턴스를 만들 때 CDO에서 메모리 복사만 하면 되므로 빠름
      4. 리플렉션용 비교 : 현재 오브젝트가 변경되었는지 판단할 때 CDO와 비교
    • 사용 예시 Actor->GetClass()->GetDefaultObject() : 액터의 디폴트 오브젝트를 받아 온다.
  10. TObjectPtr

    언리얼에서 원시 포인터를 대체하는 UObject용 포인터이다. 원시 포인터도 가비지 컬렉터가 작동하긴 하지만, UObjectPtr을 권장한다.

    • 동작
      1. 에디터 빌드에서 다이나믹 해상도와 액세스 트래킹을 추가, 비에디터 빌드에서는 원시 포인터와 동일한 역할 수행
      2. TObjectPtr 변수는 함수로 전달되거나 로컬 변수에 저장될 때 자동으로 원시 포인터로 변환(따라서 성능에 영향을 미치지 않음)
  11. ConstructorHelpers

    C++에서, 에디터에서 만든 에셋을 로드할 때 사용하는 유틸리티 클래스이다. 게임 실행 중 동적 로딩이 아니므로 생성자 안에서만 사용된다. ConstructorHelpers::FObjectFinderConstructorHelpers::FClassFinder를 이용해 경로 기반 에셋을 불러온다.

  12. AnimInstance

    언리얼 엔진에서 Skeletal Mesh의 애니메이션 상태와 로직을 제어하는 클래스이다. USkeletalMeshComponent에 연결되며, 보통 캐릭터 클래스(ACharacter)에서 GetMesh()로 접근할 수 있다.

    UAnimInstance* Anim = MyCharacter->GetMesh()->GetAnimInstance();
    
    • 작동 구조
      1. Anim Blueprint는 UAnimInstance를 기반으로 만들어짐.
      2. 내부에는 상태 머신(State Machine), 블렌드, 캐시 포즈 등 애니메이션 로직이 있음.
      3. NativeUpdateAnimation(float DeltaSeconds) 또는 BlueprintUpdateAnimation()에서 캐릭터의 상태에 따라 변수 업데이트.
      4. 변수 변화에 따라 상태 머신이 전이되며 애니메이션이 바뀜.
    • 자주 사용되는 함수들
      1. NativeInitializeAnimation() : 애니메이션 인스턴스 초기화 시 호출
      2. NativeUpdateAnimation(float DeltaTime) : 매 프레임마다 호출되어 변수 업데이트
      3. Montage_Play() : 애니메이션 몽타주 재생
      4. TryGetPawnOwner() : 이 AnimInstance가 적용된 Pawn 가져오기
      5. GetOwningActor() : 소유하고 있는 액터 가져오기
  13. Animation Notify

    애니메이션 재생 중 특정 시점에 이벤트(함수, 사운드 등)를 발생시키는 기능이다. 공격 타이밍에 데미지 판정, 발소리 재생, 캐릭터 상태 전환, 파티클/이펙트 재생 등에 사용한다.

  14. Montage

    애니메이션 클립을 재생, 블렌딩, 분기, 섹션 제어 등 고급 방식으로 다룰 수 있게 해주는 강력한 애니메이션 재생 시스템이다. AnimGraph는 상태 머신 기반이라 걷기 - 뛰기같은 반복적인 상태 전환에는 좋지만, 공격, 구르기, 카운터 등 특정 시점에 한 번 재생해야 하는 애니메이션이나 상체/하체 분리 애니메이션 처리에는 부적합하다. 이런 임의 재생 애니메이션은 보통 몽타주로 처리한다.

    • 뭉타주 구성 요소
      1. Sections : 이름이 붙은 애니메이션 구간(분기점)
      2. Branches : 분기 시점과 다음 섹션 지정
      3. Notify / NotifyState : 이벤트 실행 타이밍 지정
      4. Slot : 어떤 몸 부위에 적용할지 설정

Leave a comment