using System;
using System.Collections.Generic;
using FrameWork;
using UnityEngine;
public abstract class StateSystem<T> : MonoBehaviour
{
protected StateMachine<T> mState;
protected Stack<T> mStateStack;
private void Awake()
{
mState = new StateMachine<T>();
mStateStack = new Stack<T>();
initialize();
initStates();
}
protected virtual void initialize()
{
}
protected virtual void initStates()
{
}
public void OnEnable()
{
mState.OnStart();
}
public virtual void Update()
{
mState.OnUpdate();
}
public void OnDisable()
{
mState.OnStop();
}
public void ChangeState(T state, bool saveState = false)
{
try
{
if (mState.CurrentState.Equals(state))
{
return;
}
if (saveState)
{
mStateStack.Push(mState.CurrentState);
}
Debug.LogFormat("切换状态:{0} -> {1}", mState.CurrentState, state);
mState.ChangeState(state);
}
catch (Exception e)
{
Debug.Log(e.Message);
throw;
}
}
public T currentState
{
get {
return mState.CurrentState; }
}
public bool BackState()
{
if (mStateStack.Count == 0)
{
return false;
}
T lastState = mStateStack.Pop();
mStateStack.Clear();
ChangeState(lastState);
return true;
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
namespace FrameWork
{
public class StateMachine<T>
{
private class State
{
public readonly T label;
public readonly Action onStart;
public readonly Func<T> onUpdate;
public readonly Action onStop;
public State(T label, Action onStart, Func<T> onUpdate, Action onStop)
{
this.label = label;
this.onStart = onStart;
this.onUpdate = onUpdate;
this.onStop = onStop;
}
}
private readonly Dictionary<T, State> mStateDictionary;
private State mCurrentState;
private State mPreState;
private T mEnterState;
public T CurrentState
{
get {
return mCurrentState.label; }
set {
ChangeState(value); }
}
public T PreState => mPreState.label;
public bool IsRunning
{
get {
return CurrentState != null; }
}
public StateMachine()
{
mStateDictionary = new Dictionary<T, State>();
}
public void OnStart()
{
if (mStateDictionary.Count == 0)
{
return;
}
mCurrentState = mStateDictionary[mEnterState];
if (mCurrentState != null && mCurrentState.onStart != null)
{
mCurrentState.onStart();
}
}
public void OnUpdate()
{
if (mCurrentState != null && mCurrentState.onUpdate != null)
{
mCurrentState.onUpdate();
}
}
public void OnStop()
{
if (mCurrentState != null && mCurrentState.onStop != null)
{
mCurrentState.onStop();
}
}
public void AddState(T label, Action onStart, Func<T> onUpdate, Action onStop)
{
State state = new State(label, onStart, onUpdate, onStop);
mStateDictionary[label] = state;
if (mCurrentState == null)
{
mCurrentState = state;
mEnterState = mCurrentState.label;
}
}
public void ChangeState(T newLabel)
{
if (mCurrentState != null && mCurrentState.onStop != null)
{
mCurrentState.onStop();
}
mPreState = mCurrentState;
mCurrentState = mStateDictionary[newLabel];
if (mCurrentState != null && mCurrentState.onStart != null)
{
mCurrentState.onStart();
}
}
}
}