DNF LOVE
[Unity기초-4] 사용자 입력에 따른 Player를 이동시켜보자 - ② Start함수에서 컴포넌트를 받아오고, Update함수를 통해 사용자 입력에 따른 이벤트를 발생시켜보자. 본문
[Unity기초-4] 사용자 입력에 따른 Player를 이동시켜보자 - ② Start함수에서 컴포넌트를 받아오고, Update함수를 통해 사용자 입력에 따른 이벤트를 발생시켜보자.
botho 2019. 7. 19. 18:09우선, Player에 붙여있는 하위 컴포넌트들을 받아오도록 하자.
컴포넌트를 받아오기 위해서는 해당 Object에 붙여 있는 스크립트 내 Start, Awake 함수 등 오브젝트가 활성화 되었을 때 1번만 받아와도 된다.
우선 변수들을 PlayerControler 스크립트에 선언하도록 하자.
private와 public은 접근 제한자인데 public을 사용하면 해당 인스펙터창에 보여지고, private를 사용하면 인스펙터창에 숨겨져 보인다.
public은 인스펙터창에서도 충분히 설정할 수 있는데 이 리지드바디는 어떻게 받아올까?
그것은 바로 활성 함수들을 통해 충분히 받아올 수 있다.
Start함수에 Rigidbody rb는 해당 오브젝트(this)의 컴포넌트를 받아오겠다(GetComponent 함수 사용)
무엇을? <Rigidbody> 를.
이 리지드 바디를 받아왔다는 것을 어떻게 확인할까?
그것은 디버그를 콘솔로 찍어보면 확인할 수 있다. (아니면 private를 public으로 바꿔도 된다.)
Debug.Log를 통해 로그를 찍어보면 해당 컴포넌트를 확인할 수 있다. 중단점을 찍지 않아도 로그를 확인할 수 있는 방법이다.
자, 다음은 사용자 입력에 따라 플레이어를 움직이기 전에, 사용자 입력에 따른 이벤트 처리를 해보도록 하자.
사용자 입력을 받는 방식에는 여러가지가 있다. 크게는
1> 마우스 입력
- GetMouseButton() : () 안에 있는 클릭 값이 일치하면 클릭하는 동안 TRUE 를 리턴한다.
- GetMouseButtonDown() : () 안에 있는 클릭 값이 일치하면 클릭을 한번 하면 TRUE 를 리턴한다.
- GetKeyUp() : () 안에 있는 클릭 값이 일치하면 클릭을 했다가 떼면 TRUE 를 리턴한다.
- 괄호 () 안에 있는 마우스 키 값은 세가지가 존재한다.
- 0 : 왼쪽 버튼
- 1 : 오른쪽 버튼
- 2 : 가운데(휠) 버튼
2> 키보드 입력
- GetKey() : () 안에 있는 키가 일치하면 키를 누르는 동안 TRUE 를 리턴한다.
- GetKeyDown() : () 안에 있는 키가 일치하면 키를 한번 누르면 TRUE 를 리턴한다.
- GetKeyUp() : () 안에 있는 키가 일치하면 키를 눌렀다가 떼면 TRUE 를 리턴한다.
등이 있다. 유니티에서는 마우스 입력보다는 키보드 입력을 더 많이 사용되기 때문에 키보드 입력 위주로 설명하도록 하겠다.
또, 이 키보드 입력을 사용하는 여러가지 종류가 존재한다.
1. If문 사용
- 장점 : 직관적으로 이해하기 쉬움
- 단점 : 입력받는 키가 많아질수록 코드가 다소 복잡해질 수 있다.
2. Switch 사용
- 장점 : 직관적으로 이해하기 쉽다, if문보다 코드 관리가 용이하다.
- 단점 : KeyCode.A는 소문자, 대문자 모두 가능하지만 스위치 문 내에서는 대문자만 사용이 가능하다.
3. Dictionary, delegate 사용
- 장점 : 입력하는 키의 종류가 늘어나도 입력 키를 구분하는 코드의 증가가 적어 코드관리가 용이하다
- 단점 : 키룰 눌렀을 때 호출되는 함수의 형식이 다양할 수록 초보자들에겐 다소 어려울 수 있다.
* if문 사용 예시>
Update()에 이렇게 코드를 치고 난 후, 게임을 실행하여 키보드를 누르면 누른 방향대로 로고가 찍히는 것을 확인할 수있다.
* Switch 예시>
우리는 기초를 배우고 있는 상황이기 때문에 다양한 방법으로도 똑같은 효과를 낼 수 있는 다양한 방법들을 배우는게 좋기 때문에 Switch문을 사용해보도록 하겠다.
Switch문이란? if문(조건문)의 업데이트 버전으로 조건변수와 그 조건변수의 값에 따라 절차적으로 코드를 실행하는 문법이다.
Swtich(조건변수) {
case 조건 :
실행문
case 조건2 :
실행문
..........
}
이런식으로 사용된다. Java에서는 String문이 불가한데 c#에서는 다양한 데이터타입에서 사용할 수 있다.
switch (Input.inputString){
case "A":
Debug.Log("A");
break;
case "B":
Debug.Log("B");
break;
default:
Debug.Log("Default");
break;
}
Input.inputString은 이번 프레임에 들어온 키보드 입력을 반환한다.
유의할 점은 ASCII 문자만 /inputString/에 입력될 수 있다.
똑같은 기능을 수행하는 코드를 짤 때 정답이 없고 사람마다 스타일이 다를듯,
유니티에서 지원하는 기능 또한 같은 기능을 수행하더라도 다양한 방법을 통해 기능을 구현할 수 있다.
그러므로 어떤 구현 방식이 있는 것을 인지하도록 하자.