using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace XFFSM
{
public class RuntimeFSMController : ScriptableObject
{
#if UNITY_EDITOR
///
/// 背景线的中心点坐标
///
[HideInInspector]
public Vector3 viewPosition = new Vector3(100,100,0);
[HideInInspector]
public Vector3 viewScale = Vector3.one * 0.8f;
///
/// 当前用户选择的状态机层级
///
[HideInInspector]
public List Layers = new List();
///
/// 实例化该对象的源文件的GUID
///
[HideInInspector]
public string originGUID;
public void AddLayer(string layer)
{
if(Layers.Contains(layer))
return;
Layers.Add(layer);
Save();
}
public void RemoveLayer(int index, int count)
{
Layers.RemoveRange(index, count);
Save();
}
///
/// 清空当前用户选择的状态层级
///
public void ClearLayer()
{
Layers.Clear();
Save();
}
#endif
///
/// 所有的状态
///
[HideInInspector]
public List states = new List();
///
/// 所有的参数
///
[HideInInspector]
public List parameters = new List();
///
/// 保存所有的过渡
///
[HideInInspector]
public List transitions = new List();
private Dictionary states_dic = new Dictionary ();
private Dictionary parameters_dic = new Dictionary();
private Dictionary default_states_dic = new Dictionary();
private Dictionary transitions_dic = new Dictionary();
public FSMStateNodeData GetStateNodeData(string name) {
if (name == null)
return null;
if (states_dic.Count == 0) {
foreach (FSMStateNodeData state in states)
{
if (states_dic.ContainsKey(state.name))
throw new System.Exception(string.Format("状态名称重复:{0}", state.name));
states_dic.Add (state.name, state);
}
}
if(states_dic.ContainsKey(name))
return states_dic[name];
return null;
}
public FSMParameterData GetParameterData(string name)
{
if(name == null)
return null;
if (parameters_dic.Count == 0) {
foreach (var item in parameters)
{
if (parameters_dic.ContainsKey(item.name))
throw new System.Exception(string.Format("参数名称重复:{0}", item.name));
parameters_dic.Add (item.name, item);
}
}
if(parameters_dic.ContainsKey(name))
return parameters_dic[name];
return null;
}
///
/// 获取某一个层级的默认状态
///
///
///
public FSMStateNodeData GetDefaultStateNodeData(string parent)
{
if (parent == null)
return null;
if (default_states_dic.Count == 0)
{
foreach (var item in states)
{
if (!item.defaultState) continue;
if (default_states_dic.ContainsKey(item.Parent))
throw new System.Exception(string.Format("检测到层级:{0}有多个默认状态!",item.Parent));
default_states_dic.Add(item.Parent, item);
}
}
if(default_states_dic.ContainsKey(parent))
return default_states_dic[parent];
return null;
}
public FSMTransitionData GetTransitionData(string from, string to) {
if (transitions_dic.Count == 0) {
foreach (var item in transitions)
{
transitions_dic.Add(item.Key, item);
}
}
string key = string.Format("{0}:{1}",from,to);
if(transitions_dic.ContainsKey(key))
return transitions_dic[key];
return null;
}
#if UNITY_EDITOR
private Dictionary> current_show_states = new Dictionary>();
private Dictionary> current_show_transitions = new Dictionary>();
public void AddState(FSMStateNodeData state) {
ClearCache();
states.Add(state);
Save();
}
public void RemoveState(FSMStateNodeData state)
{
ClearCache();
states.Remove(state);
Save();
}
public void AddParameters(FSMParameterData data) {
ClearCache();
parameters.Add(data);
Save();
}
public void RemoveParameters(FSMParameterData data) {
ClearCache();
parameters.Remove(data);
Save();
}
public void AddTransition(FSMTransitionData data) {
ClearCache();
transitions.Add(data);
Save();
}
public void RemoveTransition(FSMTransitionData data) {
ClearCache();
transitions.Remove(data);
Save();
}
public void ClearCache()
{
states_dic.Clear();
parameters_dic.Clear();
default_states_dic.Clear();
current_show_states.Clear();
current_show_transitions.Clear();
transitions_dic.Clear();
}
public List GetCurrentShowStateNodeData(string parent)
{
if (parent == null)
return null;
if (current_show_states.Count == 0)
{
foreach (var item in states)
{
if (current_show_states.ContainsKey(item.Parent))
{
current_show_states[item.Parent].Add(item);
}
else {
current_show_states.Add(item.Parent,new List { item });
}
}
}
if (current_show_states.ContainsKey(parent))
{
List current_show_state = current_show_states[parent];
if (current_show_state.Count == 0)
ClearLayer();
return current_show_state;
}
ClearLayer();
return null;
}
public List GetCurrentShowTransitionData(string parent)
{
if (parent == null)
return null;
if (current_show_transitions.Count == 0) {
foreach (var item in transitions)
{
FSMStateNodeData from = GetStateNodeData(item.fromStateName);
FSMStateNodeData to = GetStateNodeData(item.toStateName);
if (!from.Parent.Equals(to.Parent))
throw new System.Exception(string.Format("过渡的起始状态{0}和结束状态{1}不在同一个层级!",from.name,to.name));
if (current_show_transitions.ContainsKey(from.Parent))
current_show_transitions[from.Parent].Add(item);
else
current_show_transitions.Add(from.Parent, new List() { item});
}
}
if(current_show_transitions.ContainsKey(parent))
return current_show_transitions[parent];
return null;
}
#endif
public void Save() {
#if UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(this);
//UnityEditor.AssetDatabase.SaveAssets();
#endif
}
public void RefreshStateScripts()
{
#if UNITY_EDITOR
foreach (var state in states)
{
state.RefreshStateScripts(this);
}
#endif
}
#if UNITY_EDITOR
[InitializeOnLoadMethod]
static void RefreshAllStateScripts()
{
string[] controllers = AssetDatabase.FindAssets("t:RuntimeFSMController");
foreach (var item in controllers)
{
string path = AssetDatabase.GUIDToAssetPath(item);
RuntimeFSMController controller = AssetDatabase.LoadAssetAtPath(path);
controller.RefreshStateScripts();
}
}
#endif
}
}