유니티 오브젝트 이동시키기 기초
" 유니티에서 키보드, 마우스 등
디바이스 입력을 사용하여 오브젝트를 이동시키기 "
1. 키보드 & 마우스 입력받기
Input : 게임 내 입력을 관리하는 클래스 (마우스와 키보드 등의 입력을 받습니다)
void Update()
{
if(Input.anyKeyDown)
Debug.Log("플레이어가 아무 키를 눌렀습니다");
}
Input 클래스 내의 함수 anyKeyDown
anyKeyDown : 아무 입력을 최초로 받을 때 true 값을 반환합니다
플레이 중에 Game 창에서 아무 키를 누르면 메시지가 출력됩니다
.
.
.
키를 누르기 전에는 void Start에서 적은 로직이 없기 때문에 아무런 메시지가 뜨지 않습니다.
[ Input 클래스 내의 anyKey 함수 ]
anyKey : 아무 입력을 받으면 true 값을 반환합니다
void Update()
{
if(Input.anyKey)
Debug.Log("플레이어가 아무 키를 누르고 있습니다");
}
anyKeyDown은 한 번만 입력되는 최초 반환 함수 입니다.
그러나 anyKey는 아무 키를 계속 꾹 누르고 있으면 출력 값이 계속해서 증가합니다.
.
.
.
.
결과
키를 한 번 꾹 누르면 anyKeyDown은 한 번 누른 것으로 반환되지만, anyKey은 키를 뗄 때까지 반환 수가 증가합니다.
* 각 입력 함수는 3가지 행동으로 구분합니다
key를 Down (누르기) / Stay (누른 채 있기) / Up (떼기)
키보드, 마우스, 버튼 설정 각각 함수에 대해 알아보겠습니다
[ 키보드 입력 ]
GetKey : 키보드 버튼 입력을 받으면 true 값을 반환
GetKeyDown : 키보드 버튼을 눌렀다가 떼면 true 값을 반환
void Update()
{
if (Input.anyKeyDown)
Debug.Log("플레이어가 아무 키를 눌렀습니다");
if (Input.GetKeyDown(KeyCode.Return))
Debug.Log("아이템을 구입하였습니다");
}
KeyCode는 매개변수로, KeyCode에 대응하는 키보드 키 값이 다양하게 존재합니다.
여기서 Return은 enter키를 의미합니다.
GetKey : 키보드 버튼을 계속 꾹 누르고 있을 때 true값을 반환
GetKeyUp : 키보드 버튼을 떼면 true 값을 반환
if(Input.GetKey(KeyCode.LeftArrow))
Debug.Log("왼쪽으로 이동 중");
if(Input.GetKeyUp(KeyCode.RightArrow))
Debug.Log("오른쪽 이동을 멈추었습니다");
LeftArrow : 왼쪽 방향키를 이용하여 왼쪽으로 이동
--Arrow : 방향키 (LeftArrow, RightArrow, UpArrow, DownArrow)
.
.
.
.
Game창에서 엔터 - 왼쪽 방향키 - 오른쪽 방향키 를 순서대로 누른 결과는 아래와 같습니다
.
.
.
결과
총 3번의 키를 눌렀으니, anyKeyDown에 대한 반환은 3개가 됩니다
왼쪽으로 이동 중 개수가 많은 이유는 GetKey는 키를 누른 시간이 길기 때문입니다
오른쪽 방향키를 손에서 떼었을 때 오른쪽 이동을 멈추었습니다 메시지가 출력됩니다 (오른쪽 방향키를 누르고 있을 때는 반환 X)
[ 마우스 입력 ]
Get Mouse : 마우스 버튼 입력을 받으면 true값을 반환
*매개변수를 숫자로 받는다. 0 or 1
마우스 오른쪽 버튼 : 0
마우스 왼쪽 버튼 : 1
GetMouseButtonDown : 마우스 키를 눌렀다 떼면 true 값 반환
GetMouseButton : 마우스 키를 계속 꾹 누를 때 true 값 반환
GetMouseButtonUp : 마우스 키를 뗄 때 true 값 반환
void Update()
{
if (Input.GetMouseButtonDown(0))
Debug.Log("에너지 발사 !!");
if (Input.GetMouseButton(0))
Debug.Log("에너지 모으는 중...");
if (Input.GetMouseButtonUp(0))
Debug.Log("슈퍼 에너지 발사 !!");
}
.
.
.
.
결과
마우스 왼쪽 키를 1번 클릭 후, 다시 길게 누른 결과 입니다
2. 버튼 설정
[Edit] - [Project Settings...] - [Input]
Input Manager에서 버튼을 설정할 수 있습니다
Axes - Size : 설정 가능한 버튼의 개수 (기본 18로 설정되어 있음)
개수를 변동하여 Button을 자유롭게 생성, 삭제가 가능합니다
Horizontal 이름의 버튼을 살펴보겠습니다
a와 d Button으로 좌우로 움직이도록 설정되어 있습니다
3. 버튼 입력
Input Manager에 있는 버튼 중 하나를 가지고 입력해보겠습니다
< Jump >
Jump는 space Button을 누르면 반응합니다
GetButton : Input 버튼 입력을 받으면 true 값을 반환
void Update()
{
if(Input.anyKeyDown)
Debug.Log("플레이어가 아무 키를 눌렀습니다");
if(Input.GetButtonDown("Jump"))
Debug.Log("점프 !");
if(Input.GetButton("Jump"))
Debug.Log("점프 모으는 중...");
if(Input.GetButtonUp("Jump"))
Debug.Log("슈퍼 점프 !!");
}
*문자열과 큰따옴표"", 대소문자 구분을 확실하게 해야합니다
Input Manager에 있는 버튼을 설정하고, 사용하기 위해서는 GetButton-- 함수로 !!
.
.
.
.
스페이스바를 2초간 눌렀다 떼었을 때 결과
GetMouseButton과 아주 유사하나, 어느 버튼인지가 다릅니다
4. 축 입력
[ Input 버튼 입력을 받으면 좌우로 움직이는 로직 ]
Horizontal은 오브젝트의 축에서 x축을 의미합니다
GetAxis : 수평, 수직 버튼 입력을 받으면 float, 가중치를 반환하는 함수
GetAxisRaw : GetAxis와 다르게 가중치 없이 -1 or 1 만 반환하는 함수
Input.GetAxis()
void Update()
{
if (Input.GetButton("Horizontal"))
Debug.Log("휠 이동 중..." + Input.GetAxis("Horizontal"));
}
.
.
왼쪽 방향키를 눌렀을 때의 결과
결국 마지막에는 -1로 수렴하여 같은 값을 출력한다
Input.GetAxisRaw()
void Update()
{
if (Input.GetButton("Horizontal"))
Debug.Log("휠 이동 중..." + Input.GetAxisRaw("Horizontal"));
}
GetAxis는 소수값을 출력하지만, GetAxisRaw는 가중치가 없다
오른쪽 방향키는 1, 왼쪽 방향키는 -1, 동시누르면 0 출력
.
.
.
5. 오브젝트 이동
모든 오브젝트는 변수 Transform을 항상 가지고 있음
Transform : 오브젝트 형태에 대한 기본 컴포넌트
오브젝트의 위치, 회전값, 크기를 조절할 수 있습니다
[ Vector 함수를 이용하여 오브젝트가 움직이는 로직 ]
Vector : 방향과 그에 대한 크기 값
(3차원 - Vector3 , 2차원 - Vector2 )
transform.Translate : Vector 값을 현재 위치에 더하는 함수
void Update()
{
Vector3 vec = new Vector3 (5, 0, 0);
transform.Translate(vec);
}
우리는 3차원 오브젝트를 가지고 있기 때문에 Vector3를 생성합니다.
Vector는 메소드를 포함하고 있는 구조체이므로 생성자를 이용해 값을 할당받을 때는 new로 할당합니다
Vector 값 = 소괄호 안에 차례로 움직일 x, y, z값을 넣어줌
해당 로직을 오브젝트와 Main Camera에 넣어주면, 같이 움직이기 때문에 Game 창에서도 오브젝트를 확인할 수 있습니다
Scene창에서는 X축을 따라 움직이는 것을 볼 수 있고, Inspector창의 X축 위치가 빠르게 증가하고 있습니다
Main Camera는 오브젝트를 따라 같이 움직이고 있기 때문에 Game창에서 볼 수 있습니다
[ 오브젝트를 상하좌우로 버튼을 눌러 움직이기 ]
void Update()
{
Vector3 vec = new Vector3(Input.GetAxis("Horizontal"),Input.GetAxis("Vertical"),0);
transform.Translate(vec);
}
상하좌우키를 누르면 float단위로 오브젝트가 이동합니다
'유니티' 카테고리의 다른 글
유니티 오브젝트 중력과 충돌 / Material / Collider / RigidBody 기초 (0) | 2022.04.11 |
---|---|
유니티 목표지점으로 이동하기 - (Vector3) MoveTowards / SmoothDamp / Lerp / Slerp (0) | 2022.04.09 |
유니티 이벤트 함수의 실행 순서 (0) | 2022.04.06 |
유니티 C# 프로그래밍 기초 - 클래스 생성 및 상속 (0) | 2022.04.05 |
유니티 C# 프로그래밍 기초 - 함수 새로 선언하기 (0) | 2022.04.05 |