유니티

유니티 오브젝트 움직이기 - Input / GetKey / GetButton / Vector3 / GetAxis

nock_ji 2022. 4. 9. 00:31

유니티 오브젝트 이동시키기 기초 

 

 

" 유니티에서 키보드, 마우스 등

디바이스 입력을 사용하여 오브젝트를 이동시키기 "

 

 

 


1. 키보드 & 마우스 입력받기

 

Input  : 게임 내 입력을 관리하는 클래스 (마우스와 키보드 등의 입력을 받습니다) 

 

void Update()
{
	if(Input.anyKeyDown)
    	Debug.Log("플레이어가 아무 키를 눌렀습니다");
}​

 

​Input 클래스 내의 함수 anyKeyDown

 

anyKeyDown : 아무 입력을 최초로 받을 때 true 값을 반환합니다

 

 

 

 

플레이 중에 Game 창에서 아무 키를 누르면 메시지가 출력됩니다

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에 대응하는 키보드 키 값이 다양하게 존재합니다.

여기서 Returnenter키를 의미합니다. 

 

KeyCode 키보드 키의 다양한 종류

 

 

 

 

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에서 버튼을 설정할 수 있습니다 

 

Mac ver / Window는 다를 수 있음

 

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단위로 오브젝트가 이동합니다