Quick Comparison
- 기준은 Unity 6.5 (6000.5), Input System 1.14.2입니다. 새 프로젝트에서 여러 장치·재바인딩·UI·로컬 멀티플레이가 필요하면 Action 기반 Input System을 기본으로 고릅니다. 작은 기존 프로젝트를 유지하거나 Legacy API 예제를 검증할 때만 Input Manager를 선택합니다.
- Edit > Project Settings > Player > Active Input Handling은
Input Manager (Old),Input System Package (New),Both중 하나입니다.Both는 마이그레이션 기간에는 쓸 수 있어도, 같은 gameplay 행동을 두 시스템에서 읽는 최종 구조는 피합니다. - 입력 edge는
Update나 Input System callback에서 받고, Rigidbody 같은 물리 반영은FixedUpdate에서 합니다. 짧은 누름은 time-stamped buffer로 한 번만 소비합니다.
csharp
private bool jumpBuffered;
private void Update()
{
if (Input.GetButtonDown("Jump"))
jumpBuffered = true;
}
private void FixedUpdate()
{
if (!jumpBuffered)
return;
jumpBuffered = false;
Jump();
}Project Settings와 Legacy API
- Active Input Handling을
Input Manager (Old)로 두면Input.GetAxis,Input.GetButtonDown,Input.GetKey계열을 씁니다.Input System Package (New)만 선택했는데 Legacy API를 읽으면 입력이 예상대로 들어오지 않습니다. 변경 뒤 Editor 재시작이 필요한 Unity 버전도 있으므로 설정 적용 상태를 확인합니다. - Legacy Input Manager의 Axes 항목은 이름, positive/negative button, gravity, sensitivity, dead zone, type을 정합니다.
Input.GetAxis("Horizontal")은 sensitivity와 gravity가 적용된 부드러운 축 값이고,Input.GetAxisRaw("Horizontal")은 키보드 digital axis에서 즉시 -1/0/1을 얻을 때 맞습니다. 조작감 smoothing을 코드와 Inspector에서 둘 다 적용하면 이동이 둔해집니다. Input.GetButtonDown,Input.GetKeyDown은 눌린 frame에만 true입니다.FixedUpdate는 rendering frame마다 호출되지 않으므로 여기서 직접 읽으면 짧은 누름을 놓칠 수 있습니다. 계속 누름은GetButton/GetKey, 놓는 순간은GetButtonUp/GetKeyUp을 씁니다.- 축 이름은 문자열 계약입니다. Project Settings에서
Horizontal을 지우거나 이름을 바꾼 뒤 코드만 남기면 런타임 오류 또는 0 입력으로 보일 수 있습니다. Legacy를 유지한다면 input name을 코드 상수나 설정 문서로 관리합니다.
입력과 물리 연결
csharp
using UnityEngine;
public sealed class LegacyRigidbodyMover : MonoBehaviour
{
[SerializeField] private Rigidbody body;
[SerializeField] private float acceleration = 20f;
private Vector2 move;
private void Update()
{
move = new Vector2(
Input.GetAxisRaw("Horizontal"),
Input.GetAxisRaw("Vertical"));
}
private void FixedUpdate()
{
Vector3 direction = new Vector3(move.x, 0f, move.y).normalized;
body.AddForce(direction * acceleration, ForceMode.Acceleration);
}
}- Input System에서는 action callback의
performed/canceled에서 값을 보관하거나,Update에서InputAction.ReadValue<T>()를 읽습니다.InputAction과PlayerInput의 asset/map ownership은 Action과 PlayerInput에서 다룹니다. - UI도 Input System을 쓰면 EventSystem의 Input System UI Input Module에 UI action asset을 연결합니다. UI module과 gameplay
PlayerInput이 같은 action map을 동시에 활성화하면 Submit·Cancel·click이 서로 소비되는 원인을 추적하기 어렵습니다.UI와Gameplaymap의 활성 상태를 분리합니다. - jump buffer에는 만료 시간이 필요합니다. 충돌·착지 전후에 같은 입력이 오래 남지 않도록
Time.time또는 unscaled time으로 deadline을 두고,FixedUpdate에서 성공적으로 사용했을 때만 버퍼를 지웁니다.
자주 틀리는 부분
Legacy와 Input System을 같은 행동에 섞어 두면 한 번의 키 입력이 두 번 처리될 수 있습니다. Both는 전환용 설정이지 두 입력 모델을 영구 병렬 운영하라는 뜻이 아닙니다. 행동별 소유 시스템과 제거 시점을 정하세요.
입력 값을 FixedUpdate에서만 읽거나, Update에서 Rigidbody를 직접 이동시키지 마세요. 전자는 edge를 놓치고 후자는 physics timing을 흔듭니다. 읽기·버퍼·물리 적용의 세 지점을 분리해야 합니다.
참고 링크
3 sources