using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; namespace Syntriax.Modules.Movement.VariableMovement { public class VariableMovementController : MonoBehaviour, IVariableMovementController { public UnityEvent OnVariableMovementChanged { get; protected set; } = null; public IInputActionCollection InputActionCollection { get; set; } = null; private IVariableMovement _activeVariableMovement = null; public IVariableMovement ActiveVariableMovement { get => _activeVariableMovement; protected set { _activeVariableMovement = value; OnVariableMovementChanged.Invoke(value); if (movementController != null) SetMultiplierToActiveMovement(movementController.ActiveMovement); } } protected bool isSet = false; protected IMovementController movementController = null; protected IVariableMovement defaultVariableMovement = null; protected List variableMovementsWithState = null; protected VMCollection collection; protected virtual void Awake() { OnVariableMovementChanged = new UnityEvent(); defaultVariableMovement = new VariableMovement(); variableMovementsWithState = new List(16); } protected virtual void Start() { movementController = GetComponent(); movementController.OnMovementChanged.AddListener(SetMultiplierToActiveMovement); } protected void SetMultiplierToActiveMovement(IMovement currentMovement) { if (!isSet) return; currentMovement.MovementMultiplier = ActiveVariableMovement.Asset.Multiplier; } public void LoadVariableMovementCollection(VMCollection collection) { if (InputActionCollection == null) throw new System.NullReferenceException("InputActionCollection must be set on the VariableMovementController to load a collection!"); this.collection = collection; isSet = true; UnsubscribeFromMovements(); variableMovementsWithState.Clear(); foreach (VMAsset asset in collection.VMAssets) variableMovementsWithState.Add(new VariableMovementWithState(asset, InputActionCollection)); defaultVariableMovement.Asset = collection.DefaultAsset; SubscribeToMovements(); UpdateActiveVariableMovement(); } protected virtual void SubscribeToMovements() { foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) variableMovementWithState.OnToggleStateChanged.AddListener(VariableMovementStateListener); } protected virtual void UnsubscribeFromMovements() { foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) variableMovementWithState.OnToggleStateChanged.RemoveListener(VariableMovementStateListener); } private void VariableMovementStateListener(bool arg0) => UpdateActiveVariableMovement(); protected virtual void UpdateActiveVariableMovement() { foreach (IVariableMovementWithState variableMovementWithState in variableMovementsWithState) if (variableMovementWithState.Enabled) { ActiveVariableMovement = variableMovementWithState; return; } ActiveVariableMovement = defaultVariableMovement; } } }