状态机中的自动机写个模板框架在Unity里
时间: 2024-12-22 20:25:36 浏览: 13
在Unity中,创建状态机(StateMachine)可以让你更好地管理游戏中的角色行为。下面是一个简单的模板框架,用于描述一个基础的状态机:
```csharp
using UnityEngine;
using System.Collections;
public abstract class BaseState : MonoBehaviour
{
public StateMachineMachine machine; // 子系统挂载的状态机组件
private State currentState; // 当前激活的状态
[HideInInspector] public bool IsActive => machine.IsActive && machine.CurrentState == currentState;
public void OnEnter(BaseState nextState)
{
// 进入新状态时的操作
Debug.Log($"Entering state: {nextState.GetType().Name}");
// 可能需要更新UI、动画或其他属性
}
public void OnExit()
{
// 离开当前状态时的操作
Debug.Log("Exiting current state");
// 清理资源、停止事件等
}
public virtual void OnUpdate()
{
if (machine.ChangeState(currentState)) // 检查是否应切换到新的状态
{
currentState = machine.CurrentState; // 更新当前状态
OnEnter(currentState); // 执行进入新状态的回调
}
else
{
OnUpdateCurrent(); // 自定义当前状态下更新的行为
}
}
protected abstract void OnUpdateCurrent();
}
[Serializable]
public enum States
{
StateA,
StateB,
// 添加更多的状态...
}
public class StateMachineMachine : MonoBehaviour
{
public States currentState = States.StateA;
public void ChangeState(States newState)
{
if (currentState != newState)
{
currentState = newState;
var currentStateType = typeof(BaseState) + "State" + newState.ToString().Substring(0, 1).ToUpper();
var nextState = FindObjectOfTypecurrentStateType;
if (nextState != null)
nextState.gameObject.SetActive(true);
else
Debug.LogError($"No instance of {currentStateType} found!");
}
return currentState == newState;
}
}
```
在这个框架中,`BaseState`是所有状态的基础类,它包含了状态的基本操作,如进入和退出状态的方法。`StateMachineMachine`是状态机本身,维护当前状态并负责状态间的转换。
阅读全文