2 minute read

Unity Input System

Input System이라는 특수한 멀티 플랫폼용 입력 패키지가 있다.

Input System의 장점

  1. 조이스틱 등 다양한 입력 장비에 한번에 대응하기 쉽다.
  2. 입력처리와 실제 행동 로직을 분리하여 유지보수가 쉽다.
  3. 플레이어가 인게임에서 입력 방식 변경이 가능하다.
  4. 멀티플레이어 입력을 쉽게 처리한다.

Input System 사용법

설치 : Windows -> Package Manager -> Unity Registry, All -> Input System 다운 -> 리부트
Input System 준비 : Project -> Create -> Input Action

스크린샷 2024-05-08 160918
위에 보이는 Control Scheme을 추가해서 다양한 플랫폼별 컨트롤 방식 설정 가능

스크린샷 2024-05-08 161041
여기서는 Keyboard 와 Mouse 유저에게 사용될 키보드 적용 방식을 만들어줌
Binding은 그냥 추가하면 안되고 우선 Move action에 값을 value, vector2로 바꿔주고
keyboard의 경우는 Vector2타입인 Up\Down\Left\Right Composite을 추가해야한다.
참고로 위에 내용들 적용하는데 마우스 좌클릭이 안먹히면 우클릭을 눌러보자.

다 하고 나면 Save Asset으로 저장해주고, 캐릭터에 가서 Add Component로 Player input을 추가해서 Actions에 위에 만든 Action을 추가하면 된다.

스크린샷 2024-05-08 161828
위에 보이는 인스펙터창에서 Behavior 방식을 설정해준다.
Send Messages : 키 입력을 받으면 현재 게임 오브젝트의 모든 컴포넌트에 메시지 날리기
Broadcase Messages : 현재와 그 자식 오브젝트에게까지 메세지를 뿌림
Invoke Unity Event : 버튼 OnClick할 때 처럼 inspector창에다가 함수들을 넣어줌
Invoke C Sharp Event : PlayerInput.OnActionTriggered 에 호출될 이벤트들을 모아뒀다가 이를 확인하고 호출해줌.

이제 스크립트를 짜줘야한다.

using UnityEngine.InputSystem;

//이동 이벤트 시행 전, 값 조절
public class PlayerInputController : TopDownController
{
	private Camera camera;
	private void Awake()
	{
		camera = Camera.main; // mainCamera 태그가 붙어있는 카메라 가져오기
	}

	public void OnMove(InputValue value)
	{
		Vector2 moveInput = value.Get<Vector2>().normalized;
		CallMoveEvent(moveInput);
	}

	public void OnLook(InputValue value)
	{
		Vector2 newAim = value.Get<Vector2>();
		Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
		newAim = worldPos - (Vector2)transform.position.normalized;

		CallLookEvent(newAim);
	}
}

이렇게 스크립트에 “using UnityEngine.InputSystem”을 넣어주고
밑에서 함수 이름을 On+(이전에 InputSystem만들 때 설정한 Action의 이름)을 해주면 그 Action에 해당하는 키가 눌렸을 때 이 함수가 호출 된다.
이걸로 이동을 구현하면 된다.

RigidBody and Collider

물체를 이동 시키는데는 2가지 방법이 있다 : Transform, RigidBody
그래서 둘중에 하나만 컨트롤해야지, Transform 이랑 RigidBody에 Force를 동시에 변화 시켜서는 계산 문제가 생기기 쉽다.
그래서 Collider에도 RigidBody가 필요한거다.
충돌은 물리현상이다. 그래서 Transform으로 이동시켜서 충돌시킬라하면 이는 물리적 이동이 아니라 충돌 감지가 안된다.
하지만 RigidBody가 달려있는 채로 이 물체에 힘을 가하거나 속도를 변화시켜 충돌을 일으키면 그것은 물리현상이라 충돌이 감지된다.
그래서 충돌 이벤트를 만들 때 RigidBody 와 Collider가 둘다 필요한 것이다.
참고로 Collider에서 “is Trigger”를 체크하면 말 그대로 트리거의 역할만 하고 실제로 물리현상은 일으키지 않는다.

Quaternion

회전을 하는데 쓰는 기능
Quaternion.Euler = 우리가 흔히 아는 오일러 회전
Quaternion.LookRotation = 바라보는 방향에 따른 회전
Quaternion.Slerp = 회전을 서서히 시키거나 회전 중 순간 값을 쓸 때

참고로 그냥 transform.rotation.z 하면 Quaternion으로 변환된 값을 돌려주니
대신 transform.rotation.eulerAngles.z를 써야 Degree로 제대로된 값이 나온다.