유니티(Unity)/2D 게임 만들기

2D 게임 만들기 (4) 캐릭터를 움직이기 위한 준비, 키 입력 받기

Whiny 2021. 5. 10. 15:19

이번 포스팅에서는 지금까지 설정한 캐릭터를 직접 움직여 보려고 합니다.

 

지금의 캐릭터는 Transform, Sprite Renderer, Animator 이 세 개의 컴포넌트만 가지고 있습니다.

 

이제 여기에 Box Collider 2D, Rigidbody 2D를 추가해주겠습니다.

Box Collider 2D - 직사각형의 형태로 2D 충돌을 감지하는 컴포넌트입니다.

Offset과 Size를 조정하여 캐릭터의 발 위치로 조정하였습니다.

 

Rigidbody 2D - 게임 오브젝트가 물리 제어로 동작하게 해주는 컴포넌트입니다.

 

Mass(질량), Linear Drag(움직일 때 공기저항), Angular Drag(회전할 때 공기저항), Gravity Scale(몇 배의 중력을 적용할지) 등을 설정하였습니다.

 

그리고 우리의 캐릭터는 회전시키지 않을 예정이므로 Constraints에서 Z축의 Rotation을 Freeze, 즉 고정시켰습니다.

 

위 두 컴포넌트에 대한 자세한 정보는 다음 링크에서 확인할 수 있습니다.

docs.unity3d.com/kr/2019.4/Manual/class-BoxCollider2D.html

 

박스 콜라이더 2D - Unity 매뉴얼

박스 콜라이더 2D(Box Collider 2D) 컴포넌트는 2D 물리에 사용되는 콜라이더입니다. 주어진 포지션, 폭과 높이가 Sprite 의 로컬 좌표 공백 안에 있는 직사각형 형태입니다. 이 직사각형은 축에 정렬됩

docs.unity3d.com

docs.unity3d.com/kr/2019.4/Manual/class-Rigidbody2D.html

 

리지드바디 2D - Unity 매뉴얼

Rigidbody 2D 컴포넌트는 오브젝트를 물리 엔진이 제어하게 만듭니다. 스탠다드 Rigidbody 컴포넌트와 유사한 많은 개념이 리지드바디 2D에도 적용되나 2D에서는 오브젝트가 XY 평면에서만 움직이고 그

docs.unity3d.com

현재 우리의 캐릭터는 이런 상태일 것입니다.

여기서 플레이를 해보면 Rigidbody2D에 의해 캐릭터는 한없이 떨어질 것입니다.

 

Sunnyland -> artwork -> Environment -> props -> platform-long을 가져다 씬위에 놓고 BoxCollider 2D를 추가하고 캐릭터 아래에 놓아봅시다.

 

다시 플레이해보면 새로 추가된 발판으로 인해 우리의 캐릭터는 더 이상 추락하지 않을 겁니다.


이제 두 개의 컴포넌트를 직접 만들어 우리의 캐릭터에 추가해볼 것입니다.

 

우선 첫 번째 컴포넌트는 PlayerInput으로 키보드 입력을 담당할 컴포넌트입니다.

그리고 두 번째 컴포넌트는 PlayerControllerPlayerInput에서 받은 값으로 Rigidbody2D에 움직임을 전달할 컴포넌트입니다.

 

우선 PlayerInput입니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerInput : MonoBehaviour
{
    public string moveAxisName;
    public string jumpName;
    public float move { get; private set; }
    public bool jump { get; private set; }

    void Start()
    {
        
    }
    private void Update()
    {
        move = Input.GetAxis(moveAxisName);
        jump = Input.GetButton(jumpName);
    }
}

※변수를 public으로 설정하면, 인스펙터 창에서 해당 변수의 값을 넣어줄 수 있습니다.

 

캐릭터에 추가한 후 설정된 값들

코드를 나눠서 설명하도록 하겠습니다.

    public string moveAxisName;
    public string jumpName;
    public float move { get; private set; }
    public bool jump { get; private set; }

moveAxisName - 움직임을 담당하는 키의 이름

jumpName - 점프를 담당하는 키의 이름

move - moveAxisName에 해당되는 키 입력 후 변동되는 값이 저장될 변수

jump - jump Name에 해당되는 키 입력 후 변동되는 값이 저장될 변수

 

Project Settings에서 Input Manager를 확인할 수 있습니다. 사실 단순히 키 입력만 확인한다면,

 

Input.GetKey()와 같은 메서드를 사용하여, 

 

[왼쪽 방향키 입력] -> 왼쪽으로 이동, [오른쪽 방향키 입력] -> 오른쪽으로 이동과 같이 구현할 수 있지만, 저는

 

[x축의 음의 방향에 해당하는 키 입력] -> 왼쪽으로 이동], [x축의 양의 방향에 해당하는 키 입력] -> 오른으로 이동]과 같이 구현하려고 합니다.

 

Input Manager에서 기본적으로 Horizontal(수평)에 해당하는 키로 left(왼쪽 방향키)와 right(오른쪽 방향키)가 설정되어있습니다.

 

jump는 space로 설정이 되어있습니다.

 

    private void Update()
    {
        move = Input.GetAxis(moveAxisName);
        jump = Input.GetButton(jumpName);        
    }

 

이제 Horizontal에 해당하는 왼쪽 방향키와 오른쪽 방향키에 따라서 -1부터 1까지의 값이 move변수에 저장됩니다.

 

그리고 Jump에 해당하는 스페이스바가 눌렸는지에 따라서 true와 falsejump변수에 저장됩니다.

 


생각보다 내용이 길어져, 다음 포스팅에서 직접 움직이기(PlayerController)를 설명하도록 하겠습니다!!

 

캐릭터의 움직임, 애니메이션까지 다루도록 하겠습니다.