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; private IInputActionCollection _inputActionCollection = null; public IInputActionCollection InputActionCollection { get => _inputActionCollection; set { _inputActionCollection = value; foreach (IVariableMovementWithState variableMovement in variableMovementsWithState) variableMovement.InputCollection = value; } } 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.OnMovementActivated.AddListener(SetMultiplierToActiveMovement); movementController.OnMovementDeactivated.AddListener(ResetMultiplierToDefault); } private void ResetMultiplierToDefault(IMovement currentMovement) { if (!isSet) return; currentMovement.MovementMultiplier = defaultVariableMovement.Asset.Multiplier; } protected void SetMultiplierToActiveMovement(IMovement currentMovement) { if (!isSet) return; currentMovement.MovementMultiplier = ActiveVariableMovement.Asset.Multiplier; } public void LoadVariableMovementCollection(VMCollection 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; } } }