언리얼엔진 학습 및 과제

[내일배움캠프] 간단한 점프맵

park94128 2025. 8. 7. 20:00

1. 오늘 사용할 에셋

- Online Learning Kit

이 에셋에는 단순하게 보이는 로봇 캐릭터가 있다. 그리고 이 캐릭터가 기본적인 이동 애니메이션을 갖췄기 때문에 선택했다. 다만 5.5버전을 지원하지 않기 때문에 버전 변경 과정을 거쳐야 한다. 그래도 캐릭터 애니메이션은 5.5에서 문제없이 작동한다.

 

사실 내일배움캠프 강의에서 사용한 캐릭터라서 고른 것도 있다.

 

- Soud: Cave

에픽 게임즈 공식 에셋이며, 무료 에셋이라서 누구든지 이용할 수 있다. 간단하고 대충 만들 생각이에 밟을만한 바위나 건축물 몇 개만 있으면 적당하다고 생각했다. 그래서 이 에셋을 골랐다.

 

2. 캐틱터 블루프린트

내가 직접 저 로봇 캐릭터를 조종하려면 캐릭터 블루프린트가 필요하다. 그러니 캐릭터 블루프린트를 생성하자.

 

그리고 생성한 블루프린트의 메시 컴포넌트를 누르고 디테일 화면에서 로봇 메시를 지정하면 로봇 캐릭터가 완성된다.

 

하지만 아직 캐릭터가 만들어졌을 뿐 조종은 불가능하다.

 

3. 플레이어 입력

어제 블루프린트에서는 C++코드와는 달리 키 입력 이벤트가 있으면 키 입력을 받을 수 있다고 했다. 하지만 캐릭터 이동과 같이 복합적으로 받아야 할 경우 이 방법을 쓰기엔 매우 비효율적이다.

그러니까 이러면 안된다는 소리다.

 

C++ 코드에서 UE5 방식의 입력 받기를 만든 것처럼 구현해야 한다. 그리고 블루프린트는 그러한 방식으로 만들 수 있도록 기능을 다 만들어놨다.

즉, 이 코드 내용을 블루프린트로 구현하는 것이 맞다는 소리다.

 

1) Input Action과 Input Mapping Context를 생성하기

플레이어의 입력 방식을 Input Action으로 만들고 이를 종합할 Input Mapping Context를 만든다. 여기서는 캐릭터 이동, 카메라 이동, 점프 3가지가 필요하니 Input Action도 3개를 만든다.

여기서 캐릭터 이동과 카메라 이동은 2차원 입력이 필요하니 값 타입을 Axis2D(Vector2D)로 고른다.

Input Mapping Context에서는 생성했던 Input Action을 지정한다. 캐릭터 이동은 W,A,S,D 키를, 카메라 이동은 마우스 이동(마우스 XY 2D 축)을, 점프는 스페이스 바 키를 매핑한다.

키보드 입력은 기본적으로 아무것도 건드리지 않으면 무조건 양의 X값으로 인식한다. 그래서 캐릭터 이동에 맞게 값을 변경할 필요가 있다.

- W : 여기서는 양의 X를 앞쪽 방향으로 취급할테니 건드리지 않는다.

- S : 양의 X를 앞이라고 했으니 뒤쪽은 음의 X가 된다. 따라서 '부정'을 추가한다.

- A : 앞뒤 방향을 X로 한다면 좌우 방향이 Y가 된다. 그러니 '스위즐 입력 축 값'을 지정한다. 기본적으로 이 모디파이어는 YXZ를 지정하기 때문에 이 입력은 Y값이 되는 것이 기본이다. 여기에 더하여 보통 왼쪽과 오른쪽을 놓고 보면 왼쪽을 음의 값으로 보기 때문에 '부정'도 같이 있어야 한다.

- D : A의 반대 방향이기 때문에 '스위즐 입력 축 값'만 지정한다.

 

마우스는 이동의 경우 Y값만 반대로 받을 필요가 있다. 나중에 설명할 기능중 카메라의 세로방향 이동은 양의 값을 입력하면 아래로 내려가기 때문이다.

 

2) 캐릭터 컨트롤러에서 Input Mapping Context를 추가

