내일배움캠프 38일차 - 언리얼 C++: 장애물을 만들어 플랫포머 구현하기1

"움직이는 장애물"을 활용한 플랫포머 구현

그동안 강의에서 배운 지식을 활용해 움직이는 장애물을 만들어보도록 하자.

움직이는 장애물은 아래의 속성을 가지고 있다.

1) 지정한 범위만큼만 왕복한다.
2) 이동속도가 에디터 변수로 주어진다.
3) 이동범위, 이동속도는 에디터에서도 편집할 수 있어야한다.
4) 이동속도는 난수로 적용될 수 있다.

이를 토대로 움직이는 장애물을 구현해보자.

1. 지정한 범위만큼만 왕복한다.

지정한 범위만큼 왕복하기 위해서는 좌표를 가진 두 벡터를 사용할 수 있겠으나, 이 경우 특정 방향으로만 이동이 제한되어 추가로 이동한 지점을 만들고 싶을 때 추가구현이 어려울 수 있다.

따라서 벡터 두개를 사용하는 대신, 언리얼에서 제공하는 USplineComponent를 사용하기로 했다.

스플라인 컴포넌트는 과거 블루프린트를 사용할때도 활용한 컴포넌트로, 에디터에서 만들어진 곡선을 따라 움직임을 구현할 수 있는 유연하고 유용한 컴포넌트이다.

스플라인과 그 곡선을 따라갈 스태틱메시, 그리고 기준점이 되어주는 root를 구현하기 위해 아래의 코드를 사용한다.

헤더파일(.h)에서의 선언

소스파일(.cpp) 구현

이때, UPROPERTY(EditAnywhere)를 통해 에디터에서도 해당 컴포넌트에 접근, 수정할 수 있게 해준다.

EditAnywhere가 적용된 Spline컴포넌트로 이동경로를 직접 정의할 수 있도록 해준다.

2. 이동속도가 에디터 변수로 주어진다.

이동속도를 에디터에서 편집하기 위해서는 UPROPERTY()를 붙여 에디터에 리플렉션 시켜야한다. 이때, UPROPERTY()의 영향을 받는 것은 바로 밑 변수인 SpeedRange 뿐이며, meta값으로 ClampMin, ClampMax를 적용하면 편집가능한 최소값과 최대값을 조정할 수 있다.

속도를 정의하기 위해서 float을 써도 되나, 해당 프로젝트에서는 4번(이동속도가 난수로 적용)을 위해 난수가 적용되는 범위(Min~Max)를 정의하도록 한다.

UPROPERTY(ClampMin~Max)가 적용된 변수는 슬라이더의 형태를 갖춘다.

3. 이동범위, 이동속도는 에디터에서도 편집할 수 있어야한다.

앞의 1, 2번을 진행하는 과정에서 UPROPERTY()를 통해 에디터에 반영할 수 있었다.

1번은 Spline컴포넌트를 통해 이동범위를 제어할 수 있었고,
2번은 meta=ClampMin~Max를 통해 이동속도를 정의할 수 있었다.

그렇다면 에디터에서 편집한 값이 실제로 적용될 수 있도록 동작코드를 작성해보자.

게임이 처음 시작되면 스폰된 장애물에서 BeginPlay()가 실행되고, 실제 적용될 변수들이 에디터변수의 값을 참고하여 초기화된다.

이후 Tick()에서 이동거리 계산 및 스태틱메시의 이동이 시행된다. 여기서 프레임속도 동기화를 위해 실시간으로 증가하는 값(Distance,CurTime)은 DeltaTime을 곱한다.

또한 스태틱메시가 Spline곡선 상에 자리하기 위해 GetLocationAtDistanceAlongSpline()을 사용해 Distance만큼 위치하도록 한다.

4. 이동범위, 이동속도는 난수로 적용될 수 있다.

이동범위(Spline 초기위치로부터 끝위치까지)내의 시작위치와 이동속도는 매 플레이마다 변할 수 있다. 이 난수를 구현하기 위해서는 FMath::Rand()와 관련된 난수생성 함수를 사용해 초기값을 정의해야한다. 이를 위해 BeginPlay()내의 초기값을 난수를 사용해 정의한다.

FMath::FRandRange(min,max): 실수 난수값을 범위내에 생성
FMath::RandBool(): true와 false중 하나를 생성

그리고 20~3000 사이의 속도를 가진 지정한 Spline내에서 움직이는 C++액터를 배치하고 실행하면, 매 플레이마다 속도, 초기위치를 다르게 가지고 시작하는 것을 볼 수 있다.


댓글

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