Input 

-

키보드 입력과 캐릭터 이동 구현하기

 

작성 기준 버전 :: 2019.2

 

[본 포스트의 내용은 유튜브 영상을 통해서 시청하실 수도 있습니다]

 

이번 섹션에서는 키보드 입력과 캐릭터 이동 기능을 구현해보자.

 

게임을 컨트롤하기 위한 입력 장치는 키보드, 마우스가 될 수도 있고, 게임 패드가 될 수도 있다. 혹은 마이크가 게임의 입력 장치가 될 수도 있다.

 

PC 게임에서 가장 기본적인 입력 장치는 키보드로, 키보드 만으로 컨트롤하는 게임은 많아도, 오히려 마우스만으로 컨트롤하는 게임은 키보드만으로 컨트롤 하는 게임보다 그렇게 많지 않다.

 

사실 키보드 입력을 구현하는 것 자체는 아주 간단하고 쉽다.

 

키보드 입력의 기본

 

bool Input.GetKeyDown(KeyCode key);

bool Input.GetKey(KeyCode key);

bool Input.GetKeyUp(KeyCode key);

 

키보드의 입력은 마우스와 같이 Down, Hold, Up  이 세 가지 과정으로 나누어져서 처리된다. Down은 키보드를 누르는 순간을 의미하고, Hold는 누른 상태를 유지하는 것, Up은 키보드에서 손을 떼는 것을 의미한다.

 

void Update()

{

    if (Input.GetKeyDown(KeyCode.Space))

    {

        Debug.Log("스페이스 키 누름");

    }

 

    if (Input.GetKey(KeyCode.Space))

    {

        Debug.Log("스페이스 키 누르는 중");

    }

 

    if (Input.GetKeyUp(KeyCode.Space))

    {

        Debug.Log("스페이스 키 손뗌");

    }

}

 

[그림 1]

 

위와 같이 업데이트 함수를 구현하고 플레이 시킨 뒤 스페이스 키를 눌렀다 떼보면, 스페이스 키를 누르는 순간에는 GetKeyDown이, 누르고 있는 중에는 GetKey가, 손을 떼는 순간에는 GetKeyUp이 한 번 호출되는 것을 볼 수 있다.

 

캐릭터 이동 구현하기

 

캐릭터 컨트롤러 클래스 구현

 

그러면 이 키보드 입력을 응용해서 캐릭터의 이동을 구현해보자.

 

public class CharacterController : MonoBehaviour

{

}

 

우선 캐릭터의 이동을 컨트롤할 캐릭터 컨트롤러 클래스를 하나 생성한다.

 

void Update()

{

    float moveZ = 0f;

    float moveX = 0f;

    if (Input.GetKey(KeyCode.W))

    {

        moveZ += 1f;

    }

 

    if (Input.GetKey(KeyCode.S))

    {

        moveZ -= 1f;

    }

 

    if (Input.GetKey(KeyCode.A))

    {

        moveX -= 1f;

    }

 

    if (Input.GetKey(KeyCode.D))

    {

        moveX += 1f;

    }

 

    transform.Translate(new Vector3(moveX, 0f, moveZ) * 0.1f);

}

 

그리고 업데이트 함수에서 위와 같이 코드를 작성한다. 이 코드는 W/S 키를 누르면 게임 오브젝트의 Z축을 앞뒤로 움직이고, A/D 키를 누르면 좌우로 움직이게 만드는 코드이다.

 

맵 만들기

 

[그림 2]

 

그리고 코드를 모두 작성하면 빈 공간에서는 캐릭터 역할을 할 게임 오브젝트가 아무리 움직여도 티가 안나기 때문에 캐릭터가 움직이는 느낌을 주기 위해서 에디터로 가서 씬 뷰에 바닥을 만들고 적당히 큐브를 깔아 장애물을 만들어 준다. 

 

번외. 게임 오브젝트 색 변경하기

 

 

번외로 처음 오브젝트를 만들면 모두 같은 색이라 색상이 구별이 안될 수도 있는데, 게임 오브젝트에 색을 넣어주기 위해서는 프로젝트 뷰에 우클릭한 뒤 [Create > Material] 항목을 선택해서 새 머티리얼을 만들고,

 

 

