키보드 입력으로 오브젝트 움직이기

 

오브젝트를 움직이게 만들 수 있는 방법은 여러 방법이 있다. 

이동하는 방법뿐만 아니라 여러 가지로 Vector를 많이 사용하게 되는데, 

학생 때 꼴도 보기 싫었던 Vector를 유니티 공부하면서 원없이 본 것 같다. 

 

우선 코드를 작성해서 연습해보기 전에 유니티를 켜고,

3D 프로젝트를 하나 만들어서 아래 그림과 같이 Plane과 Capsule을 하나 생성해 보자.

그리고 지난번 블로그에 나온 것처럼 Capsule을 알아보기 쉽게 파란색을 입혔다.

 

나는 아래와 같이 Plane의 크기로 Capsule의 position을 변경했다.

 

Plane Scale (X : 5, Y : 1, Z : 5)

Capsule Position ( X : 0, Y : 1, Z : 0)

 

연습을 시작할 준비가 되었다.

■ 지정된 좌표로 이동시키기(순간이동)

먼저 Tranform을 이용하여 이동시켜보자.

오브젝트를 어떤 키를 누르면 미리 지정된 좌표로 이동하도록 해보자.

아래 그림처럼 처음 Capsule 이 있던 지점으로 사각형 꼭지점으로 이동하는 스크립트를 작성해보자.

 

1번부터 4번 키를 누르면 동그라미 원 안으로 이동해보자.

 

C# Script를 열고, MovePosition이라고 스크립트 이름을 수정하고, Capsule에 드래그하여 넣자.

 

아래와 같이 코드를 입력해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MovePosition : MonoBehaviour
{
 
    void Update()
    {
        if (Input.GetKey(KeyCode.Alpha1) == true)
        {
            gameObject.transform.position = new Vector3(-212);
        }
 
        if (Input.GetKey(KeyCode.Alpha2) == true)
        {
            gameObject.transform.position = new Vector3(212);
        }
 
        if (Input.GetKey(KeyCode.Alpha3) == true)
        {
            gameObject.transform.position = new Vector3(21-2);
        }
 
        if (Input.GetKey(KeyCode.Alpha4) == true)
        {
            gameObject.transform.position = new Vector3(-21-2);
        }
 
    }
}
 
cs

코드를 살펴보면 숫자키 1~4번을 누를 때마다 사각형 꼭지점으로 이동하도록 좌표값을 넣었다.

그럼 아래와 같이 오브젝트가 이동하는 것을 볼 수 있다.

Alpha0~9를 넣으면 숫자 0~9까지의 키보드 자판을 인식하고, 

영문도 알파벳을 넣으면 알파벳을 인식하도록 되어 있다.

 

예를 들어 위의 소스코드에서 Alpha1~Alpha4 대신 A, B, C, D를 넣고

A, B, C, D를 누르면 아래와 동일하게 이동하는 것을 볼 수 있다.

 

사각형 꼭지점으로 순간이동하듯 움직이는 것을 볼 수 있다.

 

이렇게 지정된 좌표가 아닌 화살표 방향키를 눌렀을 때 이동하고 싶을 때는 어떻게 할까?

 

■ Translate를 이용한 이동

 

화살표를 눌렀을 때 일정한 간격으로 이동하는 방법은 어떻게 할까?

Transform에서는 Translate라는 function을 제공한다.

이것은 지정된 거리로 오브젝트를 이동시켜 주는 역할을 한다. 

그럼 바로 코드를 아래와 같이 수정해 보자.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MovePosition : MonoBehaviour
{
 
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow) == true)
        {
            gameObject.transform.Translate(new Vector3(-100));
        }
 
        if (Input.GetKey(KeyCode.RightArrow) == true)
        {
            gameObject.transform.Translate(new Vector3(100));
        }
 
        if (Input.GetKey(KeyCode.UpArrow) == true)
        {
            gameObject.transform.Translate(new Vector3(001));
        }
 
        if (Input.GetKey(KeyCode.DownArrow) == true)
        {
            gameObject.transform.Translate(new Vector3(00-1));
        }
 
    }
}
 
cs

잘 이동하는지 확인을 해보자.

 

잘 움직이기는 하지만 뭔가 부자연스럽고 엄청 빠르다.

 

움직이기는 잘하는 것 같지만 뭔가 부자연스럽다. 

유니티에는 Update라는 특별한 메서드가 있다. 이 메서드는 매 프레임마다 실행되는 함수이다. 

보통 컴퓨터는 1초당 프레임이 60번 실행이 된다. Update 메서드가 1/60초에 한 번씩 실행된다는 이야기다.

 

자세히 보면 화살표를 누르고 있는 동안 1 만큼씩 순간이동을 하는데 이게 1/60초라는 워낙 짧은 시간에 다음 좌표로 이동하기 때문에 연속된 것처럼 보이는 것이다.

 

그럼 위의 코드에서 Vector3 안의 숫자를 1 → 3으로 변경하면 어떻게 보일까?

 

3의 거리만큼 이동하기 때문에 좀더 끊겨서 이동하는 것이 잘 보인다.

 

빨리 움직이는 것처럼 보이기는 하지만 3의 거리만큼 순간 이동하면서 움직이고 있는 것이다.

일반 사람들이 게임을 플레이할 때 이렇게 움직이는 것을 원한 것이 아니었을 것이다.

그럼 연속된 움직임을 가지기 위해서는 어떻게 해야 할까?

 

Rigidbody라는 물리적 속성을 이용하여 움직이면 자연스러운 움직임을 만들어 낼 수 있다.

오늘은 여기까지 하고 다음 글에서 이어서 설명하도록 하겠다.

 

+ Recent posts