sea-battle-vr/Assets/Scripts/Common/InputController.cs

78 lines
2.3 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 = false;
public void Init(bool startPolling)
{
if(Bindings == null)
{
Debug.LogError("Биндинги не назначены", this);
return;
}
polling = startPolling;
initialized = true;
}
public void StartPolling() => polling = true;
public void StopPolling() => polling = false;
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 }
}