유니티 InputManager 사용법에 대한 정리이다
인풋매니저는 Unity에서 제공하는 기능도 있지만, 코드 재사용성과 유지보수 향상을 위해 직접 코드로 구현하는 선택을 했다.
1. 코드 재사용성과 유지보수 향상
- 여러 프로젝트나 시스템이 공통적으로 인풋을 필요로 할 때, 한 곳에서만 인풋을 관리하면 전체 코드가 단순해진다.
2. 입력 방식 분리 (SRP 원칙)
- 플레이어 로직과 입력 처리 로직이 섞여 있으면 코드가 더러워 질 수있다.
- "입력 받는 역할"만 담당 하니까 구조가 명확해지고 책임이 분리된다.
3. 유닛 테스트,디버깅 편의, 플랫폼별 입력 대응 용이
- 인풋매니저 내부에서 플랫폼에 따라 입력을 구분하면 외부에서는 똑같은 방식으로 호출 가능.
4. 이벤트 기반 확장 기능
- C#의 event나, Action 델리게이트를 활용해서 입력 발생시 특정 동작을 트리거할 수 있다.
1. 복잡성 증가
- 단순한 프로젝트에서는 바로 키입력을 받아도 충분한데, InputManager를 도입하면 구조가 복잡해질 수 있다.
2. 싱글톤 의존도 증가
- 너무 남용되면 프로젝트 전역에서 의존성이 생겨서 유닛 테스트나 코드 분리가 어려워질 수 있다.
3. 복잡한 입력 처리는 어렵다
- 복잡한 입력(키 조합, 터치 제스처, 등)은 InputManager 하나로 처리하기인 너무 거대해질 수 있다.
- 이런 경우엔 상태 기반 입력처리, 입력 맵핑 시스템 도입이 필요하다.
4. Unity의 새로운 Input System과 충돌 가능성
- 2020 이후 버전의 New Input System을 사용하면 충돌이나 이중 처리 문제가 생길 수 있다.
아래 코드는 정보를 찾아 개인적으로 사용하기 편하게 설계한 코드이다.
private static InputManager s_instance;
public static InputManager Instance
{
get
{
if(s_instance == null)
{
GameObject go = new GameObject("@InputManager");
s_instance = go.AddComponent<InputManager>();
DontDestroyOnLoad(go);
}
return s_instance;
}
public event Action GetKeyDown; // 이벤트 설정
public event Action InputSpace;
void Update()
{
if(Input.GetKeyDown(...))
{
GetKeyDown?.Invoke(); // 이벤트 발생
}
}
public void processInput()
{
Debug.Log("Input 눌렸다");
}
1. 완전한 싱글톤 구조로 접근성 확보
- 어디서든 InputManager.Instance로 접근 가능
- DontDestroyOnLoad 덕분에 씬 전환 시에도 유지
- 전역 접근 + 1회 생성 보장 = 효율적인 메모리 관리 + 안정성
2. 입력 처리와 행동 처리의 분리
- InputManager는 단순히 입력 감지만 담당
- 실제 행동은 다른 클래스에서 등록
- 의존성 down, 변경에도 유연하게 대응 가능
- 하나의 입력 이벤트에 여러 기능 연결 가능, 유지보수/확장에 아주 강하다.
3. 동적으로 InputManager 오브젝트 생성
- GamaManager에 등록 후, 게임매니저 에서는 초기화를 담당 시켜 _= Gamemanager.Instance; 로 초기화 가능.
- 동적 생성이기 때문에 따로 배치x, bootScript에서 초기화 가능
4. 테스트와 디버깅에 용이, 커스터마이징 확장성 확보
- 나중에 Input System, UI, 키 바인딩 등 붙일 때도 InputManager만 고치면 됨.
단순한 프로젝트에서는 복잡해질 수 있으므로 규모가 어느 정도 커졌을 때 유용하다.
잘 활용하면 프로젝트에서 큰 도움이 될 것 같으니 자주 많이 써보자.
Input 시스템을 직접 코드로 구현하셨다니..! 저도 덕분에 잘 이해되고 있습니다 ㅎㅎ