VirtualFramework/Assets/Scripts/Controller/StateMachineController.cs
2024-12-14 18:27:59 +08:00

123 lines
3.5 KiB
C#
Raw Blame History

using QFramework;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;
using XMLTool;
public class StateMachineController : MonoSingleton<StateMachineController>
{
public class FsmInfo
{
public FSM<string> fsm;
public List<Transision> transisions = new List<Transision>();
}
public class Transision
{
public string from;
public string to;
public ICondition condition;
}
Dictionary<string, FsmInfo> FSMDitc = new Dictionary<string, FsmInfo>();
public bool isRun = false;
public override void OnSingletonInit()
{
base.OnSingletonInit();
TypeEventSystem.Global.Register<OnModuleStart>(OnStart).UnRegisterWhenGameObjectDestroyed(gameObject);
TypeEventSystem.Global.Register<OnModuleQuit>(OnQuit).UnRegisterWhenGameObjectDestroyed(gameObject);
}
private void OnQuit(OnModuleQuit quit)
{
isRun = false;
FSMDitc.Clear();
}
private void OnStart(OnModuleStart start)
{
foreach (var item in Global.Instance.appData.Modules[0].FSM)
{
FSM<string> fsm = new FSM<string>();
var fsmInfo = new FsmInfo();
string firstState = string.Empty;
foreach (var state in item.Value.StateDict)
{
if (string.IsNullOrEmpty(firstState))
{
firstState = state.Key;
}
IAction enterAct = null;
IAction exitAct = null;
fsm.State(state.Key).OnEnter(() =>
{
if (state.Value.Enter != null)
{
enterAct = ActionHelper.GetActionAndSub(state.Value.Enter.Action);
enterAct?.Start(this);
}
}).OnExit(() =>
{
if (enterAct != null)
{
enterAct.Deinit();
}
if (state.Value.Exit != null)
{
exitAct = ActionHelper.GetActionAndSub(state.Value.Exit.Action);
exitAct?.Start(this);
}
});
}
foreach (var transision in item.Value.Transisions)
{
var trans = new Transision();
trans.to = transision.To;
trans.from = transision.From;
trans.condition = ActionHelper.GetCondition(transision.Action);
fsmInfo.transisions.Add(trans);
}
fsmInfo.fsm = fsm;
fsmInfo.fsm.StartState(firstState);
if (FSMDitc.ContainsKey(item.Key)==false)
{
FSMDitc.Add(item.Key, fsmInfo);
}
else
{
Debug.LogError("״̬<D7B4><CCAC>name<6D>ظ<EFBFBD>");
}
}
isRun = true;
}
private void Update()
{
if (isRun)
{
foreach (var item in FSMDitc)
{
var curState = item.Value.fsm.CurrentStateId;
foreach (var trans in item.Value.transisions)
{
if (trans.from == "any" || trans.from == item.Value.fsm.CurrentStateId)
{
if (trans.condition.Check())
{
item.Value.fsm.ChangeState(trans.to);
}
}
}
}
}
}
}