拓展編輯器(十一)_組件不可編輯
在Unity中,我們可以給組件設置狀態,比如無法編輯的狀態。以Transform組件為例,我們可以將Transform組件的原始功能禁掉。代碼如下:
using UnityEngine; using UnityEditor; using System.Reflection; [CustomEditor(typeof(Transform))] public class 組件不可編輯:Editor { private Editor m_Editor; private void OnEnable() { m_Editor = Editor.CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType( "UnityEditor.TransformInspector", true)); } public override void OnInspectorGUI() { if (GUILayout.Button("拓展按鈕上")) { } //開始禁止 GUI.enabled = false; m_Editor.OnInspectorGUI(); //禁止結束 GUI.enabled = true; if (GUILayout.Button("拓展按鈕下")) { } //base.OnInspectorGUI(); } }
同樣的,先使用反射獲取Transform組件,然後通過GUI.enabled=false方法將Transform組件禁用掉,這樣Transform組件將無法再編輯,效果如下:
此時Transform組件的原始功能被禁掉(灰色表示不可編輯),但是這並不影響我上下拓展的兩個按鈕。
那麽我們是否可以自己選擇是否禁掉這個組件呢,當然是可以的,代碼如下:
using UnityEngine;using UnityEditor; public class 組件不可編輯2 { [MenuItem("GameObject/3D Object/Lock/Lock", false, 0)] static void Lock() { if (Selection.gameObjects != null) { foreach (var gameObject in Selection.gameObjects) { gameObject.hideFlags = HideFlags.NotEditable; } } } [MenuItem("GameObject/3D Object/Lock/UnLock", false, 1)] static void UnLock() { if (Selection.gameObjects != null) { foreach (var gameObject in Selection.gameObjects) { gameObject.hideFlags = HideFlags.None; } } } }
效果如下:
此時我們可以選擇任意的遊戲對象,然後從右鍵菜單中選擇3D Object->Lock->Lock(鎖定)或者UnLock(解鎖)。它的原理就是設置遊戲對象的hideFlags。需要說明的是,我們不一定非要設置遊戲對象的hideFlags,也可以單獨給某個組件設置hideFlags,這樣只會影響到某一組件而非全部。
ps:HideFlags可以使用按位或(|)同時保持多個屬性,其含義都很好理解,大家可以自行輸入代碼調試一下
HideFlags.None 清除狀態
HideFlags.DontSave 設置對象不會被保存(僅編輯模式下使用,運行時剔除)
HideFlags.DontSaveInBuild 設置對象構建後不會被保存
HideFlags.DontUnloadUnuesdAsset 這只對象不會被Resources.UnloadUnusedAsset()卸載無用資源時卸掉
HideFlags.HideAndDontSave 設置對象隱藏,應且不會被保存
HideFlags.HideInHierarchy 設置對象在層次視圖中隱藏
HideFlags.HideInInspector 設置對象在控制面板視圖中隱藏
HideFlags.NotEditable 設置對象不可編輯
拓展編輯器(十一)_組件不可編輯