캐릭터는 생성했지만 플레이어 컨트롤러는 생성하지 않았다. 즉, 엔진의 기본 컨트롤러를 사용하게 되는데 블루 프린트는 이 기본 컨트롤러를 직접 편집할 수 없으니 캐릭터에서 가져와서 등록해야 한다.

 

3) Input Action 이벤트를 추가하여 기능 완성하기

A : 캐릭터 이동

캐릭터 이동에 대한 Input Action 이벤트를 추가한다. 여기서 X값과 Y값을 따로 처리해야 하니 이벤트의 출력값을 분리한다.

먼저 출력을 분할한다.

 

그리고 X값을 앞뒤 방향이라고 했으니 X는 캐릭터 정면 방향 기준으로 이동하게 하고 Y는 캐릭터 오른쪽 방향 기준으로 이동하게 만든다.

 

B : 카메라 이동

카메라 이동 역시 X와 Y를 분리하고 각각 처리한다. 여기서 카메라 세로방향 이동인 Add Controller Pitch Input은 양의 값을 입력하면 아래를 향한다. 그래서 매핑시 마우스의 Y값을 반전시켰다.

 

C : 점프

점프인 스페이스 바에 대해서는 그냥 눌렀다는 것만 알면 되므로 매우 간단하다.

 

4) 그 외 캐릭터 설정

일단 카메라 이동 입력을 해놨지만 정작 캐릭터에는 카메라가 없다. 그러니 카메라를 추가해야 한다.

캐릭터 컴포넌트에 Spring Arm을 추가한다. 그리고 그 하위 컴포넌트로 카메라를 추가한다.

그러면 블루프린트의 뷰포트에서 카메라가 보인다.

 

Spring Arm의 디테일 화면에서 카메라 세팅을 찾아보자. 그러면 '폰 제어 회전 사용'이 false임을 볼 수 있는데 이 값이 true이어야 제대로 마우스 이동이 먹히니 주의하자

 

그리고 캐릭터 컴포넌트, 즉 루트 컴포넌트의 디테일 화면에서 폰을 찾아보자. 여기서 2가지를 확인해야 한다.

- 컨트롤러 회전 요 사용 : 이 값이 true면 좌우 이동 입력이 캐릭터의 좌우 이동이 되고 false면 해당 방향으로 회전하게 된다. 만약 true일 경우 캐릭터 메시 또한 자동으로 회전하게 설정해야 한다.

- 플레이어 자동 빙의 : 기본적으로 Disable이 지정되어 있다. 이것을 Player 0으로 지정해야 내가 조종하는 캐릭터가 된다. 플레이어의 번호는 기본적으로 0이기 때문에 이 값을 지정하지 않으면 조종할 수 없다.

 

4. 애니메이션

캐릭터의 루트 컴포넌트에 있음

이제 원하는 방식대로 움직이긴 하는데 뭘 해도 가만히 있으니 어색하다. 그래도 이 에셋은 캐릭터의 상황에 따라 자동으로 실행되도록 미리 만들어진 상태다 따라서 캐릭터의 애니메이션을 지정하기만 하면 된다. 이처럼 FAB에서 캐릭터를 받을 경우, 이 분야를 담당하는 사람이 없다면 애니메이션이 미리 만들어진 것을 구하는 쪽이 편하다.

 

5. 지형 배치

지형을 배치할때 그 지형이 밟을 수 있는지 확인해보자. 내가 받은 에셋 중에는 단순 배경용이라서 그런지 콜리전이 없는 메시도 있어서 맵 만들다가 문제를 겪은 적이 있다.

 

6. 예외 처리

테스트를 하는데 다른 문제가 발견했다. 만약 땅을 밟는데 실패해서 저 아래로 떨어지면 영원히 떨어지게 된다. 그래서 캐릭터의 Tick에 다음과 같은 기능을 만들었다.

만약 캐릭터의 위치값 중 높이인 Z값이 -500보다 낮아지면 즉시 시작지점 (0,0,150)으로 이동한다.

void AMyCharacter::Tick(float DeltaSeconds)
{
	Super::Tick(DeltaSeconds);

	if (GetActorLocation().Z < -500)
	{
		SetActorLocation(FVector(0, 0, 150.0f));
	}
}

이 내용을 코드로 옮기면 위와 같다.