Movement/VariableMovement/VariableMovementWithState.cs

82 lines
2.3 KiB
C#

using UnityEngine.Events;
using UnityEngine.InputSystem;
namespace Syntriax.Modules.Movement.VariableMovement
{
public class VariableMovementWithState : IVariableMovementWithState
{
public UnityEvent<bool> 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<bool>();
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;
}
}
}
}