생성한 머티리얼을 선택하고 알베도(Albedo) 값을 원하는 색으로 바꾼 뒤, 씬 뷰에 있는 게임 오브젝트에 넣어주면 된다.

 

캐릭터 만들기

 

 

 

다시 본론으로 돌아가서 다른 게임 오브젝트와 구별되는 Character 게임 오브젝트를 하나 만든 뒤, Character Controller 컴포넌트를 부착해준다. 그리고 장애물과 캐릭터가 충돌하게 만들기 위해서 Rigidbody 컴포넌트도 추가해준다.

 

 

세팅이 끝나고 플레이 버튼을 눌러 게임을 실행한 뒤, WASD 키를 눌러보면 구형 캐릭터가 이리저리 움직이면서 장애물과 충돌하는 것을 볼 수 있다. 

 

문제점 보완하기

 

카메라가 캐릭터 따라가게 만들기

 

하지만 아직 만족스러운 상태는 아닌데, 캐릭터를 한 방향으로 계속 움직이면 카메라가 캐릭터를 따라가지 않고, 캐릭터가 화면 밖을 벗어나 버리는 것을 볼 수 있다.

 

 

이 문제를 해결하기 위해서 카메라를 캐릭터의 자식 컴포넌트로 만들고 카메라가 위에서 아래로 캐릭터를 내려다보게 만들어보자.

 

 

대각선 이동 속도 문제 해결하기

 

카메라 문제 이외에도 아직 문제는 남아있다. 

 

 

그 문제는 바로 대각선 이동을 위해서 두 키를 동시에 누르면 발생하는 문제다. 한 번에 한 방향의 이동키만 누르면 속도가 일정하지만, 대각선 방향의 두 개의 키를 동시에 누르면 두 개의 벡터가 합쳐져서 한 방향 키만 눌렀을 때의 이동 벡터보다 길이가 약간 길어져버린다. 이 때문에 정방향 이동보다 대각선 이동의 속도가 더 빨라져버리는 문제가 발생한다.

 

 

그렇기 때문에 두 개의 키를 동시에 눌렀을 때 발생하는 이동 벡터의 길이를 한 방향 키만 눌렀을 때 발생하는 벡터의 길이와 같게 만들어 주어야 한다.

 

transform.Translate(new Vector3(moveX, 0f, moveZ).normalized * 0.1f);

 

위의 코드와 같이 이동 벡터를 정규화해서 단위 벡터로 만들어주면 정방향 이동이나 대각선 이동이나 같은 속도로 이동할 수 있게 된다.

 

GetAxis()로 구현하기

 

캐릭터의 이동을 위한 입력을 받는 다른 방법으로는 Input.GetAxis() 함수를 사용하는 방법도 있다.

 

void Update()

{

    float moveZ = Input.GetAxis("Vertical");

    float moveX = Input.GetAxis("Horizontal");

    transform.Translate(new Vector3(moveX, 0f, moveZ).normalized * 0.1f);

}

 

GetAxis() 함수를 이용한 이동 방식 구현은 위의 코드와 같이 구현된다. GetAxis() 함수는 유니티 엔진의 프로젝트 세팅에 정의된 축의 값을 가져오는 역할을 하는데, 그 정의된 축에는 "Vertical"과 "Horizontal"이 있다. 이것은 수직과 수평을 의미한다.

 

앞에서 구현한 WASD의 입력을 일일이 구현하는 방식에 비해서, 이렇게 GetAxis() 함수를 이용해서 축을 가져오는 방식은 여러 가지 장점이 있다. 우선은 간단히 코드만 살펴봐도 앞의 코드에 비해서 구현해야할 코드의 길이가 월등히 짧다. 그리고 WASD의 입력을 일일이 구현하는 방법은 WASD 키를 누를 때만 작동하며 게임 패드의 입력을 구현하려면 따로 구현해야 하지만 GetAxis() 함수를 사용하면 별도의 구현없이 게임 패드의 이동 입력까지 자동으로 지원한다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts