일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- http://jeonghwan-kim.github.io/dev/2019/06/25/react-ts.html
- 출처 : https://webdir.tistory.com/506
- 게시판
- toString
- object
- https://velog.io/@velopert/create-typescript-react-component
- 출처 : https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
- Today
- Total
Back Ground
Unity - 키보드 방향키로 Object이동 본문
이 글은 이전 Vector3로 물체 이동시키는 글을 작성한 연장판 글이 될 것이다.
backback.tistory.com/419?category=948943
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 |