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 } }