146 lines
4.0 KiB
C#
146 lines
4.0 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>FSMController
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns><3E><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>FSMController<65><72>ʶ<EFBFBD><CAB6>Intֵ</returns>
|
|||
|
|
public int CreateFSMController()
|
|||
|
|
{
|
|||
|
|
if(FSMMangerObject == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogError("FSM״̬<D7B4><CCAC><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
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>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>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("<22><>Id<49><64>FSMController<65><72><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>˳<EFBFBD>ָ<EFBFBD><D6B8>Controller<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="controllerId"></param>
|
|||
|
|
public void ExitAllStateInController(int controllerId)
|
|||
|
|
{
|
|||
|
|
if (controllers.TryGetValue(controllerId, out var controller))
|
|||
|
|
{
|
|||
|
|
controller.ExitAll();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.LogError("<22><>Id<49><64>FSMController<65><72><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="controllerId">״̬<D7B4><CCAC><EFBFBD>ص<EFBFBD>ControllerId</param>
|
|||
|
|
/// <param name="stateDateAction">״̬<D7B4><CCAC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public int CreateState(int controllerId, StateDateAction stateDateAction)
|
|||
|
|
{
|
|||
|
|
if (controllers.TryGetValue(controllerId, out var controller))
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>state<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ָ<EFBFBD><D6B8>controller<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SingleState state = new SingleState();
|
|||
|
|
state.stateDate = stateDateAction;
|
|||
|
|
controller.AddState(state);
|
|||
|
|
int id = nextStateId++;
|
|||
|
|
states[id] = state;
|
|||
|
|
return id;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.LogError("<22><>Id<49><64>FSMController<65><72><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD>٣<EFBFBD>״̬<D7B4><CCAC>ʼ<EFBFBD><CABC>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>״̬
|
|||
|
|
/// </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("<22><>Id<49><64>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>뿪ָ<EBBFAA><D6B8>״̬
|
|||
|
|
/// </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("<22><>Id<49><64>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>״̬
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="stateId"></param>
|
|||
|
|
public void DestroyState(int stateId)
|
|||
|
|
{
|
|||
|
|
if (states.TryGetValue(stateId, out var state))
|
|||
|
|
{
|
|||
|
|
states.Remove(stateId);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>״̬<D7B4><CCAC><EFBFBD>ӵ<EFBFBD>FSMController
|
|||
|
|
public void AddStateToController(int controllerId, int stateId)
|
|||
|
|
{
|
|||
|
|
if (controllers.TryGetValue(controllerId, out var controller) && states.TryGetValue(stateId, out var state))
|
|||
|
|
{
|
|||
|
|
controller.AddState(state);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|