using System.Collections.Generic; using Syntriax.Modules.Movement.State; using UnityEngine; using UnityEngine.Events; namespace Syntriax.Modules.Movement { public class MovementController : MonoBehaviour, IMovementController { public IMovement ActiveMovement { get; protected set; } = null; public UnityEvent OnMovementChanged { get; protected set; } = new UnityEvent(); protected List movements = new List(32); protected IToggleState toggleState = null; 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; OnMovementChanged.Invoke(ActiveMovement); return; } ActiveMovement = movements[movements.Count - 1]; OnMovementChanged.Invoke(ActiveMovement); } } }