프로그래밍 공부
작성일
2024. 1. 10. 15:24
작성자
WDmil
728x90

언리얼 케릭터의 기본이동과 회전에 대해 알아보자.

 

키 입력 세팅

 

우리가 게임을 할 때 WASD나, 위아래 화살표 등, 이동에 사용하는 키의 입력값 들이 있다.

 

이러한 입력을 언리얼엔진에서는 쉽게 기입할 수 있도록, 프로젝트 세팅을 사용할 수 있다.

프로젝트 세팅
엔진->입력 을 타고 들어가면, 위와같이 키 바인딩이 보인다.

여기서 액션 매핑, 축 매핑을 확인할 수 있는데,

 

각각 다음과 같다.

  • 액션 매핑 : 키가 입력을 한번 받고 행동하는것. 일시적인 행동. 공격 또는 점프 등을 이야기한다.
  • 축 매핑 : 키가 입력을 받고 계속 행동하는것. 입력중에도 계속 행동한다. 기본이동, 회전 등을 이야기한다.

위에 설정한대로, MoveForward 와 MoveRight나 Turn, LookUp등을 세팅해보자.


블루프린트 생성

 

이전에 c++에서 사용되는 클래스 개념이 블루프린트 라고 이해했었다.

 

이러한 블루프린트를 사용해서 기본이동을 구현해보자.

콘텐츠 브라우저에서 마우스 오른쪽 클릭을 하면 쉽게 생성할 수 있다.

 

콘텐츠 브라우저에서 마우스 오른쪽 클릭을 통해 블루프린트 클래스를 생성한다.

 

위와같은 팝업창이 나타나는데, 위와같은 객체의 설명을 그대로 이해해도 좋다.

 

엑터는 말 그대로 모든 객체의 기본인 오브젝트를 의미한다.

폰은 빙의가 가능한 객체를 의미한다.

케릭터는 플레이어가 이동 회전등이 기본적으로 구현된 클래스이다.

 

즉, 엑터 -> 폰 -> 케릭터 순서대로 상속과정이 이루어진다고 이해하면 된다.

 

우리는 객체의 생성후 이동까지 구현할것 임으로 케릭터를 선택한다.


케릭터 블루프린트

위와같이 생성된다.

New BluePrint라고 생성되는것을 확인할 수 있다.

 

더블클릭하면 세부사항을 볼 수 있다.

 

위와같이 블루프린트를 수정할 수 있는 브라우저가 뜨는데,

 

우리가 확인해야 할 부분은, 이벤트 그래프와 컴포넌트 추가, 그리고 그 밑의 Arrow, Mesh이다.

 

상속을 확인하면, Capsule Compone에 상속되어있는 Arrow와 Mesh를 확인할 수 있는데,

Arrow는 케릭터의 정면, mesh는 Capsule에 따라다니는 외형 이라고 생각하면 된다.

 

즉, Mesh는 따로 행동하는것 이 아닌 그냥 외관껍질, 스킨이라고 이해하자.

 

우리가 사용할 케릭터 Mesh는 언리얼에서 기본적으로 제공해주는 리그돌을 사용할 것 이다.

요친구

언리얼을 하다보면 자주보게될 친숙한 친구이다.

 

이친구를 Collider에 입혀서 사용해보자.

 

아주 간단한데, Mesh를 클릭하면 바로 오른쪽에 메시 툴바가 뜬다.

 

여기에서 Skeletal Mesh를 찾아서 선택해주면 나타난다.

쉽게 등록 사용할 수 있다.

 

위와같이 생성되었으면, 우리는 뭔가 이상한점을 느낄 수 있다.

 

Mesh는 현재 우리 화면을 정면으로 바라보는 형태인데,

 

Arrow의 방향을 살펴보면 X축을 바라보고있다!

 

즉, 현재 이 캐릭터를 그대로 사용하면 정면이 우측이고, 우측이 정면이 바뀌어버리는 상황이 발생한다.

 

우리는 이 Mesh를 Collider에 맞게 수정하여 입혀주어야 한다.

 

메시 위쪽에 트랜스폼을 살펴보자.

