using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using UnityEngine; using Object = System.Object; namespace LzFramework.FSM { public class StateMachineRunner : MonoBehaviour { private List stateMachineList = new List(); /// /// Creates a stateMachine token object which is used to managed to the state of a monobehaviour. /// /// An Enum listing different state transitions /// The component whose state will be managed /// public StateMachine Initialize(MonoBehaviour component) where T : struct, IConvertible, IComparable { var fsm = new StateMachine(this, component); stateMachineList.Add(fsm); return fsm; } /// /// Creates a stateMachine token object which is used to managed to the state of a monobehaviour. Will automatically transition the startState /// /// An Enum listing different state transitions /// The component whose state will be managed /// The default start state /// public StateMachine Initialize(MonoBehaviour component, T startState) where T : struct, IConvertible, IComparable { var fsm = Initialize(component); fsm.ChangeState(startState); return fsm; } void FixedUpdate() { for (int i = 0; i < stateMachineList.Count; i++) { var fsm = stateMachineList[i]; if (!fsm.IsInTransition && fsm.Component.enabled) fsm.CurrentStateMap.FixedUpdate(); } } void Update() { for (int i = 0; i < stateMachineList.Count; i++) { var fsm = stateMachineList[i]; if (!fsm.IsInTransition && fsm.Component.enabled) { fsm.CurrentStateMap.Update(); } } } void LateUpdate() { for (int i = 0; i < stateMachineList.Count; i++) { var fsm = stateMachineList[i]; if (!fsm.IsInTransition && fsm.Component.enabled) { fsm.CurrentStateMap.LateUpdate(); } } } //void OnCollisionEnter(Collision collision) //{ // if(currentState != null && !IsInTransition) // { // currentState.OnCollisionEnter(collision); // } //} public static void DoNothing() { } public static void DoNothingCollider(Collider other) { } public static void DoNothingCollision(Collision other) { } public static IEnumerator DoNothingCoroutine() { yield break; } } public class StateMapping { public object state; public bool hasEnterRoutine; public Action EnterCall = StateMachineRunner.DoNothing; public Func EnterRoutine = StateMachineRunner.DoNothingCoroutine; public bool hasExitRoutine; public Action ExitCall = StateMachineRunner.DoNothing; public Func ExitRoutine = StateMachineRunner.DoNothingCoroutine; public Action Finally = StateMachineRunner.DoNothing; public Action Update = StateMachineRunner.DoNothing; public Action LateUpdate = StateMachineRunner.DoNothing; public Action FixedUpdate = StateMachineRunner.DoNothing; public Action OnCollisionEnter = StateMachineRunner.DoNothingCollision; public StateMapping(object state) { this.state = state; } } }