Unity【设计模式】- 构建FSM有限状态机
FSM(Finite State Machine)有限状态机,广泛应用于状态类、流程类、步骤类程序的处理。
1. 定义状态接口、抽象状态类,状态包含的五个基本行为:
· OnInitialization 状态初始化事件
· OnEnter 状态进入事件
· OnStay 状态停留事件
· OnExit 状态退出事件
· OnTermination 状态终止事件
-
using System;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 状态接口
-
/// </summary>
-
public interface IState
-
{
-
/// <summary>
-
/// 状态名称
-
/// </summary>
-
string Name { get; set; }
-
/// <summary>
-
/// 状态初始化事件
-
/// </summary>
-
void OnInitialization();
-
/// <summary>
-
/// 状态进入事件
-
/// </summary>
-
void OnEnter();
-
/// <summary>
-
/// 状态停留事件(Update)
-
/// </summary>
-
void OnStay();
-
/// <summary>
-
/// 状态退出事件
-
/// </summary>
-
void OnExit();
-
/// <summary>
-
/// 状态终止事件
-
/// </summary>
-
void OnTermination();
-
/// <summary>
-
/// 状态切换条件
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
void SwitchWhen(Func<bool> predicate, string targetStateName);
-
}
-
}
-
using System;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 抽象状态类
-
/// </summary>
-
public class State : IState
-
{
-
/// <summary>
-
/// 状态名称
-
/// </summary>
-
public string Name { get; set; }
-
/// <summary>
-
/// 所属状态机
-
/// </summary>
-
public StateMachine machine;
-
/// <summary>
-
/// 状态初始化事件
-
/// </summary>
-
public Action onInitialization;
-
/// <summary>
-
/// 状态进入事件
-
/// </summary>
-
public Action onEnter;
-
/// <summary>
-
/// 状态停留事件
-
/// </summary>
-
public Action onStay;
-
/// <summary>
-
/// 状态退出事件
-
/// </summary>
-
public Action onExit;
-
/// <summary>
-
/// 状态终止事件
-
/// </summary>
-
public Action onTermination;
-
-
/// <summary>
-
/// 状态初始化事件
-
/// </summary>
-
public virtual void OnInitialization()
-
{
-
onInitialization?.Invoke();
-
}
-
/// <summary>
-
/// 状态进入事件
-
/// </summary>
-
public virtual void OnEnter()
-
{
-
onEnter?.Invoke();
-
}
-
/// <summary>
-
/// 状态停留事件
-
/// </summary>
-
public virtual void OnStay()
-
{
-
onStay?.Invoke();
-
}
-
/// <summary>
-
/// 状态退出事件
-
/// </summary>
-
public virtual void OnExit()
-
{
-
onExit?.Invoke();
-
}
-
/// <summary>
-
/// 状态终止事件
-
/// </summary>
-
public virtual void OnTermination()
-
{
-
onTermination?.Invoke();
-
}
-
/// <summary>
-
/// 设置状态切换条件
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
public void SwitchWhen(Func<bool> predicate, string targetStateName)
-
{
-
machine.SwitchWhen(predicate, Name, targetStateName);
-
}
-
}
-
}
SwitchWhen函数用于为该状态切换到其他指定状态添加切换条件,当条件满足时,状态机会自动切换到目标状态。
2. 定义状态机类,状态机包含的基本行为:
· Add 添加状态
· Remove 移除状态
· Switch 切换状态
-
using System;
-
using UnityEngine;
-
using System.Collections.Generic;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 状态机
-
/// </summary>
-
public class StateMachine
-
{
-
//状态列表 存储状态机内所有状态
-
protected readonly List<IState> states = new List<IState>();
-
//状态切换条件列表
-
protected List<StateSwitchCondition> conditions = new List<StateSwitchCondition>();
-
-
/// <summary>
-
/// 状态机名称
-
/// </summary>
-
public string Name { get; set; }
-
/// <summary>
-
/// 当前状态
-
/// </summary>
-
public IState CurrentState { get; protected set; }
-
-
/// <summary>
-
/// 添加状态
-
/// </summary>
-
/// <param name="state">状态</param>
-
/// <returns>添加成功返回true 否则返回false</returns>
-
public bool Add(IState state)
-
{
-
//判断是否已经存在
-
if (!states.Contains(state))
-
{
-
//判断是否存在同名状态
-
if (states.Find(m => m.Name == state.Name) == null)
-
{
-
//存储到列表
-
states.Add(state);
-
//执行状态初始化事件
-
state.OnInitialization();
-
return true;
-
}
-
}
-
return false;
-
}
-
/// <summary>
-
/// 添加状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <param name="stateName">状态命名</param>
-
/// <returns>添加成功返回true 否则返回false</returns>
-
public bool Add<T>(string stateName = null) where T : IState, new()
-
{
-
Type type = typeof(T);
-
T t = (T)Activator.CreateInstance(type);
-
t.Name = string.IsNullOrEmpty(stateName) ? type.Name : stateName;
-
return Add(t);
-
}
-
/// <summary>
-
/// 移除状态
-
/// </summary>
-
/// <param name="state">状态</param>
-
/// <returns>移除成功返回true 否则返回false</returns>
-
public bool Remove(IState state)
-
{
-
//判断是否存在
-
if (states.Contains(state))
-
{
-
//如果要移除的状态为当前状态 首先执行当前状态退出事件
-
if (CurrentState == state)
-
{
-
CurrentState.OnExit();
-
CurrentState = null;
-
}
-
//执行状态终止事件
-
state.OnTermination();
-
return states.Remove(state);
-
}
-
return false;
-
}
-
/// <summary>
-
/// 移除状态
-
/// </summary>
-
/// <param name="stateName">状态名称</param>
-
/// <returns>移除成功返回true 否则返回false</returns>
-
public bool Remove(string stateName)
-
{
-
var targetIndex = states.FindIndex(m => m.Name == stateName);
-
if (targetIndex != -1)
-
{
-
var targetState = states[targetIndex];
-
if (CurrentState == targetState)
-
{
-
CurrentState.OnExit();
-
CurrentState = null;
-
}
-
targetState.OnTermination();
-
return states.Remove(targetState);
-
}
-
return false;
-
}
-
/// <summary>
-
/// 移除状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <returns>移除成返回true 否则返回false</returns>
-
public bool Remove<T>() where T : IState
-
{
-
return Remove(typeof(T).Name);
-
}
-
/// <summary>
-
/// 切换状态
-
/// </summary>
-
/// <param name="state">状态</param>
-
/// <returns>切换成功返回true 否则返回false</returns>
-
public bool Switch(IState state)
-
{
-
//如果当前状态已经是切换的目标状态 无需切换 返回false
-
if (CurrentState == state) return false;
-
//当前状态不为空则执行状态退出事件
-
CurrentState?.OnExit();
-
//判断切换的目标状态是否存在于列表中
-
if (!states.Contains(state)) return false;
-
//更新当前状态
-
CurrentState = state;
-
//更新后 当前状态不为空则执行状态进入事件
-
CurrentState?.OnEnter();
-
return true;
-
}
-
/// <summary>
-
/// 切换状态
-
/// </summary>
-
/// <param name="stateName">状态名称</param>
-
/// <returns>切换成功返回true 否则返回false</returns>
-
public bool Switch(string stateName)
-
{
-
//根据状态名称在列表中查询
-
var targetState = states.Find(m => m.Name == stateName);
-
return Switch(targetState);
-
}
-
/// <summary>
-
/// 切换状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <returns>切换成返回true 否则返回false</returns>
-
public bool Switch<T>() where T : IState
-
{
-
return Switch(typeof(T).Name);
-
}
-
/// <summary>
-
/// 切换至下一状态
-
/// </summary>
-
public void Switch2Next()
-
{
-
if (states.Count != 0)
-
{
-
//如果当前状态不为空 则根据当前状态找到下一个状态
-
if (CurrentState != null)
-
{
-
int index = states.IndexOf(CurrentState);
-
//当前状态的索引值+1后若小于列表中的数量 则下一状态的索引为index+1
-
//否则表示当前状态已经是列表中的最后一个 下一状态则回到列表中的第一个状态 索引为0
-
index = index + 1 < states.Count ? index + 1 : 0;
-
IState targetState = states[index];
-
//首先执行当前状态的退出事件 再更新到下一状态
-
CurrentState.OnExit();
-
CurrentState = targetState;
-
}
-
//当前状态为空 则直接进入列表中的第一个状态
-
else
-
{
-
CurrentState = states[0];
-
}
-
//执行状态进入事件
-
CurrentState.OnEnter();
-
}
-
}
-
/// <summary>
-
/// 切换至上一状态
-
/// </summary>
-
public void Switch2Last()
-
{
-
if (states.Count != 0)
-
{
-
//如果当前状态不为空 则根据当前状态找到上一个状态
-
if (CurrentState != null)
-
{
-
int index = states.IndexOf(CurrentState);
-
//当前状态的索引值-1后若大等于0 则下一状态的索引为index-1
-
//否则表示当前状态是列表中的第一个 上一状态则回到列表中的最后一个状态
-
index = index - 1 >= 0 ? index - 1 : states.Count - 1;
-
IState targetState = states[index];
-
//首先执行当前状态的退出事件 再更新到上一状态
-
CurrentState.OnExit();
-
CurrentState = targetState;
-
}
-
//当前状态为空 则直接进入列表中的最后一个状态
-
else
-
{
-
CurrentState = states[states.Count - 1];
-
}
-
//执行状态进入事件
-
CurrentState.OnEnter();
-
}
-
}
-
/// <summary>
-
/// 切换至空状态(退出当前状态)
-
/// </summary>
-
public void Switch2Null()
-
{
-
if (CurrentState != null)
-
{
-
CurrentState.OnExit();
-
CurrentState = null;
-
}
-
}
-
/// <summary>
-
/// 获取状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <param name="stateName">状态名称</param>
-
/// <returns>状态</returns>
-
public T GetState<T>(string stateName) where T : IState
-
{
-
return (T)states.Find(m => m.Name == stateName);
-
}
-
/// <summary>
-
/// 获取状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <returns>状态</returns>
-
public T GetState<T>() where T : IState
-
{
-
return (T)states.Find(m => m.Name == typeof(T).Name);
-
}
-
/// <summary>
-
/// 状态机刷新事件
-
/// </summary>
-
public void OnUpdate()
-
{
-
//若当前状态不为空 执行状态停留事件
-
CurrentState?.OnStay();
-
//检测所有状态切换条件
-
for (int i = 0; i < conditions.Count; i++)
-
{
-
var condition = conditions[i];
-
//条件满足
-
if (condition.predicate.Invoke())
-
{
-
//源状态名称为空 表示从任意状态切换至目标状态
-
if (string.IsNullOrEmpty(condition.sourceStateName))
-
{
-
Switch(condition.targetStateName);
-
}
-
//源状态名称不为空 表示从指定状态切换至目标状态
-
else
-
{
-
//首先判断当前的状态是否为指定的状态
-
if (CurrentState.Name == condition.sourceStateName)
-
{
-
Switch(condition.targetStateName);
-
}
-
}
-
}
-
}
-
}
-
/// <summary>
-
/// 状态机销毁事件
-
/// </summary>
-
public void OnDestroy()
-
{
-
//执行状态机内所有状态的状态终止事件
-
for (int i = 0; i < states.Count; i++)
-
{
-
states[i].OnTermination();
-
}
-
}
-
-
/// <summary>
-
/// 设置状态切换条件
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
/// <returns>状态机</returns>
-
public StateMachine SwitchWhen(Func<bool> predicate, string targetStateName)
-
{
-
conditions.Add(new StateSwitchCondition(predicate, null, targetStateName));
-
return this;
-
}
-
/// <summary>
-
/// 设置状态切换条件
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="sourceStateName">源状态名称</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
/// <returns></returns>
-
public StateMachine SwitchWhen(Func<bool> predicate, string sourceStateName, string targetStateName)
-
{
-
conditions.Add(new StateSwitchCondition(predicate, sourceStateName, targetStateName));
-
return this;
-
}
-
-
/// <summary>
-
/// 构建状态
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
/// <param name="stateName">状态名称</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> Build<T>(string stateName = null) where T : State, new()
-
{
-
Type type = typeof(T);
-
T t = (T)Activator.CreateInstance(type);
-
t.Name = string.IsNullOrEmpty(stateName) ? type.Name : stateName;
-
if (states.Find(m => m.Name == t.Name) == null)
-
{
-
states.Add(t);
-
}
-
return new StateBuilder<T>(t, this);
-
}
-
-
/// <summary>
-
/// 创建状态机
-
/// </summary>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public static StateMachine Create(string stateMachineName = null)
-
{
-
return FSMMaster.Instance.Create<StateMachine>(stateMachineName);
-
}
-
/// <summary>
-
/// 创建状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public static T Create<T>(string stateMachineName = null) where T : StateMachine, new()
-
{
-
return FSMMaster.Instance.Create<T>(stateMachineName);
-
}
-
/// <summary>
-
/// 销毁状态机
-
/// </summary>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>销毁成功返回true 否则返回false</returns>
-
public static bool Destroy(string stateMachineName)
-
{
-
return FSMMaster.Instance.Destroy(stateMachineName);
-
}
-
/// <summary>
-
/// 销毁状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <returns>销毁成功返回true 否则返回false</returns>
-
public static bool Destroy<T>() where T : StateMachine
-
{
-
return FSMMaster.Instance.Destroy(typeof(T).Name);
-
}
-
/// <summary>
-
/// 获取状态机
-
/// </summary>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public StateMachine Get(string stateMachineName)
-
{
-
return FSMMaster.Instance.GetMachine<StateMachine>(stateMachineName);
-
}
-
/// <summary>
-
/// 获取状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public static T Get<T>(string stateMachineName) where T : StateMachine
-
{
-
return FSMMaster.Instance.GetMachine<T>(stateMachineName);
-
}
-
/// <summary>
-
/// 获取状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <returns>状态机</returns>
-
public static T Get<T>() where T : StateMachine
-
{
-
return FSMMaster.Instance.GetMachine<T>(typeof(T).Name);
-
}
-
}
-
}
3. StateSwitchCondition类用于设置状态的切换条件,其包含的字段:
· predicate 切换条件
· sourceStateName 源状态名称
· targetStateName 目标状态名称
该类用于表示当条件predicate满足时,从状态sourceState切换到targetState目标状态
-
using System;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 状态切换条件
-
/// </summary>
-
public class StateSwitchCondition
-
{
-
/// <summary>
-
/// 条件
-
/// </summary>
-
public readonly Func<bool> predicate;
-
/// <summary>
-
/// 源状态名称
-
/// </summary>
-
public readonly string sourceStateName;
-
/// <summary>
-
/// 目标状态名称
-
/// </summary>
-
public readonly string targetStateName;
-
-
/// <summary>
-
/// 构造函数
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="sourceStateName">源状态名称</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
public StateSwitchCondition(Func<bool> predicate, string sourceStateName, string targetStateName)
-
{
-
this.predicate = predicate;
-
this.sourceStateName = sourceStateName;
-
this.targetStateName = targetStateName;
-
}
-
}
-
}
4. 定义管理类,其包含的基本行为:
· Create 创建状态机
· Destroy 销毁状态机
· Get 获取状态机
-
using System;
-
using UnityEngine;
-
using System.Collections.Generic;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 有限状态机管理器
-
/// </summary>
-
public class FSMMaster : MonoBehaviour
-
{
-
#region NonPublic Variables
-
private static FSMMaster instance;
-
-
//状态机列表
-
private List<StateMachine> machines;
-
#endregion
-
-
#region Public Properties
-
public static FSMMaster Instance
-
{
-
get
-
{
-
if (instance == null)
-
{
-
instance = new GameObject("[SKFramework.FSM]").AddComponent<FSMMaster>();
-
instance.machines = new List<StateMachine>();
-
DontDestroyOnLoad(instance);
-
}
-
return instance;
-
}
-
}
-
#endregion
-
-
#region NonPublic Methods
-
private void Update()
-
{
-
for (int i = 0; i < machines.Count; i++)
-
{
-
//更新状态机
-
machines[i].OnUpdate();
-
}
-
}
-
private void OnDestroy()
-
{
-
instance = null;
-
}
-
#endregion
-
-
#region Public Methods
-
/// <summary>
-
/// 创建状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public T Create<T>(string stateMachineName = null) where T : StateMachine, new()
-
{
-
Type type = typeof(T);
-
stateMachineName = string.IsNullOrEmpty(stateMachineName) ? type.Name : stateMachineName;
-
if (machines.Find(m => m.Name == stateMachineName) == null)
-
{
-
T machine = (T)Activator.CreateInstance(type);
-
machine.Name = stateMachineName;
-
machines.Add(machine);
-
return machine;
-
}
-
return default;
-
}
-
/// <summary>
-
/// 销毁状态机
-
/// </summary>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>销毁成功返回true 否则返回false</returns>
-
public bool Destroy(string stateMachineName)
-
{
-
var targetMachine = machines.Find(m => m.Name == stateMachineName);
-
if (targetMachine != null)
-
{
-
targetMachine.OnDestroy();
-
machines.Remove(targetMachine);
-
return true;
-
}
-
return false;
-
}
-
/// <summary>
-
/// 获取状态机
-
/// </summary>
-
/// <typeparam name="T">状态机类型</typeparam>
-
/// <param name="stateMachineName">状态机名称</param>
-
/// <returns>状态机</returns>
-
public T GetMachine<T>(string stateMachineName) where T : StateMachine
-
{
-
return (T)machines.Find(m => m.Name == stateMachineName);
-
}
-
#endregion
-
}
-
}
5. StateBuilder类用于构建状态,便于链式编程
-
using System;
-
-
namespace SK.Framework
-
{
-
/// <summary>
-
/// 状态构建器
-
/// </summary>
-
/// <typeparam name="T">状态类型</typeparam>
-
public class StateBuilder<T> where T : State, new()
-
{
-
//构建的状态
-
private readonly T state;
-
//构建的状态所属的状态机
-
private readonly StateMachine stateMachine;
-
-
/// <summary>
-
/// 构造函数
-
/// </summary>
-
/// <param name="state"></param>
-
/// <param name="stateMachine"></param>
-
public StateBuilder(T state, StateMachine stateMachine)
-
{
-
this.state = state;
-
this.stateMachine = stateMachine;
-
}
-
-
/// <summary>
-
/// 设置状态初始化事件
-
/// </summary>
-
/// <param name="onInitialization">状态初始化事件</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> OnInitialization(Action<T> onInitialization)
-
{
-
state.onInitialization = () => onInitialization(state);
-
return this;
-
}
-
/// <summary>
-
/// 设置状态进入事件
-
/// </summary>
-
/// <param name="onEnter">状态进入事件</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> OnEnter(Action<T> onEnter)
-
{
-
state.onEnter = () => onEnter(state);
-
return this;
-
}
-
/// <summary>
-
/// 设置状态停留事件
-
/// </summary>
-
/// <param name="onStay">状态停留事件</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> OnStay(Action<T> onStay)
-
{
-
state.onStay = () => onStay(state);
-
return this;
-
}
-
/// <summary>
-
/// 设置状态退出事件
-
/// </summary>
-
/// <param name="onExit">状态退出事件</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> OnExit(Action<T> onExit)
-
{
-
state.onExit = () => onExit(state);
-
return this;
-
}
-
/// <summary>
-
/// 设置状态终止事件
-
/// </summary>
-
/// <param name="onTermination">状态终止事件</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> OnTermination(Action<T> onTermination)
-
{
-
state.onTermination = () => onTermination(state);
-
return this;
-
}
-
/// <summary>
-
/// 设置状态切换条件
-
/// </summary>
-
/// <param name="predicate">切换条件</param>
-
/// <param name="targetStateName">目标状态名称</param>
-
/// <returns>状态构建器</returns>
-
public StateBuilder<T> SwitchWhen(Func<bool> predicate, string targetStateName)
-
{
-
state.SwitchWhen(predicate, targetStateName);
-
return this;
-
}
-
/// <summary>
-
/// 构建完成
-
/// </summary>
-
/// <returns>状态机</returns>
-
public StateMachine Complete()
-
{
-
state.OnInitialization();
-
return stateMachine;
-
}
-
}
-
}
6. Example 编码示例:
-
using UnityEngine;
-
using SK.Framework;
-
-
public class Foo : MonoBehaviour
-
{
-
public class TestState : State
-
{
-
public string stringValue;
-
}
-
-
private void Start()
-
{
-
//创建状态机
-
var machine = StateMachine.Create()
-
//构建状态一
-
.Build<TestState>("状态一")
-
//设置状态一初始化事件
-
.OnInitialization(state => state.stringValue = "A")
-
//设置状态一进入事件
-
.OnEnter(state => Debug.Log("进入状态一"))
-
//设置状态一停留事件
-
.OnStay(state => Debug.Log("状态一"))
-
//设置状态一推出事件
-
.OnExit(state => Debug.Log("退出状态一"))
-
//设置状态一销毁事件
-
.OnTermination(state => state.stringValue = null)
-
//状态一构建完成
-
.Complete()
-
//构建状态二
-
.Build<State>("状态二")
-
//设置状态二进入事件
-
.OnEnter(state => Debug.Log("进入状态二"))
-
//设置状态二停留事件
-
.OnStay(state => Debug.Log("状态二"))
-
//设置状态二退出事件
-
.OnExit((state => Debug.Log("退出状态二")))
-
//状态二构建完成
-
.Complete()
-
//构建状态三
-
.Build<State>("状态三")
-
//设置状态三进入事件
-
.OnEnter(state => Debug.Log("进入状态三"))
-
//设置状态三停留事件
-
.OnStay(state => Debug.Log("状态三"))
-
//设置状态三退出事件
-
.OnExit((state => Debug.Log("退出状态三")))
-
//状态三构建完成
-
.Complete()
-
//添加状态切换条件 当按下快捷键1时 切换至状态一
-
.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha1), "状态一")
-
//添加状态切换条件 当按下快捷键2时 切换至状态二
-
.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha2), "状态二")
-
//添加状态切换条件 当按下快捷键3时 切换至状态三
-
.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha3), "状态三")
-
//为状态一至状态二添加切换条件:若当前状态为状态一时 按下快捷键4 切换至状态二
-
.SwitchWhen(() => Input.GetKeyDown(KeyCode.Alpha4), "状态一", "状态二");
-
-
//切换到指定状态
-
machine.Switch("状态一");
-
//切换到下一状态
-
machine.Switch2Next();
-
//切换到上一状态
-
machine.Switch2Last();
-
}
-
}
文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。
原文链接:coderz.blog.csdn.net/article/details/122410779
- 点赞
- 收藏
- 关注作者
评论(0)