Unreal

Unreal) 플레이어 캐릭터와 나만의 레벨 디자인

준모 2024. 12. 19. 16:11

 

 

오늘은 ‘Online Learning Kit’, ‘Lower Sector Building Kit’ 를 이용하여

 

플레이어 캐릭터의 기본 동작을 블루프린트를 사용하여 구현해보았다.

 

 

플레이어 캐릭터 생성


 

먼저 프로젝트 생성 후 

 

작업할 폴더를 만들어준 다음

 

블루프린트 클래스 > 캐릭터를 생성해준다

 

 

 

 

생성한 이름의 루트 컴포넌트아래 여러가지 컴포넌트들이 있다.

 

 

- 캡슐 컴포넌트는 캐릭터와 같은 물체의 충돌 영역을 정의하는 데 사용되고, 보통 물리적 상호작용에 이용된다.

 

- 화살표 컴포넌트는 게임 오브젝트의 방향을 시각적으로 표시하는 데 사용되고,  주로 디버깅용으로 사용된다.

 

- 메시 컴포넌트는 3D 객체의 모델을 화면에 렌더링하는 컴포넌트로, 실제 게임 내에서 보여지는 물체의 모양을 나타낸다.

 

 

- Character Movement Component캐릭터가 게임 내에서 이동할 수 있도록 돕는 핵심적인 역할을 하며,

 

 다양한 이동 방식(걷기, 뛰기, 점프 등)과 물리적 상호작용을 처리합니다.

 

 

 

아래 사진과 같이 MeshComponent에서 Mesh를 등록하고,

 

Capsule과 맞게 위치, 크기 조정을 하면 된다.

 

 

 

 

 

Mesh의 크기, 위치, 방향을 조절했으면 SpringArm과, Camera를 추가하고,

 

PlayerObject의 디테일에서 플레이어 자동빙의를 설정해주면 

 

Camera가 PlayerObject를 따라다니며 화면에 Player의 시점으로 볼 수 있게 된다.

 

 

 

 

 

플레이어 캐릭터 간단한 로직 구현


 

 

플레이어를 생성했기 때문에, 플레이어의 움직임, 시선, 점프 세가지를 구현하려고 한다.

 

우선 아래 사진처럼 InputAction에셋을 각각 Move, Jump, Look으로 생성해준다.

 

그리고 InputMappingContext를 생성해준다.

 

InputAction에서 입력 이벤트를 정의하고,

 

InputMappingContext에서 Controller의 Key를 액션에 맵핑해주는 개념이다.

 

 

 

각각의 InputAction에 따라서 값타입을 설정해줘야 하는데,

 

Move의 경우 앞뒤좌우로 이동하기 때문에 Axis2D를 사용하면 된다.

 

Look의 경우 마우스의 움직임으로 입력을 받는데,

 

상하좌우로 시선처리가 되기 때문에 마찬가지로 Axis2D를 사용하면 된다.

 

 Jump의 경우 점프 하냐 안하냐로 판별되기 때문에 Bool값을 사용하면 된다.

 

 

 

InputAction의 값타입을 설정해 줬으면, InputMappingContext에서

 

각각의 InputAction에 사용되는 ControllerKey를 Mapping해줘야 하는데,

 

Move의 경우 W, A, S, D로 이동하기 때문에 4개의 Key를 Mapping해줘야 한다.

 

캐릭터는 기본적으로 X축 방향을 바라보고 있기 때문에, W에는 모디파이어를 설정해주지 않고,

 

S는 W의 반대이기 때문에 모디파이어를 부정으로 설정한다.

 

D는 Y축으로의 이동이기 때문에 스위즐 입력 측 값을 설정해준다

( 입력 시스템에서 스위즐을 활용하면, 예를 들어 x축과 y축을 서로 교환하거나,

하나의 축 값을 여러 다른 축으로 결합할 수 있습니다. )

 

A는 D의 부정이기 때문에 스위즐 입력 측 값을 설정하고 부정을 추가 설정해주면 된다.

 

 

 

 

InputMappingContext를 설정해줬으면 블루프린트 이벤트그래프를 설정해줘야한다.

 

 

AddMappingContext:

이 함수는 **입력 매핑 컨텍스트(Input Mapping Context)**를 플레이어나 액터에 추가하는 역할을 한다.

 

즉, 입력 시스템에 정의된 키 매핑이나 액션 맵핑을 게임 컨트롤러 또는 플레이어연결하는 과정입니다.

 

MappingContext에 내가 정의한 InputMappingContext를 넣어주면 된다.

 

 

Get Player Controller:

이 함수는 현재 게임을 플레이하고 있는 플레이어의 컨트롤러를 가져오는 역할을 한다.

 

플레이어의 컨트롤러는 플레이어 입력을 처리하는 객체.

 

 

Enhanced Input System Subsystem을 통해 입력 매핑을 관리하기 때문에

 

EnhancedInputLocalPlayerSubsystem를 이용해야한다.

 

결론적으로, EnhancedInputLocalPlayerSubsystem입력 매핑을 효율적이고 유연하게 관리하기 위해 반드시 필요한 중간 계층이다.

 

 

 

 

 

EnhancedInputAction [IA_MO_Move]:
IA_Move라는 입력 액션(Input Action)이 Triggered되었을 때 실행됩니다.

 

Action Value X: 입력의 X축 값 (좌/우 방향).

 

Action Value Y: 입력의 Y축 값 (앞/뒤 방향).

 

 

Get Actor Forward Vector, Get Actor Right Vector

현재 캐릭터의 **앞 방향, 오른쪽 방향 **을 반환합니다.

 

 

Add Movement Input

World Direction: Get Actor Forward Vector와 Get Actor Right Vector 의 결과로,

 

캐릭터의 앞, 오른쪽 방향을 지정합니다.

 

Scale Value: Action Value  값을 받아서 속도를 결정합니다.

 

 

  1. IA_MO_Move 입력 액션 발생
    Enhanced Input Action 노드가 Triggered되면, X축과 Y축 값을 계산합니다.
  2. 캐릭터 방향 계산
    캐릭터의 현재 방향(Forward, Right Vector)을 가져옵니다.
  3. 이동 처리
    • X축 값은 Forward Vector와 곱해져 전진/후진 이동으로 연결됩니다.
    • Y축 값은 Right Vector와 곱해져 좌/우 이동으로 연결됩니다.
    • 이 결과를 Add Movement Input 노드에 전달하여 이동 동작을 구현합니다.

 

 

 

 

 

Move와 마찬가지로 IA_MO_Look Event를 Yaw와 Pitch에 각각 설정해준다.

 

Yaw > 좌우

 

Pitch > 위 아래

 

Roll > 회전

 

 

 

 

회전은 모디파이어를 따로 설정하지 않아도 되지만,

 

Pitch로 이동할 경우 평소에 플레이하던 게임과 반대로 움직이는 현상이 있기 때문에

 

Y값만 부정해주면 된다.

 

 

 

위에의 Move가 플레이어의 방향 기준으로 움직였다면

 

아래의 Move는 컨트롤러의 방향을 기준으로 움직이도록 구현된 스크립트다.

 

플레이어 캐릭터가 앞과 뒤로 움직일땐 화면을 기준으로 움직이기 때문에

 

컨트롤러의 Z값을 가져와 WorldDir로 설정해줘야한다.

 

마찬가지로 좌우로 움직일 경우에는 현재 바라보고 있는 x축과 z축을 기준으로 움직여야하기 때문에

 

WorldDir로 설정해줘야 한다.