게임 매니저
public class Managers : MonoBehaviour
{
// 싱글톤 인스턴스
static Managers s_instance;
// 인스턴스 접근 시 자동으로 Init() 호출하여 초기화
static Managers Instance { get { Init(); return s_instance; } }
// 실제 사용할 InputManager 인스턴스
InputManager _input = new InputManager();
// 외부에서 InputManager에 접근할 수 있도록 공개 프로퍼티 제공
public static InputManager Input { get { return Instance._input; } }
void Start()
{
Init(); // 씬 시작 시 한 번 더 안전하게 초기화
}
void Update()
{
_input.OnUpdate(); // 매 프레임마다 InputManager의 Update 역할 수행
}
// 싱글톤 초기화
static void Init()
{
if (s_instance == null)
{
// @Managers 오브젝트를 찾거나 없으면 새로 생성
GameObject go = GameObject.Find("@Managers");
if (go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>();
}
// 씬 전환 시 파괴되지 않도록 설정
DontDestroyOnLoad(go);
// 인스턴스 캐싱
s_instance = go.GetComponent<Managers>();
}
}
}
인풋 매니저
using System;
using UnityEngine;
public class InputManager
{
// 외부에서 키 입력 이벤트를 등록할 수 있도록 하는 델리게이트
public Action KeyAction = null;
// 매 프레임마다 호출되며, 키 입력이 있을 경우 등록된 이벤트 실행
public void OnUpdate()
{
if (Input.anyKey == false)
return;
// 키가 눌렸고, 콜백이 등록되어 있으면 실행
if (KeyAction != null)
KeyAction.Invoke();
}
}
플레이어
using UnityEngine;
public class Player : MonoBehaviour
{
void Start()
{
// 기존에 중복 등록되어 있을 수 있으니 제거 후 다시 등록
Managers.Input.KeyAction -= Onkeyboard;
Managers.Input.KeyAction += Onkeyboard;
}
// 키보드 입력 처리 메서드 (W 키 누를 때마다 실행됨)
void Onkeyboard()
{
if (Input.GetKey(KeyCode.W))
{
// W 키가 눌렸을 때 실행할 로직 작성
Debug.Log("W key is held down");
}
}
}