/// <summary> /// Draw sorting layer title GUI. /// </summary> /// <param name="toggle">Show renderers or not at last frame.</param> /// <param name="info">Sorting layer infomation.</param> /// <returns>Show renderers or not at this frame.</returns> bool DrawLayerTitle(bool toggle, SortingLayerInfo info) { Rect rect = GUILayoutUtility.GetRect(50f, 32f, GUILayout.ExpandWidth(true)); string text = info.name; Color bgColor = GUI.backgroundColor; foreach (Renderer renderer in _selectRenderer) { if (renderer != null) { string layerName = renderer.sortingLayerName; if (layerName == "") layerName = "Default"; if (layerName == info.name) { if (EditorGUIUtility.isProSkin) GUI.backgroundColor = new Color(0.4f, 0.7f, 0.9f); else GUI.backgroundColor = new Color(0.55f, 0.75f, 0.9f); GUI.Label(rect, "", style_layertitlelight); break; } } } if (EditorGUIUtility.isProSkin) { text = "<color=white><size=14>" + text + "</size></color>"; GUI.backgroundColor = new Color(0.5f, 0.5f, 0.5f); } else { text = "<color=black><size=14>" + text + "</size></color>"; GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f); } bool newToggle = GUI.Toggle(rect, toggle, text, style_layertitle); GUI.backgroundColor = bgColor; info.dropEventRect = rect; return newToggle; }
/// <summary> /// Scan all the scene hierarchy for sortable renderers. /// </summary> void OnInspectorUpdate() { _layerList.Clear(); // Get the sequence of all sorting layers. System.Type internalEditorUtilityType = typeof(InternalEditorUtility); PropertyInfo sortingLayersProperty = internalEditorUtilityType.GetProperty("sortingLayerNames", BindingFlags.Static | BindingFlags.NonPublic); string[] sortingLayerNames = (string[])sortingLayersProperty.GetValue(null, new object[0]); // Initialize sorting layer info. foreach (string name in sortingLayerNames) { SortingLayerInfo info = new SortingLayerInfo(); info.name = name; _layerList.Add(info); } // Find all sortable renderers, then sort them. Renderer[] rendererArray = UnityEngine.Object.FindObjectsOfType<Renderer>(); int defaultOrder = 0; foreach (Renderer renderer in rendererArray) { Material mat = renderer.sharedMaterial; if (mat != null && mat.renderQueue == 3000) { string sortingLayerName = renderer.sortingLayerName; if (sortingLayerName == string.Empty) sortingLayerName = "Default"; foreach (SortingLayerInfo layerInfo in _layerList) { if (layerInfo.name == sortingLayerName) { int index = 0; foreach (SortingRendererInfo sortedRendererInfo in layerInfo.rendererList) { if (renderer.sortingOrder <= sortedRendererInfo.order) break; index++; } SortingRendererInfo rendererInfo = new SortingRendererInfo(); rendererInfo.renderer = renderer; rendererInfo.order = renderer.sortingOrder; rendererInfo.defaultOrder = defaultOrder++; if (index == layerInfo.rendererList.Count) layerInfo.rendererList.Add(rendererInfo); else layerInfo.rendererList.Insert(index, rendererInfo); } } } } Repaint(); }