#if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace ETModel { /// /// ET组件可视化 /// public class ECSView : MonoBehaviour { #region Static Parts /// /// 组件与其对应可视化对象map /// private static DoubleMap _dic = new DoubleMap(); private static Transform root; /// /// 可视化对象根节点 /// private static Transform Root { get { if (root == null) { root = new GameObject("ETViewRoot").transform; DontDestroyOnLoad(root); } return root; } } private static Transform pool; /// /// 组件放入Pool的可视化根节点 /// private static Transform Pool { get { if (pool == null) { pool = new GameObject("Pool").transform; pool.parent = Root; } return pool; } } /// /// 创建组件的可视化节点 /// /// public static void CreateView(object self) { if (!Define.IsEditorMode) return; if (_dic.ContainsKey(self)) return; ECSView view = new GameObject(self.GetType().ToString()).AddComponent(); view.Component = self; _dic.Add(self, view); SetParent(self); } /// /// 销毁组件的可视化节点 /// /// public static void DestroyView(object self) { if (!Define.IsEditorMode) return; if (_dic.ContainsKey(self)) { ECSView view = _dic.GetValueByKey(self); if (view != null) DestroyImmediate(view.gameObject); _dic.RemoveByKey(self); } } /// /// 根据组件获取可视化节点 /// /// /// public static ECSView GetView(object self) { if (!Define.IsEditorMode) return null; if (_dic.ContainsKey(self)) return _dic.GetValueByKey(self); return null; } /// /// 根据可视化节点获取其组件 /// /// /// public static object GetComponent(ECSView self) { if (!Define.IsEditorMode) return null; if (_dic.ContainsValue(self)) return _dic.GetKeyByValue(self); return null; } /// /// 放入Pool操作,修改可视化节点到Pool节点下 /// /// public static void ReturnPool(object self) { if (!Define.IsEditorMode) return; if (self == null) return; ECSView selfView = GetView(self); if (selfView == null) { _dic.RemoveByKey(self); return; } selfView.transform.parent = Pool; } /// /// 设置可视化父对象 /// /// /// public static void SetParent(object self, object parent = null) { if (!Define.IsEditorMode) return; if (self == null) return; ECSView selfView = GetView(self); if (selfView == null) { _dic.RemoveByKey(self); return; } ECSView parentView = GetView(parent); if (parentView != null) selfView.transform.parent = parentView.transform; else selfView.transform.parent = Root; } #endregion /// /// 该可视化节点对应的组件,对其属性显示到Inspector视图内 /// public object Component; } #if UNITY_EDITOR [InitializeOnLoad] public class MyHierarchyEditor { static MyHierarchyEditor() { EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyWindowItemOnGUI; } private static void OnHierarchyWindowItemOnGUI(int instanceID, Rect selectionRect) { GameObject obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject; if (obj == null) return; if (obj.GetComponent() != null) { GUIStyle style = new GUIStyle(){ padding ={ left =EditorStyles.label.padding.left-1, top = EditorStyles.label.padding.top }, normal ={ textColor =Color.red } }; GUI.Box(selectionRect, GUIContent.none); GUI.Label(selectionRect, obj.name, style); } } } #endif }