Реализован InputController
-В него можно удобно добавлять биндинги
This commit is contained in:
parent
a4912f5151
commit
27f1884692
77
Assets/Scripts/Common/InputController.cs
Normal file
77
Assets/Scripts/Common/InputController.cs
Normal file
@ -0,0 +1,77 @@
|
||||
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 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 }
|
||||
}
|
||||
2
Assets/Scripts/Common/InputController.cs.meta
Normal file
2
Assets/Scripts/Common/InputController.cs.meta
Normal file
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e7daf9cad9d628e4690c6795a052b6d9
|
||||
Loading…
x
Reference in New Issue
Block a user