게임 매니저

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");
        }
    }
}