티스토리 뷰

개요


c++을 사용해서 언리얼 엔진을 작업하기 위해서 언리얼 엔진이 정의하는 메크로 및 코딩 방식을 익혀야 한다.

기본적으로 생성되는 코드를 하나씩 보면서 어떤 의미인지 알아보고 넘어갈 필요가 있을 것 같다.






Actor 생성


가장 기본 클래스라고 할 수 있는 Actor클래스를 생성하면, 기본 코드가 어느정도 작성되어 있는 것을 볼 수 있다. 앞에 A가 붙는 이유는 언리얼 코드 작성 규약에 의해 Actor클래스를 상속받는 클래스는 A를 접두어로 붙히기 때문이다.


먼저 헤더를 보자.

1.PNG


include들

CoreMinimal.h

기본적인 기능을 사용하기 위한 헤더 파일들을 추가한다. 실제로 저 헤더를 열어보면 수십개의 헤더를 include하는 코드를 볼 수 있다.


GameFramework/Actor.h

Actor클래스를 생성했기 때문에 Actor를 상속받기 위해 include.


MyActor.generated.h

이 부분이 좀 특이한데, 언리얼 에디터에서 소스코드가 컴파일 되기 이전에 소스코드를 분석해서 에디터에 표시할 수 있도록 하기 위한 정보들이 저장된다.

리플랙션(reflection)이라고 하는 이 기능 프로그램이 실행될 때 자신의 코드를 분석하는 기능으로, Java의 그것과 같은 것이다.


언리얼 엔진의 리플렉션(reflection)


우리는 MyActor라는 클래스를 만들었지만 언리얼 에디터(이것도 하나의 프로그램이다.)는 이 클래스의 내부 구조를 알 수 없다. 너무나 당연하게도 언리얼 에디터를 만들 때는 MyActor클래스가 없었기 때문이다.


그럼에도 불구하고 우리가 마음대로 변경한 MyActor 클래스를 에디터에 추가할 수 있고, 맴버 함수를 호출하거나 맴버 변수의 값을 변경시킬 수 있는 것은, reflection을 통해 MyActor 클래스의 구조를 실행 단계에서 알 있기 때문이다.


reflection은 c++ 언어에서 지원하지 않는 기능이라서 언리얼 엔진이 메크로로 정의해서 사용하고 있다. 앞으로 등장할 UCLASS(), UPROPERTY() 등은 대부분 이 기능을 위한 메크로이다.



UCLASS()

UHT(Unreal Header Tool)이라는 툴이 코드가 컴파일 되기 전에 코드를 돌아보면서 UCLASS()메크로 다음 줄에 오는 것은 클래스라고 판단한다.

괄호 안에 매개변수들을 넣을 수 있지만 어떤 매개변수를 넣어서 응용할 수 있는지는 더 공부해봐야 알 것 같다.


GENERATED_BODY()

클래스의 몸체를 정의하는 메크로. 언리얼 도큐먼트에 따르면 반드시 클래스 정의 첫번째 줄에 위치해야 한다고 한다. 정확히 어떤 기능을 하는지는 모르겠다.


생성자

생성자다.


virtual void BeginPlay() override;

Spawn 될 때 호출되는 함수라고 한다. 생성자와 혼동하지 말자.


virtual void Tick(float DeltaTime) override;

매 프레임 호출되는 함수.




다음은 cpp인데 함수 머리만 작성되어 있어서 크게 볼 건 없다. 한가지 볼 것은 생성자에 작성된 한 줄이다.

2.PNG


PrimaryActorTick.bCanEverTick = true;

Tick 플래그를 true로 설정해서 이 클래스에서 Tick함수를 사용하겠다고 하는 코드이다. 이 코드가 없으면 위에 정의된 Tick함수가 있어도 호출되지 않는다.


그 외 Super::함수이름();

부모 클래스에 정의되어있는 로직도 실행시키고 내 로직도 실행시키기 위해서 부모 클래스의 같은 이름의 함수를 호출하는 것이다.






마치며


별로 중요하게 생각하지 않았던 부분인데, 공부하면서 리플렉션 이라는 기능도 알게 되었고, 덕분에 메크로를 더 잘 사용하게 될 것 같다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함