拓展编辑器(十一)_组件不可编辑

  在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    设置对象不可编辑

     

猜你喜欢

转载自www.cnblogs.com/llllllvty/p/9898123.html