1. 程式人生 > >拓展編輯器(十一)_組件不可編輯

拓展編輯器(十一)_組件不可編輯

guilayout assembly nbsp select sse 技術 reac idea bject

  在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    設置對象不可編輯

    

拓展編輯器(十一)_組件不可編輯