You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.0 KiB
131 lines
4.0 KiB
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<IStateMachine> stateMachineList = new List<IStateMachine>();
|
|
|
|
/// <summary>
|
|
/// Creates a stateMachine token object which is used to managed to the state of a monobehaviour.
|
|
/// </summary>
|
|
/// <typeparam name="T">An Enum listing different state transitions</typeparam>
|
|
/// <param name="component">The component whose state will be managed</param>
|
|
/// <returns></returns>
|
|
public StateMachine<T> Initialize<T>(MonoBehaviour component) where T : struct, IConvertible, IComparable
|
|
{
|
|
var fsm = new StateMachine<T>(this, component);
|
|
|
|
stateMachineList.Add(fsm);
|
|
|
|
return fsm;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a stateMachine token object which is used to managed to the state of a monobehaviour. Will automatically transition the startState
|
|
/// </summary>
|
|
/// <typeparam name="T">An Enum listing different state transitions</typeparam>
|
|
/// <param name="component">The component whose state will be managed</param>
|
|
/// <param name="startState">The default start state</param>
|
|
/// <returns></returns>
|
|
public StateMachine<T> Initialize<T>(MonoBehaviour component, T startState) where T : struct, IConvertible, IComparable
|
|
{
|
|
var fsm = Initialize<T>(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<IEnumerator> EnterRoutine = StateMachineRunner.DoNothingCoroutine;
|
|
|
|
public bool hasExitRoutine;
|
|
public Action ExitCall = StateMachineRunner.DoNothing;
|
|
public Func<IEnumerator> 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<Collision> OnCollisionEnter = StateMachineRunner.DoNothingCollision;
|
|
|
|
public StateMapping(object state)
|
|
{
|
|
this.state = state;
|
|
}
|
|
|
|
}
|
|
}
|
|
|