using System.Collections; using System.Collections.Generic; using UnityEngine; using YKMoon; using UnityEditor; namespace YKMoonEditor { public class SortingLayerSettingWindow : UEditorWindowBase { [MenuItem("YKTools/SortingLayer设置工具")] public static void Init() { var window = GetWindow(); window.titleContent = new GUIContent("SortingLayer设置工具"); window.Show(); } private bool isRendererDirty; private bool isObjectDirty; private GameObject prefabObject; private GameObject selectedObject; private int selectedSortingLayerID = 0; private int selectedOrderInSortingLayer = 0; private Vector2 scrollPos_renders; private GameObject gameObjectToModify => selectedObject; private bool IsPrefab() { return UEditorUtility.GameObjectIsPrefab(selectedObject); } private void OnDisable() { if(prefabObject != null) { PrefabUtility.UnloadPrefabContents(prefabObject); } } private void OnValidate() { isRendererDirty = true; isObjectDirty = true; Repaint(); } private void OnGUI() { bool needSave = false; DrawFoldoutHeaderGroup("Title", true, new GUIContent("GameObject"), () => { EditorGUI.indentLevel += 1; var newObj = EditorGUILayout.ObjectField(new GUIContent("拖放GameObject"), selectedObject, typeof(GameObject), true) as GameObject; if(newObj != selectedObject) { selectedObject = newObj; isObjectDirty = true; isRendererDirty = true; } if(IsPrefab()) { string path = AssetDatabase.GetAssetPath(selectedObject); EditorGUILayout.LabelField(new GUIContent("Prefab路径:"), new GUIContent(path)); if(isObjectDirty) { if(prefabObject != null) { PrefabUtility.UnloadPrefabContents(prefabObject); } prefabObject = PrefabUtility.LoadPrefabContents(path); isObjectDirty = false; } } EditorGUI.indentLevel -= 1; }); DrawFoldoutHeaderGroup("Controller", true, new GUIContent("控件参数"), () => { EditorGUI.indentLevel += 1; scrollPos_renders = EditorGUILayout.BeginScrollView(scrollPos_renders); { if(isRendererDirty) { if(IsPrefab()) { renderers = GetRendererScripts(prefabObject); } else { renderers = GetRendererScripts(selectedObject); } isRendererDirty = false; } foreach(var renderpair in renderers) { var path = renderpair.Key; foreach(Renderer renderer in renderpair.Value) { needSave |= DrawRendererProperty(path, renderer as Renderer); } } } EditorGUILayout.EndScrollView(); EditorGUI.indentLevel -= 1; }); DrawFoldoutHeaderGroup("Common", true, new GUIContent("统一设置"), () => { EditorGUI.indentLevel += 1; GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); { selectedSortingLayerID = UEditorGUILayout.DrawSortingLayerPopup(new GUIContent("SotingLayerID"), selectedSortingLayerID); selectedOrderInSortingLayer = EditorGUILayout.IntField(new GUIContent("OrderInLayer"), selectedOrderInSortingLayer); } GUILayout.EndVertical(); if(GUILayout.Button("全部更改")) { ChangeAll(selectedSortingLayerID, selectedOrderInSortingLayer); needSave = true; } GUILayout.EndHorizontal(); EditorGUI.indentLevel -= 1; }); if(needSave) { if(selectedObject != null) { if(IsPrefab()) { string path = AssetDatabase.GetAssetPath(selectedObject); PrefabUtility.SaveAsPrefabAsset(prefabObject, path); } } needSave = false; } GUILayout.Space(30); } private void ChangeAll(int layerID, int order) { foreach(var list in renderers.Values) { foreach(Renderer renderer in list) { renderer.sortingLayerID = layerID; renderer.sortingOrder = order; } } } private bool DrawRendererProperty(string path, Renderer renderer) { bool needApply = false; GUILayout.BeginHorizontal(); EditorGUILayout.LabelField(new GUIContent(path)); if(GUILayout.Button("选择")) { Selection.activeTransform = renderer.transform; EditorGUIUtility.PingObject(Selection.activeObject); } EditorGUILayout.LabelField(string.Format("({0})", renderer.GetType())); { int value = UEditorGUILayout.DrawSortingLayerPopup(new GUIContent("SotingLayerID"), renderer.sortingLayerID); if(renderer.sortingLayerID != value) { needApply = true; renderer.sortingLayerID = value; } } { int value = EditorGUILayout.IntField(new GUIContent("OrderInLayer"), renderer.sortingOrder); if(renderer.sortingOrder != value) { needApply = true; renderer.sortingOrder = value; } } GUILayout.EndHorizontal(); return needApply; } #region GetRenderers Dictionary> renderers = new Dictionary>(); private Dictionary> GetRendererScripts(GameObject obj) { Dictionary> result = new Dictionary>(); if(obj != null) { var renders = obj.GetComponentsInChildren(); foreach(var render in renders) { var path = YKTransformUtility.GetChildPath(obj, render.gameObject); if(!result.ContainsKey(path)) { result.Add(path, new List()); } if(!result[path].Contains(render)) { result[path].Add(render); } } } return result; } #endregion GetRenderers } }