using System.Collections.Generic; using Syntriax.Modules.Movement.State; using UnityEngine; using UnityEngine.Events; namespace Syntriax.Modules.Movement { public class MovementController : MonoBehaviour, IMovementController { public UnityEvent OnMovementDeactivated { get; protected set; } = null; public UnityEvent OnMovementActivated { get; protected set; } = null; private IMovement _activeMovement = null; public IMovement ActiveMovement { get => _activeMovement; protected set { if (_activeMovement == value) return; IMovement oldMovement = _activeMovement; _activeMovement = value; OnMovementDeactivated.Invoke(oldMovement); OnMovementActivated.Invoke(value); } } public List Movements { get; protected set; } = null; protected IToggleState toggleState = null; protected virtual void Awake() { OnMovementDeactivated = new UnityEvent(); OnMovementActivated = new UnityEvent(); Movements = new List(32); } protected virtual void Start() { toggleState = GetComponent(); RecacheMovements(); } protected virtual void FixedUpdate() { if (!toggleState.Toggled) return; ActiveMovement.ApplyMovement(); } public virtual void RecacheMovements() { foreach (IMovement movement in Movements) movement.OnTakeOverStateChanged.RemoveListener(OnTakeOverListener); Movements.Clear(); GetComponents(Movements); UpdateActiveMovement(); foreach (IMovement movement in Movements) movement.OnTakeOverStateChanged.AddListener(OnTakeOverListener); } private void OnTakeOverListener(bool arg0) => UpdateActiveMovement(); protected virtual void UpdateActiveMovement() { foreach (IMovement movement in Movements) if (movement.CanTakeOver) { ActiveMovement = movement; return; } ActiveMovement = Movements[Movements.Count - 1]; } } }