/// <summary> /// Draw all content of sortable a renderer. /// </summary> /// <param name="rect">The content rect for this renderer.</param> /// <param name="info">The renderer information.</param> /// <param name="select">The renderer is selected or not.</param> /// <param name="primary">The renderer is primary operation object or not.</param> /// <param name="warn">The renderer is warned or not.</param> void DrawRendererContent(Rect rect, SortingRendererInfo info, bool select, bool primary, bool warn) { info.leftEventRect = new Rect(rect.x, rect.y, 76f, rect.height); info.rightEventRect = new Rect(rect.x + 80f, rect.y, rect.width, rect.height); Color bgColor = GUI.backgroundColor; if (select) { if (EditorGUIUtility.isProSkin) GUI.backgroundColor = new Color(0.3f, 0.6f, 0.8f); else GUI.backgroundColor = new Color(0.6f, 0.85f, 1.0f); GUI.Label(new Rect(rect.x, rect.y, 76f, rect.height), "", style_contentbg0); GUI.Label(new Rect(rect.x + 80f, rect.y, rect.width - 162f, rect.height), "", style_contentbg1); GUI.Label(new Rect(rect.x + rect.width - 78f, rect.y, 78f, rect.height), "", style_contentbg1); } else { if (EditorGUIUtility.isProSkin) GUI.backgroundColor = new Color(0.35f, 0.35f, 0.35f); else GUI.backgroundColor = new Color(1.0f, 1.0f, 1.0f); GUI.Label(new Rect(rect.x, rect.y, 76f, rect.height), "", style_contentbg0); GUI.Label(new Rect(rect.x + 80f, rect.y, rect.width - 162f, rect.height), "", style_contentbg1); GUI.Label(new Rect(rect.x + rect.width - 78f, rect.y, 78f, rect.height), "", style_contentbg1); } GUI.backgroundColor = bgColor; Color ctColor = GUI.contentColor; if (EditorGUIUtility.isProSkin) GUI.contentColor = new Color(0.5f, 0.5f, 0.5f); else GUI.contentColor = new Color(0.8f, 0.8f, 0.8f); GUI.Label(new Rect(rect.x - 3f, rect.y, 22f, rect.height - 4f), TextureResources.verticalMoveIcon, style_contentlabel); GUI.contentColor = ctColor; if (info.renderer == _editSelectRenderer) { GUI.changed = false; int tempOrder = EditorGUI.IntField(new Rect(rect.x + 13f, rect.y + 1f, 47f, rect.height - 8f), info.order); tempOrder = Mathf.Clamp(tempOrder, -32768, 32767); if (GUI.changed && info.order != tempOrder) { Undo.RecordObject(info.renderer, "Sorting Order Change"); info.renderer.sortingOrder = tempOrder; SceneView.RepaintAll(); } } else { EditorGUIUtility.AddCursorRect(new Rect(rect.x, rect.y, 76f, rect.height), MouseCursor.ResizeVertical); GUI.Label(new Rect(rect.x + 14f, rect.y + 1f, 48f, rect.height - 4f), info.renderer.sortingOrder.ToString(), style_contentlabel); } if (warn) { GUI.Label(new Rect(rect.x + 60f, rect.y, 22f, rect.height - 4f), _warnContent, style_contentlabel); } Texture rendererIcon; System.Type rendererType = info.renderer.GetType(); if (rendererType != typeof(ParticleSystemRenderer)) rendererIcon = EditorGUIUtility.ObjectContent(null, rendererType).image; else rendererIcon = EditorGUIUtility.ObjectContent(null, typeof(ParticleSystem)).image; GUI.Label(new Rect(rect.x + 82, rect.y, 22f, rect.height - 4f), rendererIcon, style_contentlabel); string text = info.renderer.name; if (_fullPath) { Transform transform = info.renderer.transform; while (transform.parent != null) { text = transform.parent.name + "/" + text; transform = transform.parent; } } GUI.Label(new Rect(rect.x + 94, rect.y, rect.width - 178f, rect.height), " " + text, style_contentlabel); bool tempCheck = false; GUI.changed = false; tempCheck = GUI.Toggle(new Rect(rect.x + rect.width - 72f, rect.y, 80f, rect.height - 6f), info.renderer.enabled, info.renderer.enabled? "Enable":"Disable", style_contenttoggle); if (GUI.changed && tempCheck != info.renderer.enabled) { if (!_selectRenderer.Contains(info.renderer)) { Undo.RecordObject(info.renderer, "Renderer Enabled Change"); info.renderer.enabled = tempCheck; } else { foreach (Renderer renderer in _selectRenderer) { if (renderer != null) { Undo.RecordObject(renderer, "Renderer Enabled Change"); renderer.enabled = tempCheck; } } } } }
/// <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(); }