
이번에는 언리얼엔진에서 제공하는 프로그래밍 퀵스타트 페이지를 따라 진행할 것이다
프로그래밍 퀵스타트 | 언리얼 엔진 5.3 문서 (unrealengine.com)
이번 퀵스타트는 이미 전에 다루어 보았던 프로젝트 생성, C++ 클래스 만들기, 간단한 기능 구현, 프로젝트 컴파일, 레벨에 새로운 클래스 인스턴스 추가 등의 내용을 담고 있는데, 복습 & 총정리 정도로 생각하면 좋을 것 같다
이 퀵스타트를 끝내고 나면 프로그래밍 퀵스타트 페이지에 있는 영상처럼 정육각형 모양 액터가 테이블 위에서 회전하며 둥둥 떠다니는 결과물을 얻게 될 것이다
먼저 위처럼 기본 템플릿에 프로젝트 타입을 C++로 하고 Starter Content를 포함시킨 채로 새 프로젝트를 생성한다
프로젝트 생성이 끝나면 [StartContent > Maps] 폴더에 있는 Minimal_Default 맵을 더블클릭해서 열어준다
그리고 상단 메뉴바에서 [Tools > New C++ Classes]을 선택해서 클래스를 생성한다
여기서 부모 클래스로 Actor를 선택하고 클래스의 이름을 FloatingActor로 입력한 후 생성한다
다시 한번 알아보자면 액터는 레벨에 배치될 수 있는 오브젝트를 이야기한다
먼저 UStaticMeshComponent* 타입으로 VisualMesh를 선언해서 정적인 메쉬를 표현하고 조작할 수 있도록 하고 VisibleAnywhere 지정자를 넣어서 에디터에서 읽기 전용으로 만든다
VisualMesh를 CreateDefaultSubobject( )함수를 사용하여 하나의 컴포넌트로 생성하고, SetupAttachment( ) 함수로 루트 컴포넌트에 붙여 자기 자신을 루트 컴포넌트로 만든다
언리얼5-16 C++ <생성자에 BP_Class와 리소스 불러오기>에서 했듯이 ConstructorHelpers에 있는 FObjectFinder<>는 리소스를 찾는 헬퍼 클래스이고, UStaticMesh 오브젝트를 찾을 것임을 나타낸다
Text("/Game/StaterContent/Shapes/Shape_Cube.Shape_Cube") 경로에서 큐브를 찾아서 CubeVisualAsset 변수에 저장해 준다 (프로젝트를 생성할 때 StarterContent를 체크해야만 경로를 통해 큐브를 불러올 수 있다)
만약 FObjectFinder이 성공적으로 리소스를 찾았다면, SetStaticMesh( ) 함수를 통해 VisualMesh컴포넌트에 큐브 메시를 할당하고, SetRelativeLocation( ) 함수로 액터공간에서의 위치를 (0,0,0)으로 지정한다
이제 액터가 움직이도록 하는 코드를 작성해보자
먼저 액터의 현재 위치와 회전을 가져오기 위해서는 GetActorLocation( ) 함수와 GetActorRotation( ) 함수를 사용한다
가져온 액터의 위치를 FVector(언리얼 엔진에서 위치와 속도 등을 다루기 위한 타입)로 NewLocation변수에 할당하고, 회전을 FRotator(언리얼엔진에서 회전을 다루기 위한 타입)로 NewRotatation 변수에 할당한다
이렇게 함수 내부에서 선언된 변수를 프로그래밍에서는 "지역 변수"라고 부른다
지역 변수는 변수가 선언된 시점부터 해당 변수가 선언된 블록이 끝나는 부분까지만 유효하다
이 함수가 끝나는 순간 이 FVector 타입의 NewLocation 변수는 사라져 버린다
변수를 하나의 함수 내에서만 사용하는 게 아니라 여러 함수에서도 사용하고 싶다면, 헤더파일에 있는 RunningTime 변수처럼 클래스의 헤더에 멤버 변수로써 선언해주어야 한다
그다음에는 GetGameTimeSinceCreation( ) 함수를 사용해서 게임이 시작된 이후에 경과한 시간을 RunningTime 프로퍼티에 할당한다
이 문장 대신에 float RunningTime += DeltaTime; 을 사용해도 되는데, DeltaTime 변수는 매 프레임 호출되는 Tick 함수가 언리얼 엔진 시스템에서 매개변수로 받아오는 변수로써, 호출된 프레임끼리의 시간 간격이다
이렇게 RunningTime 변수에 DeltaTime을 매 프레임 더해주면, 이 액터가 생성되어 레벨에 배치된 후로부터 얼마만큼의 시간이 흘렀는지를 알 수 있게 된다
그다음에는 float 타입으로 DeltaHeight 변수를 선언하고 여기에 Sin( ) 함수를 사용해서 간단한 상하 움직임을 표현한다
이렇게 해주면 Sin 그래프를 따라 오브젝트가 동작하는 시간 동안 앞서 나가는 값과 원본 값의 차를 구해서 액터가 얼마나 위아래로 움직여야 하는지 그 값을 구할 수 있게 된다
그리고 이렇게 구한 DeltaHeight에 20을 곱한 값을 NewLocation의 Z 축에 더해줘서 시간에 따라 액터의 높이를 변하게 한다
DeltaRotation에는 시간에 따라 변화하는 회전값을 계산해서 초당 20도씩 회전하도록 한다
그리고 NewRotation의 Yaw(Pitch = X축, Roll = Y축, Yaw = Z축)값을 DeltaRotation만큼 더해서 저장한다
마지막으로 이 액터를 NewLocation 위치와 NewRotation 회전으로 옮겨주어야 한다
액터를 원하는 좌표로 옮기기 위해서 SetActorLocationAndRotation( ) 함수를 사용하였다
코드를 모두 작성하면 [Ctrl + Shift + 'S']를 눌러 모두 저장하고 컴파일한다
컴파일이 끝나면 코드를 테스트할 차례이다
찾은 클래스를 선택해서 레벨 에디터에 끌어다 놓으면 FloatingActor의 인스턴스가 생성된다
이렇게 월드에 배치된 오브젝트를 인스턴스(instance)라고 부른다
컴포넌트를 넣어주지 않았다면 레벨 에디터에서 보이지 않았겠지만 앞에서 FObjectFinder로 큐브 리소스를 찾아 할당해 주었기 때문에 큐브 형태로 바로 볼 수 있게 되었다
레벨 에디터 뷰포트에서 FloatingActor의 형태가 보이기 시작하면 보기 쉽게 모양과 자리를 잘 잡아준다
게임을 플레이시키면 FloatingActor가 테이블에서 위아래로 움직이는 모습을 볼 수 있다
여기까지 진행하면 프로그래밍 퀵스타트 페이지에 있는 영상과 같은 결과물을 얻을 수 있다
다음 글에서는 언리얼엔진 문서에서 제공하는 '직접 해보기' 항목을 할 것이다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!