본문 바로가기

Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] US_Character.h 생성자 코드 분석(카메라)

US_Character.h

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "US_Character.generated.h"

UCLASS()
class UNREALSHADOWS_LOTL_API AUS_Character : public ACharacter
{
    GENERATED_BODY()

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
    TObjectPtr<class USpringArmComponent> CameraBoom;

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera", meta = (AllowPrivateAccess = "true"))
    TObjectPtr<class UCameraComponent> FollowCamera;
    ...
    
public:
    ...
    FORCEINLINE USpringArmComponent* GetCameraBoom() const { return CameraBoom; }

    FORCEINLINE UCameraComponent* GetFollowCamera() const { return FollowCamera; }
}

 

해당 코드를 살펴보면 가장 눈에 뛰는 것은 UPROPERTY와 TObjectPtr일 것이다. 먼저 UPROPERTY는  이전 글에 잠깐 설명하였지만, 개인적으로도 궁금하여 좀 더 살펴보려고 한다.

UPROPERTY

이전 글에서는 리플렉션 시스템에서 '관련된 멤버 변수가 블루프린트 접근성이나 네트워크 복제와 같은 추가 기능이 있음을 엔진에 알리는 데 사용된다.'로 정의된 것을 볼 수 있다.

 

 

언리얼 UPROPERTY( Unreal UPROPERTY )

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 )

minusi.tistory.com

정의는 알아도 사용 방법을 모르기에  언리얼 공식 문서에 프로퍼티를 참고할 수 있지만, 위 글이 더 잘 정리되어 있어 참고하면 좋다.

 

다만 Category에 대한 설명이 없어 보충하자면, 위와 같이 디테일의 카테고리를 정하여 설정할 수 있는 역할이다.

 

TObjectPtr<T>

이 템플릿은 언리얼 엔진 5에 새로 추가된 것으로, 헤더 파일에 원시 포인터(ex: USpringComponent*)를 UPROPERTY로 대체하기 위해 도입되었다. TObjectPtr<T> 템플릿은 코드의 헤더에서 선언된 멤버 프로퍼티에만 사용해야 한다.

cpp 파일 내부의 함수나 짧은 코드 블록에서는 TObjectPtr<T>를 사용해도 원시 포인터를 사용하는 것에 비해 추가적인 이점이 없다.

 

FORCEINLINE

USpringArmComponent인 CameraBoom을 예로 들면, GetCameraBoom()의 역할은 CameraBoom을 리턴하는 것이다. 그렇다면 인라인으로 만들면 빠르게 처리할 수 있을 것이다. 이러한 인라인으로 처리하게 해주는 매크로가 FORCEINLINE이다.