여기에서 회전값과 위치를 -90으로 넣어보자.

위와같이 이동하는것 을 볼 수 있다.

 

항상 Mesh는 Collider에 상속함으로, 여기에서 Mesh를 수정하고 Collider를 움직이게 되어도 Mesh도 같이 움직이게 된다.

 

여기서는 초기설정을 만져준다고 생각하자.

 

일단, 위와같이 데이터를 정렬해주었으면, 위에서 등록했었던 키값을 사용하기 위해 블루프린트를 사용하기 위한

 

이벤트 그래프로 이동하자.


이밴트 그래프 코딩하기

 

이벤트 그래프 창

이벤트 그래프로 들어가보면 위와같이 생성되어있는것 을 볼 수 있다.

 

저 붉은블럭은 해당사항이 있을 때 활성화되어, 화살표를 한번 활성화한다.

 

화살표는 이어져있는 화살표로 계속 이어지면서. 해당되는 모든 블럭을 활성화하게 된다.

 

이 기본개념을 가지고 나머지 블록을 살펴보면, 

 

BeginPlay = 시작할때

ActorBeginOverlap = 엑터가 뭔가랑 겹쳤을때

Tick = DeltaTime마다

라고 이해하면 된다.

 

그리고 우리는 이동을 구현할것 임으로. 위 3가지를 전부 사용하지 않는다.

 

우리가 처음에 만들었던 키 입력을 사용할것이다.

 

키 입력을 불러와보자.

빈칸을 오른쪽 마우스 클리하면 창이 나온다.

 

빈칸에 마우스 오른쪽 클릭을 하면,이 블루프린트에서 사용할 수 있는 모든 액션이 나타나는데, 여기에 검색해서

 

우리가 만들었던 키 입력값을 불러와보자.

 

우선 Forward와 Back을 만들것 이다.

 

여기에 축 값과 축 이벤트가 있는데,

축 값은 축의 값만 가져오는것 이고, 축 이벤트는 이벤트 마다 실행하는것 임으로, 이벤트로 가져온다.

 

그리고 

Add Movement Input

을 넣어준다.

 

여기에서 무언가를 느낄 수 있는데,

 

사실 언리얼에는 우리가 게임을 만들 수 있는 거의 모든 코딩을 블루프린트로 만들어놓았다.

 

그저 우리가 찾지 못했을뿐이다.

 

그럼으로. 모를때는 먼저 블루프린트를 뒤적거려보자.

 

아무튼, AddMovementInput을 입력하였으면, 이제 스크레치마냥 선을 이어주면된다.

위와같이 이어주면된다.

각 항목을 설명하자면,

 

MoveForward에 대한 입력이 감지되었을 경우, 화살표로 이어지는 모든 코드블럭을 실행한다.

 

코드는 AddMovementInput이다. 해당 코드는 타깃을 self로 잡는다. 자기자신이라는 뜻이다.

WorldDirection은 방향이다. 현재 방향을 알 수 없음으로, 0,0,0임을 확인할 수 있다.

Scale Value는 해당 방향을 몃으로 증폭할것 이냐 물어보는것 이다.

 

1은 1배, 2는 2배라고 생각하면된다.

-로도 동작하여 우리가 키를 입력할때 S를 누르면 Scale Value 가 -1이 나타나도록 하였다.

 

 

이제 Direction을 구해보자. 우리는 이미 Arrow를 보며 정면 방향이 이미 정해져있음을 알 고 있다.

 

그럼으로 현재 Collider에 대한 Rotation값을 구하면, 외적하여 방향을 알 수 있지 않을까?

 

그렇다! 이미 블루프린트에는 전부 구현되어있다.

 

살펴보자.

위에서 GetControlRotation을 확인할 수 있다. 컨트롤러에 대한 현재 Rotation값을 가져오는것 인데,

 

컨트롤러의 로테이션을 받아온다. 컨트롤러가 아닐경우, 폰의 시야 로테이션(Arrow의 방향)을 반환한다.

 

이걸 활용한다.

 

이걸 우리는 Roll Pitch Yaw형태로 분해하여 사용할 수 있다.

무려 이것도 준비되어있다.

 

