using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class InputController : MonoBehaviour { public List Bindings; private bool initialized = false; private bool Polling { get; set; } = false; public void Init(bool startPolling) { if(Bindings == null) { Debug.LogError("Биндинги не назначены", this); return; } Polling = startPolling; initialized = true; } private void Update() { if (!(initialized && Polling)) return; foreach (var binding in Bindings) if (binding.IsTriggered()) binding.Perform(); } [System.Serializable] public class SignalBinding { private static readonly Dictionary> SignalChecks = new() { [ButtonState.Down] = s => In.GetButtonDown(s), [ButtonState.Up] = s => In.GetButtonUp(s), [ButtonState.Pressed] = s => In.GetButton(s), }; private static readonly Dictionary> KeyboardChecks = new() { [ButtonState.Down] = k => Input.GetKeyDown(k), [ButtonState.Up] = k => Input.GetKeyUp(k), [ButtonState.Pressed] = k => Input.GetKey(k), }; public string Name; public InputMode Mode; public InSignal Signal; public KeyCode KeyboardKey; public ButtonState RequiredButtonState; public UnityEvent Callback; public bool IsTriggered() { bool signalActive = SignalChecks[RequiredButtonState](Signal); bool keyboardActive = KeyboardChecks[RequiredButtonState](KeyboardKey); return Mode switch { InputMode.OnlySignal => signalActive, InputMode.OnlyKeyboard => keyboardActive, InputMode.Both => signalActive || keyboardActive, _ => false }; } public void Perform() => Callback?.Invoke(); } public enum InputMode { OnlySignal, OnlyKeyboard, Both } public enum ButtonState { Down, Up, Pressed } }