HierarchyToggleEditor.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using UnityEngine;
  2. using UnityEditor;
  3. using UnityEditor.SceneManagement;
  4. [InitializeOnLoad]
  5. public class HierarchyToggleEditor
  6. {
  7. static HierarchyToggleEditor()
  8. {
  9. // 注册 Hierarchy 窗口的绘制回调
  10. EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyWindowItemGUI;
  11. }
  12. private static void OnHierarchyWindowItemGUI(int instanceID, Rect selectionRect)
  13. {
  14. // 获取当前绘制的 GameObject
  15. GameObject obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
  16. if (obj == null) return;
  17. // 设置绘制区域(Hierarchy 左侧)
  18. Rect toggleRect = new Rect(selectionRect);
  19. toggleRect.x = 28; // 放置在左侧,靠近树状结构图标后方
  20. toggleRect.width = 20; // 按钮宽度
  21. toggleRect.height = EditorGUIUtility.singleLineHeight;
  22. // 自定义按钮样式
  23. GUIStyle toggleButtonStyle = new GUIStyle(GUI.skin.button) { fontSize = 10 };
  24. // 绘制启用/禁用按钮
  25. bool isActive = obj.activeSelf;
  26. if (GUI.Button(toggleRect, isActive ? "✔" : "✘", toggleButtonStyle))
  27. {
  28. // 记录 Undo 操作
  29. Undo.RecordObject(obj, isActive ? "Disable GameObject" : "Enable GameObject");
  30. obj.SetActive(!isActive);
  31. MarkDirty(obj);
  32. Debug.Log($"{(isActive ? "Disabled" : "Enabled")} GameObject {obj.name}");
  33. }
  34. }
  35. // 标记对象为脏,确保修改保存
  36. private static void MarkDirty(GameObject obj)
  37. {
  38. EditorUtility.SetDirty(obj);
  39. // 如果在预制件编辑模式中,保存预制件
  40. if (PrefabStageUtility.GetCurrentPrefabStage() != null)
  41. {
  42. var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
  43. if (prefabStage.prefabContentsRoot == obj || obj.transform.IsChildOf(prefabStage.prefabContentsRoot.transform))
  44. {
  45. PrefabUtility.SavePrefabAsset(prefabStage.prefabContentsRoot);
  46. Debug.Log($"Saved prefab changes for {prefabStage.prefabContentsRoot.name}");
  47. }
  48. }
  49. }
  50. }