[UE] Unreal Engine 용어 및 개념 정리 2
언리얼 엔진 용어 및 개념 정리 2
-
Live Coding
엔진이 실행 중인 동안 애플리케이션의 C++ 코드를 리빌드하고 바이너리를 패치할 수 있는 시스템이다. C++ 파일을 수정하고 재빌드 없이 에디터에 반영 시켜 게임 개발 생산성을 향상하는데 많은 도움이 된다.
Visual Studio에서 C++ 파일 작업을 마친 후,
CTRL+ALT+F11
을 누르면 에디터에 반영된다. -
Unreal Engine Reflection System
리플렉션 시스템은 클래스, 변수, 함수 등의 정보를 런타임 또는 에디터에서 동적으로 조회하거나 제어할 수 있는 시스템을 말한다. 게임 디자이너나 툴에서 데이터를 쉽게 접근 및 조작할 수 있도록 만들어주는 핵심 기술이다.
Unreal에서는 이 시스템을 통해
- 에디터에 변수 노출(
UPROPERTY
) - 함수 호출(
UFUNCTION
) - 시리얼라이즈(저장/로드)
- 네트워크 동기화(Replicate)
- 블루프린트 연동 등이 가능하다.
대표적인 매크로로
UCLASS()
UPROPERTY()
UFUNCTION()
GENERATED_BODY
등이 있다.
- 에디터에 변수 노출(
-
UCLASS()
클래스 선언 앞에 사용되며, 해당 클래스가 언리얼 오브젝트 시스템에 의해 관리될 것을 나타낸다.
UCLASS()
매크로를 사용하면 블루프린트, 메타 데이터 지정 등 다양한 엔진 기능을 활용할 수 있다.UCLASS() class FirstProject_API AExampleClass : public AActor { GENERATED_BODY() public: // 변수, 함수 등 };
-
UPROPERTY()
엔진 및 에디터에서 프로퍼티의 작동방식을 지정하기 위해 사용되는 매크로이다. 프로퍼티 지정자를 통해 성질을 정할 수 있으며, 매크로를 사용한 변수는 에디터에서 확인 가능하다.
UCLASS() class FirstProject_API AExampleClass : public AActor { GENERATED_BODY() public: UPROPERTY(EditAnywhere, Category="Test") int ex1; UPROPERTY(VisibleAnywhere, Category="Test") FVector ex2; };
-
UFUNCTION()
언리얼 엔진 리플렉션 시스템에 등록하고 싶은 C++ 함수에 사용하는 매크로이다. 모든
UObject
또는 블루프린트 함수 라이브러리는UFUNCTION()
매크로를 헤더 파일 내 함수 선언 윗줄에 배치하여 멤버 함수를 UFunction으로 선언할 수 있다. 이 매크로는 함수 지정자(Function Specifiers)가 언리얼 엔진의 함수 해석 및 사용 방식을 변경하도록 지원한다.UCLASS() class FirstProject_API AExampleClass : public AActor { GENERATED_BODY() public: UFUNCTION(BlueprintPure) int32 GetHp() const; };
-
GENERATED_BODY()
Unreal Header Tool(UHT)
이 자동으로 생성한 리플렉션용 코드들을 포함시켜주는 매크로이다. 언리얼은 C++의 기본 기능만으로는 블루프린트, 시리얼라이제이션, 에디터 노출 등을 처리할 수 없다. 그래서 Unreal은 자체 전처리기(UHT)를 통해 리플렉션 정보를 생성하고,GENERATED_BODY()
자리에 해당 코드를 삽입한다.GENERATED_BODY()
는 아래와 같은 코드를 생성한다.- 클래스 등록 정보(
StaticClass()
) - 리플렉션 데이터 테이블
- 시리얼라이즈 관련 함수
- RPC/네트워크 함수 핸들러
- 블루프린트 연동용 바인딩 정보 등
주의할 점은,
GENERATED_BODY()
는 항상 클래스 정의의 첫 번째public:
앞에 위치해야 한다. - 클래스 등록 정보(
-
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++ 컴파일러 실행
-
Delegate
Delegate
는 이벤트 기반 프로그래밍을 구현하기 위한 함수 포인터 시스템이다. C++의 Callback을 언리얼 스타일로 만든 것이다.대표적인 용도는 아래와 같다.
- 버튼 클릭, 충돌 등 이벤트 발생 시 콜백 함수 호출
- 클래스 간 느슨한 연결(Loose Coupling)
- 여러 개의 함수 바인딩 가능(Multicast Delegate)
Delegate의 종류
DECLARE_DELEGATE
: 매개변수 없는 단일 함수DECLARE_DYNAMIC_DELEGATE
: 블루프린트에서 사용 가능DECLARE_MULTICAST_DELEGATE
: 여러 함수 바인딩 가능DECLARE_DYNAMIC_MULTICAST_DELEGATE
: 블루프린트 + 멀티
-
CDO(Class Default Object)
UClass의 Default 값을 가지고 있는 오브젝트 인스턴스이다. 기본값 복사본이라고 생각하면 된다.
-
생성 시기 : 클래스가 처음 로드될 때
UClass
에 따라 자동으로 한 번만 생성된다. 즉,AActor
,UUserWidget
,UPlayerAnimInstance
같은 클래스가 있을 때, 언리얼은 이 클래스의 기본값을 보관할CDO
객체를 자동 생성해 둔다. - 목적
- 기본값 저장 : 변수의 초기값을 복사할 때 기준이 됨
- 블루프린트 상속 : 부모 클래스의 초기 상태를 자식에게 전달할 때 사용
- 성능 최적화 : 새 인스턴스를 만들 때 CDO에서 메모리 복사만 하면 되므로 빠름
- 리플렉션용 비교 : 현재 오브젝트가 변경되었는지 판단할 때 CDO와 비교
- 사용 예시
Actor->GetClass()->GetDefaultObject()
: 액터의 디폴트 오브젝트를 받아 온다.
-
-
TObjectPtr
언리얼에서 원시 포인터를 대체하는 UObject용 포인터이다. 원시 포인터도 가비지 컬렉터가 작동하긴 하지만, UObjectPtr을 권장한다.
- 동작
- 에디터 빌드에서 다이나믹 해상도와 액세스 트래킹을 추가, 비에디터 빌드에서는 원시 포인터와 동일한 역할 수행
- TObjectPtr 변수는 함수로 전달되거나 로컬 변수에 저장될 때 자동으로 원시 포인터로 변환(따라서 성능에 영향을 미치지 않음)
- 동작
-
ConstructorHelpers
C++에서, 에디터에서 만든 에셋을 로드할 때 사용하는 유틸리티 클래스이다. 게임 실행 중 동적 로딩이 아니므로 생성자 안에서만 사용된다.
ConstructorHelpers::FObjectFinder
나ConstructorHelpers::FClassFinder
를 이용해 경로 기반 에셋을 불러온다. -
AnimInstance
언리얼 엔진에서 Skeletal Mesh의 애니메이션 상태와 로직을 제어하는 클래스이다.
USkeletalMeshComponent
에 연결되며, 보통 캐릭터 클래스(ACharacter
)에서GetMesh()
로 접근할 수 있다.UAnimInstance* Anim = MyCharacter->GetMesh()->GetAnimInstance();
- 작동 구조
- Anim Blueprint는
UAnimInstance
를 기반으로 만들어짐. - 내부에는 상태 머신(
State Machine
), 블렌드, 캐시 포즈 등 애니메이션 로직이 있음. NativeUpdateAnimation(float DeltaSeconds
) 또는BlueprintUpdateAnimation()
에서 캐릭터의 상태에 따라 변수 업데이트.- 변수 변화에 따라 상태 머신이 전이되며 애니메이션이 바뀜.
- Anim Blueprint는
- 자주 사용되는 함수들
NativeInitializeAnimation()
: 애니메이션 인스턴스 초기화 시 호출NativeUpdateAnimation(float DeltaTime)
: 매 프레임마다 호출되어 변수 업데이트Montage_Play()
: 애니메이션 몽타주 재생TryGetPawnOwner()
: 이 AnimInstance가 적용된 Pawn 가져오기GetOwningActor()
: 소유하고 있는 액터 가져오기
- 작동 구조
-
Animation Notify
애니메이션 재생 중 특정 시점에 이벤트(함수, 사운드 등)를 발생시키는 기능이다. 공격 타이밍에 데미지 판정, 발소리 재생, 캐릭터 상태 전환, 파티클/이펙트 재생 등에 사용한다.
-
Montage
애니메이션 클립을 재생, 블렌딩, 분기, 섹션 제어 등 고급 방식으로 다룰 수 있게 해주는 강력한 애니메이션 재생 시스템이다.
AnimGraph
는 상태 머신 기반이라걷기 - 뛰기
같은 반복적인 상태 전환에는 좋지만,공격
,구르기
,카운터
등 특정 시점에 한 번 재생해야 하는 애니메이션이나 상체/하체 분리 애니메이션 처리에는 부적합하다. 이런 임의 재생 애니메이션은 보통 몽타주로 처리한다.- 뭉타주 구성 요소
Sections
: 이름이 붙은 애니메이션 구간(분기점)Branches
: 분기 시점과 다음 섹션 지정Notify / NotifyState
: 이벤트 실행 타이밍 지정Slot
: 어떤 몸 부위에 적용할지 설정
- 뭉타주 구성 요소
Leave a comment