- Unity에서 키보드,마우스, 콘솔 등 다양한 플랫폼을 통해 입력을 받을 수 있게 지원하는 시스템입니다.
- 유니티가 기본적으로 지원하는 Input Manager의 단점을 보완합니다.
- GetKey(), "Horizontal" 과 같은 축 입력을 통해 쉽게 입력값을 받을 수 있습니다.
- 다른 플랫폼으로 게임을 만드는 경우, 위 코드를 일일이 수정해야 합니다.
public class Move : MonoBehavior
{
Rigidbody rigid;
void Start ()
{
rigid = GetComponent();
}
void Update()
{
float x = Input.GetAxis("Horizontal");
float y = Input.getAxis("Vertical");
rigid.velocity = new Vector2(x,y);
}
}
- Input System의 경우, Scheme 만 변경해주면 플랫폼에 따른 코드를 쉽게 작성할 수 있습니다.
- Unity에서 Window -> Package Manager를 클릭합니다.
- Packages:In Project 를 Packages:Unity Registry 로 변경, Input System을 검색합니다.
- Install 버튼을 누른 후 프로젝트를 재시작합니다.
- Edit -> Project Setting -> Player -> Active Input Handling 를 찾습니다.
- Input System Package(New)을 선택합니다. Input Manager도 쓰고 싶다면 Both를 선택합니다.
- 이후 Project -> Create 에서 Input Action Asset를 생성하여 Input System을 사용할 수 있습니다.
- Control Scheme를 사용하면 플랫폼에 따른 입력방식을 쉽게 바꿀 수 있습니다.
- Inspector -> Open 을 통해 Control Scheme를 설정할 수 있습니다.
- 이름과 입력방식을 설정하여 Control Scheme를 추가합니다.
- 입력장치를 통해 입력을 어떤방법으로, 어떤 값으로 받아올지를 설정할 수 있습니다.
- Action Properties -> Action Type, Control Type를 통해 어떤 값을 받을 지 설정할 수 있습니다.
- Binding을 추가, Binding마다 Path를 설정하여 어떤 키로 어떤 입력을 받을지 설정할 수 있습니다.
- save버튼으로 설정값을 저장할 수 있습니다.
- Player Input 컴포넌트를 통해 Input Action Asset를 오브젝트에 적용할 수 있습니다.
- Behavior 옵션에 따라 스크립트 작성법이 달라집니다.
- On+(Action의 이름) 형태로 함수이름을 작성합니다.
- InputValue를 매개변수로 갖는 함수를 사용합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Move_sendM : MonoBehaviour
{
Rigidbody rigid;
Vector2 MoveDir = new Vector3(1f,1f,0f);
void Start()
{
rigid = GetComponent();
}
void Update()
{
rigid.velocity = MoveDir; // 속도 조정
}
public void OnMove(InputValue Val) // 키를 입력받았을 때 Val을 받아 벡터를 얻어냄.
{
Vector2 vec = Val.Get(); // 입력 받은 벡터 값을 저장
if (vec != null)
MoveDir = new Vector3(vec.x, vec.y,0f); // 물체가 가질 벡터
}
}
- 함수의 이름을 마음대로 결정할 수 있습니다.
- CallbackContext를 통해 입력을 받아옵니다.
- 이후 설정에서 오브젝트를 Event에 추가한 후, 작동시킬 함수를 설정해야합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Move_Event : MonoBehaviour
{
Rigidbody rigid;
Vector3 MoveDir;
void Start()
{
rigid = GetComponent();
}
public void OnMove(InputAction.CallbackContext context) // 값을 입력받는 함수
{
Vector2 vec = context.ReadValue();
if (vec != null)
MoveDir = new Vector3(vec.x, vec.y, 0f);
}
void Update()
{
rigid.velocity = MoveDir;
}
}