Back Ground

Unity - 키보드 방향키로 Object이동 본문

Unity/Unity Engine

Unity - 키보드 방향키로 Object이동

Back 2021. 5. 5. 18:37

 

이 글은 이전 Vector3로 물체 이동시키는 글을 작성한 연장판 글이 될 것이다.

backback.tistory.com/419?category=948943

 

Unity - Vector3 Class를 사용하여 이동

해당 글은 비개발자도 볼 수 있기 때문에 최대한 이해하기 쉽게 쓰려고 노력하여 작성했다. Object 이동 움직일 대상을 만들어준다.  - 테스트용으로 큐브하나를 만들어주었다. 큐브를 이동시키

backback.tistory.com

 

 

 

Input Class 

외부 입력을 받아 실행시키는 함수는 다양하게 Unity에서 지원해준다.

Input은 입력 시스템을 다루기 위한 인터페이스인데 

Input Manager에 설정된 각 축을 읽고 기기 장치의 입력 데이터에 접근을 하는 경우 사용된다.

 

Input 함수중엔 GetKey, GetKeyDown.. 등도 많이 쓰지만 

이번 글에선 GetAxis를 사용하여 구현하기로 한다.

 

참고 문서 : docs.unity3d.com/kr/530/ScriptReference/Input.html

 

 

Input.GetAxis()

GetAxis함수는 해당 축을 읽어서 실수형 값을 반환 해준다.

축 기준으로는 0이며,  -1과 +1을 반환해준다.

 

[예시 코드]

1
2
3
void Update(){
    float dirX = Input.GetAxis("Horizontal");
}
 
cs

위 코드처럼 Horizontal를 매핑하면 방향키 기준으로 ←,→ 방향키의 결괏값을 반환해준다.

(Update에 넣은 건 계속 실행을 해야 하기 위함)

0  아무것도 누르지 않을때 
-1  왼쪽 키
1 → 오른쪽 키

 

[매핑 기본 설정]
- "
Horizontal", "Vertical"은 조이스틱(방향키)에 매칭되어 있고, A, W, S, D는 각 방향키에
- "Mouse X"와 "Mouse Y"는 마우스 델타 (Mouse delta)에 매핑되어있다.
- "Fire1"은 Ctrl Key, "Fire2"은 Alt, "Fire3"은 Cmd(커멘드)로 매핑되어 있다.


그럼 매핑 값을 외워야 할까?
Unity에 기본 설정으로 되어져 있을뿐, 확인도 가능하고 변경도 가능하다.

Unity프로그램 상단메뉴에서 Edit > Project Settings.. > Input Manager > Axes를 열어본다.

그러면 Name에 매핑 네이밍이 써있는데 여기서 확인도하고 수정도 가능하다.

 

 

방향키로 이동

 

그럼 이제 키보드를 통해 이동시켜보자

1
2
3
4
5
6
7
void Update(){
    float dirX = Input.GetAxis("Horizntal");
 
    Vector3 dirXY = Vector3.right * dirX;
 
    transform.position += dirXY * 5 * Time.deltaTime;
}
cs

- dirX 에는 내가 누른 방향키의 값이 들어오게 된다. [ 예상 값 (-1 , 0 , 1) 중 하나 ]

 

그리고 Vector3에는 (x , y, z) 값의 정보가 들었는데

- Vector3.right의 값을 확인해보면

Vector3(1, 0, 0)이 들어가는 것을 확인할 수 있다.

 

 

[상하좌우 Vector3]

Vector3.up (0, 1, 0)
Vector3.down (0, -1, 0)
Vector3.right (1, 0, 0)
Vector3.left (-1, 0, 0)

참고 자료 : docs.unity3d.com/ScriptReference/Vector3.html

 

 

[코드 해석]

그렇다면 ←왼쪽 키를 눌렀을 때 dirXY에는 어떤 결괏값이 들어갈까?

- Vector3.right는 (1,0,0)이고 

- dirX의 값은 -1f 가인데,

[ (1, 0, 0) * -1 ]이 되어  dirXY에는 (-1,0 ,0)이 들어가게 된다.

 

그렇다면오른쪽 키를 눌렀을 때 dirXY에는 어떤 결괏값이 들어갈까?

- Vector3.right는 (1,0,0)이고 

- dirX의 값은 1f 가 이니깐

[ (1, 0, 0) * 1 ]이 되어  dirXY에는 (1,0 ,0)이 들어가게 된다.

 

그럼 결국

Vector3.left은 (-1,0,0)과 같고

Vector3.right은 (1,0,0)과 같으므로 

 

Object는 방향키에 맞춰서 좌/우로 이동하게 된다.

 

 

 

이걸 응용하여 위/아래 이동도 함께 만들어보면,

1
2
3
4
5
6
7
8
void Update(){
    float dirX = Input.GetAxis("Horizntal");
    float dirY = Input.GetAxis("Vertical");
 
    Vector3 dirXY = (Vector3.right * dirX) + (Vector3.up * dirY);
 
    transform.position += dirXY * 5 * Time.deltaTime;
}
cs

이렇게 만들 수 있다.

← ↓ 를 눌러줬을 때

(  (1,0,0) * -1  ) + ( (0,1,0) * -1) )가 된다.

즉, (-1,0,0) + (0,-1,0) = (-1,-1,0)이란 값이 나오게 된다.

 

 

 

 

그런데 여기서 문제가 발생한다.

좌, 우 / 상, 하 이동시에는 문제가 없지만 

대각선으로 이동할 때는 좌, 우 / 상, 하 이동보다 빠르게 움직이게 된다.

 

 

두 벡터가 동시에 움직이면 대각선 벡터가 생기게 되는데 

그 길이가 좌우 상하보다 더 크기가 긴 게 생가게 되었기 때문이다.

 

대각선 이동시 움직임의 크기가 더 크기 때문에 벡터를 정규화시켜야 한다.

그 방법은 Normalize 함수를 사용하면 된다.

 

Normalize()

1
2
3
4
5
6
7
8
9
10
void Update(){
    float dirX = Input.GetAxis("Horizntal");
    float dirY = Input.GetAxis("Vertical");
 
    Vector3 dirXY = Vector3.right * h + Vector3.up * dirY; 
    
    dirXY.Normalize();
 
    transform.position += dirXY * 5 * Time.deltaTime;
}
cs

이렇게 수정했을 시 

Normalize 함수를 사용하면 길었던 벡터의 크기를 1로 만들어 준다.

'Unity > Unity Engine' 카테고리의 다른 글

Unity - deltaTime이란  (0) 2021.05.05
Unity - Vector란  (0) 2021.05.05
Unity - Vector3 Class를 사용하여 이동  (0) 2021.05.05
[MonoBehaviour] LifeCycle  (0) 2021.03.20
[Sprite] Filter Mode  (0) 2021.03.19
Comments