using UnityEngine.Events; using UnityEngine.InputSystem; namespace Syntriax.Modules.Movement.VariableMovement { public class VariableMovementWithState : IVariableMovementWithState { public UnityEvent OnToggleStateChanged { get; protected set; } = null; private bool _enabled = false; public bool Enabled { get => _enabled; set { bool isNewValue = _enabled != value; _enabled = value; if (isNewValue) OnToggleStateChanged.Invoke(value); } } private VMAsset _asset; public VMAsset Asset { get => _asset; set { UpdateBindings(); _asset = value; Enabled = false; } } private IInputActionCollection _inputCollection = null; public IInputActionCollection InputCollection { set { if (_inputCollection == value) return; _inputCollection = value; UpdateBindings(); } } protected InputAction actionReference = null; public VariableMovementWithState(VMAsset asset, IInputActionCollection inputCollection) { InputCollection = inputCollection; OnToggleStateChanged = new UnityEvent(); Asset = asset; } protected void Cancelled(InputAction.CallbackContext obj) => Enabled = false; protected void Performed(InputAction.CallbackContext obj) => Enabled = true; protected void UpdateBindings() { if (actionReference != null) { actionReference.performed -= Performed; actionReference.canceled -= Cancelled; } if (_inputCollection != null) foreach (InputAction action in _inputCollection) if (action.name == Asset.Name) { actionReference = action; actionReference.performed += Performed; actionReference.canceled += Cancelled; break; } } } }