修改fsm

This commit is contained in:
2025-04-10 11:20:22 +08:00
parent 12f86c6eac
commit e3afd4acac
16 changed files with 229 additions and 403 deletions

View File

@@ -1,135 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Stary.Evo.FiniteStateMachine
{
public class FSMController : MonoBehaviour
{
private Dictionary<Type, SingleState> states = new Dictionary<Type, SingleState>();
public void AddState(SingleState state)
{
var type = state.GetType();
if (!states.ContainsKey(type))
{
// 添加时初始化
state.Machine = this;
state.OnInit();
states.Add(type, state);
}
else
{
Debug.LogError("该FSMController中已经添加过该状态");
}
}
/* //public bool IsRunning<T>() where T : SingleState => IsRunning(typeof(T));
//public void Enter<T>() where T : SingleState => Enter(typeof(T));
//public void Exit<T>() where T : SingleState => Exit(typeof(T));
//public void ForceEnter<T>() where T : SingleState => ForceEnter(typeof(T));*/
public bool IsRunning(Type type)
{
if (states.ContainsKey(type))
{
if (states[type].IsRunning) return true;
}
else
{
Debug.LogError("状态已不存在!!!");
}
return false;
}
public void Enter(Type type)
{
if (states.ContainsKey(type))
{
if (IsRunning(type))
{
Debug.LogError("该状态正在进行,无法再次进入!!!");
return;
}
ForceEnter(type);
}
else
{
Debug.LogError("状态已不存在!!!");
}
}
public void ForceEnter(Type type)
{
if (states.ContainsKey(type))
{
SingleState state = states[type];
state.OnEnter();
state.IsRunning = true;
}
else
{
Debug.LogError("状态已不存在!!!");
}
}
public void Exit(Type type)
{
if (states.TryGetValue(type, out SingleState state))
{
if (!IsRunning(type)) return;
state.IsRunning = false;
state.OnExit();
}
else
{
Debug.LogError("状态已不存在!!!");
}
}
public void ExitAll()
{
foreach (var state in states)
{
if (state.Value.IsRunning) Exit(state.Key);
}
}
private void Update()
{
foreach (var state in states)
{
if (state.Value.IsRunning) state.Value.Update();
}
}
private void FixedUpdate()
{
foreach (var state in states)
{
if (state.Value.IsRunning) state.Value.FixedUpdate();
}
}
private void OnDestroy()
{
ExitAll();
// 遍历字典中的每个状态
foreach (var key in states.Keys.ToList())
{
states[key].OnDestory();
// 将每个值设置为 null释放引用
states[key] = null;
}
// 清空字典
states.Clear();
}
}
}

View File

@@ -0,0 +1,93 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Stary.Evo.FiniteStateMachine
{
public interface IFSMController
{
void Initialize();
void AddState(IFSMIState state);
void RemoveState(IFSMIState state);
}
public abstract class FSMController : MonoBehaviour,IFSMController
{
private IFSMManager manager;
public void Start()
{
manager = new FSMManager();
Initialize();
}
public void AddState(IFSMIState state)
{
if (manager != null)
{
manager.AddState(state);
}
else
{
Debug.LogError("FSMManager未初始化");
}
}
public void RemoveState(IFSMIState state)
{
if (manager != null)
{
manager.RemoveState(state);
}
else
{
Debug.LogError("FSMManager未初始化");
}
}
/// <summary>
/// FSM在此类中初始化,进行状态的添加等操作
/// </summary>
public abstract void Initialize();
private void Update()
{
if (manager != null)
{
manager.CurState.Update();
}
else
{
Debug.LogError("FSMManager未初始化");
}
}
private void FixedUpdate()
{
if (manager != null)
{
manager.CurState.FixedUpdate();
}
else
{
Debug.LogError("FSMManager未初始化");
}
}
private void OnDestroy()
{
if (manager != null)
{
foreach (var state in manager. States)
{
state.Value.OnDestory();
}
}
else
{
Debug.LogError("FSMManager未初始化");
}
}
}
}