Rotation Value값에서 X Y Z 값을 분리해서 반환해준다.

 

우리는 여기에서 케릭터의 정면방향을 확인해야 함으로. Yaw(Z) Rotation값만 필요하다.

 

해당 값만을 사용해서 다시 Rotator를 구성해주자.

 

이렇게 하는 이유는, 혹시나 하는 불순값이 들어올경우 나중에 찾기 힘들어지기 때문이다.

 

그럼으로 필요한 값이 있으면 그 값만 가져와 사용하자.

 

위에서 우리는 Rotator를 부수었다. 그렇다면 다시 만들 수 있지 않을까?

 

물론 가능하다.

 

Make Rotator를 사용해서 Rotation을 다시 가져오자.

물론 Z에 연결해야한다.

위와같이 가져왔으면 이제 우리는 방향을 알 수 있다.

 

Z값 회전을 알 수 있음으로. 해당 값을 기준으로 Rotation의 VectorForward를 반환하는 블럭을 사용한다.

위와같이 Get Forward Vector를 사용한다.

 

Get Forward Vector은, 받아온 Rotation값을 기준으로 Forward vector를 반환한다.

 

해당값은 정면값임으로 이미 Normalize되어있다.

 

해당 값을 전부 이어주면, 우리는 정면과 후면 방향으로 이동할 수 있다.

 

같은 방법으로 좌측이동 우측이동을 쉽게 만들 수 있다.

위와같이 방향벡터를 활용해서 이동할 수 있다.

이제 회전을 구현해보자.

 

우리는 이미 Y축을 기준으로 Yaw와 Roll을 마우스기준으로 넣었던 기억이 있다.

 

해당 값을 활용한다.

LookUp은 위아래 를 바라보는것 임으로, Roll Pitch Yaw중 Y축회전인 Pitch

Turn은 회전임으로ㅓ Roll Pitch Yaw중 Z축 회전인 Yaw회전을 적용하여 이용한다.


실질 이동 적용.

 

자 이제 컨트롤이 완료되었으니, 컨트롤을 할 수 있도록 컨트롤러를 지정해주어야 한다.

위에서 보는것과 같이, BP_Player 를 선택하고 Auto Player선택을 Player0를 선택해주면 된다.

 

그렇다면, 해당 Pawn을 따로 지정해주지 않았을 때, 자동으로 Player0(디폴트 플레이어) 를 기준으로 컨트롤러를 주게 된다.

 

권한지정이라고 이해하면 된다.


오브젝트 배치

 

콘텐츠 브라우저에서 드래그해서 위로 올려주면 된다.


카메라 수정

 

우리가 위에서 수정한대로 이동하면, 카메라의 기준점이 존재하지 않음으로, 캐릭터의 베이스점을 기준으로 카메라가 배치되는것을 확인할 수 있다.

 

쉽게말하면. 배에 카메라가 박혀있다..

 

이 상황을 해결하려면. 

블루프린트에서 카메라를 배치해주면 된다.

부드러운 카메라 이동을 위해. Spring Arm을 먼저 넣어주고,

 

그다음에 Camera를 지정해서 넣어주자. 

Camera를 넣고 이동시켜도 무방하고, SpringArm을 선택하고 컴포넌트 추가를 눌러도 된다.

 

카메라를 넣었으면 카메라를 이동시켜보자.

 

상속과정을 생각하면 Spring Arm을 기준으로 Camera가 생성되었음으로, Spring Arm을 이동시키거나 회전시키면 카메라가 이동하는것을 알 수 있다.

 

SpringArm을 다음과 같이 수정해보자.

SpringArm 이동

그러면 카메라가 등 뒤에 위치함을 알 수 있다.

 

여기에서 카메라를 조금 이동시키면

Camera 이동

자연스럽게 카메라가 바라봄을 알 수 있다.

 

이대로 적용해도 카매라가 정상적용됨을 알 수 있지만, 좀더 다르게 스프링암을 활용해보자.

위와같이 지연을 허가하고, Spped 또는 Distance를 수정하면, 부드러운 카메라 이동을 사용할 수 있다.


 

728x90