状态机工具1.0.1

This commit is contained in:
Han
2025-03-31 11:23:20 +08:00
parent 815435ac6f
commit 0b0892545a
21 changed files with 460 additions and 476 deletions

View File

@@ -0,0 +1,50 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Stary.Evo.FiniteStateMachine
{
public static class FSMInitialize
{
/// <summary>
/// 状态机初始化
/// </summary>
/// <param name="targetScene">指定场景</param>
/// <returns></returns>
public static FSMManager Init(Scene targetScene)
{
GameObject targetObject = targetScene.GetRootGameObjects().FirstOrDefault(go => go.name == "FSMManger");
FSMManager fSMManager;
if (targetObject == null)
{
targetObject = new GameObject("FSMManger");
SceneManager.MoveGameObjectToScene(targetObject, targetScene);
fSMManager = new FSMManager();
fSMManager.FSMMangerObject = targetObject;
void OnSceneUnloaded(Scene scene)
{
// 当场景卸载时释放缓存
if (scene.name == targetScene.name)
{
GameObject.Destroy(targetObject);
fSMManager = null;
}
}
SceneManager.sceneUnloaded += OnSceneUnloaded;
return fSMManager;
}
else
{
Debug.LogError("场景: " + targetScene.name + "已经初始化过FSM状态机");
return null;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b42c8b9ea04cabf4d96cb64afb21a797
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,150 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Stary.Evo.FiniteStateMachine
{
public class FSMManager
{
public GameObject FSMMangerObject;
private Dictionary<int, FSMController> controllers = new Dictionary<int, FSMController>();
private Dictionary<int, SingleState> states = new Dictionary<int, SingleState>();
private int nextControllerId = 0;
private int nextStateId = 0;
/// <summary>
/// 创建FSMController
/// </summary>
/// <returns>返回创建的FSMController的识别Int值</returns>
public int CreateFSMController()
{
if (FSMMangerObject == null)
{
Debug.LogError("FSM状态机还未初始化");
return -1;
}
else
{
int id = nextControllerId++;
GameObject newController = new GameObject("FSMController" + id);
newController.transform.SetParent(FSMMangerObject.transform);
var controller = newController.AddComponent<FSMController>();
controllers[id] = controller;
return id;
}
}
/// <summary>
/// 销毁指定FSMController
/// </summary>
/// <param name="controllerId"></param>
public void DestroyFSMController(int controllerId)
{
if (controllers.TryGetValue(controllerId, out var controller))
{
GameObject.Destroy(controller.gameObject);
controllers.Remove(controllerId);
}
else
{
Debug.LogError("该Id的FSMController不存在或已被销毁");
}
}
/// <summary>
/// 退出指定Controller中的所有状态
/// </summary>
/// <param name="controllerId"></param>
public void ExitAllStateInController(int controllerId)
{
if (controllers.TryGetValue(controllerId, out var controller))
{
controller.ExitAll();
}
else
{
Debug.LogError("该Id的FSMController不存在或已被销毁");
}
}
/// <summary>
/// 创建状态
/// </summary>
/// <param name="controllerId">状态挂载的ControllerId</param>
/// <param name="stateDateAction">状态行为数据</param>
/// <returns></returns>
public int CreateState(int controllerId, StateDateAction stateDateAction)
{
if (controllers.TryGetValue(controllerId, out var controller))
{
// 创建state并将其添加到指定controller生命周期中
SingleState state = new SingleState();
state.stateDate = stateDateAction;
controller.AddState(state);
int id = nextStateId++;
states[id] = state;
return id;
}
else
{
Debug.LogError("该Id的FSMController不存在或已被销毁状态初始化失败");
return -1;
}
}
/// <summary>
/// 进入指定状态
/// </summary>
/// <param name="stateId"></param>
public void EnterState(int stateId)
{
if (states.TryGetValue(stateId, out var state))
{
state.Machine.Enter(state.GetType());
}
else
{
Debug.LogError("该Id的状态不存在");
}
}
/// <summary>
/// 离开指定状态
/// </summary>
/// <param name="stateId"></param>
public void ExitState(int stateId)
{
if (states.TryGetValue(stateId, out var state))
{
state.Machine.Exit(state.GetType());
}
else
{
Debug.LogError("该Id的状态不存在");
}
}
/// <summary>
/// 销毁指定状态
/// </summary>
/// <param name="stateId"></param>
public void DestroyState(int stateId)
{
if (states.TryGetValue(stateId, out var state))
{
states.Remove(stateId);
}
}
// 将状态添加到FSMController
public void AddStateToController(int controllerId, int stateId)
{
if (controllers.TryGetValue(controllerId, out var controller) && states.TryGetValue(stateId, out var state))
{
controller.AddState(state);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5ac80573cd6d59246a7fe1b954f1b57e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: