75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
public class InputController : MonoBehaviour
|
|
{
|
|
public List<SignalBinding> 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<ButtonState, System.Func<InSignal, bool>> SignalChecks = new()
|
|
{
|
|
[ButtonState.Down] = s => In.GetButtonDown(s),
|
|
[ButtonState.Up] = s => In.GetButtonUp(s),
|
|
[ButtonState.Pressed] = s => In.GetButton(s),
|
|
};
|
|
|
|
private static readonly Dictionary<ButtonState, System.Func<KeyCode, bool>> 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 }
|
|
} |