Unity 3D 拓展编辑器 面板拓展

//--Inspector面板

脚本挂在游戏对象上时,右侧会出现它的详细信息面板,这些信息是根据脚本中声明的public可序列化变量而来的。

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(InspectorExpandTestScript))]
public class InspectorExpandTestEditorScript : Editor
{
    private bool m_EnableToogle;
    public override void OnInspectorGUI()
    {
        //--获取脚本对象
        InspectorExpandTestScript script = target as InspectorExpandTestScript;
        //--绘制滚动条
        script.scrollPos = EditorGUILayout.BeginScrollView(script.scrollPos);
        script.myName = EditorGUILayout.TextField("myName", script.myName);
        script.myId = EditorGUILayout.IntField("myId", script.myId);
        script.prefab = EditorGUILayout.ObjectField("prefab", script.prefab, typeof(GameObject), true) as GameObject;
        //--绘制按钮
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("btn1"))
        {
            Debug.Log("click btn1");
        }
        if (GUILayout.Button("btn2"))
        {
            Debug.Log("click btn2");
        }
        script.myEnum = (InspectorExpandTestScript.MyTestEnum)EditorGUILayout.EnumPopup("MyEnum", script.myEnum);
        EditorGUILayout.EndHorizontal();
        //--toogle组件
        m_EnableToogle = EditorGUILayout.BeginToggleGroup("EnableToogle", m_EnableToogle);
        script.toogle1 = EditorGUILayout.Toggle("toogle1", script.toogle1);
        script.toogle2 = EditorGUILayout.Toggle("toogle2", script.toogle2);
        EditorGUILayout.EndToggleGroup();
        EditorGUILayout.EndScrollView();
    }
}

如果需要拓展的面板比较复杂,建议分成两个文件存放,一个是脚本,一个是Editor脚本。

//-----------------------------------------------

//--EditorWindows窗口

log

using UnityEditor;
using UnityEngine;

public class EditorWindowsTestMyTools : EditorWindow
{
    [MenuItem("Window/OpenMyTestWindow")]
    static void Init()
    {
        EditorWindowsTestMyTools window = (EditorWindowsTestMyTools)EditorWindow.GetWindow(typeof(EditorWindowsTestMyTools));
        window.titleContent = new GUIContent("MyTestWindow");
        window.Show();
    }
    //private Texture m_MyTexture = null;
    private float m_MyFloat = 5.0f;
    private void Awake()
    {
        Debug.Log("Awake:窗口初始化时调用");
        //m_MyTexture = AssetDatabase.LoadAssetAtPath<Texture>("Assets/unity.png");
    }
    private void OnGUI()
    {
        Debug.Log("OnGUI");
        GUILayout.Label("Hello World!!!", EditorStyles.boldLabel);
        m_MyFloat = EditorGUILayout.Slider("myFloat", m_MyFloat, -5, 5);
        //GUI.DrawTexture(new Rect(0, 30, 100, 100), m_MyTexture);
    }
    private void OnDestroy()
    {
        Debug.Log("OnDestroy : 窗口销毁时调用");
    }
    private void OnFocus()
    {
        Debug.Log("OnFocus : 窗口拥有焦点时调用");
    }
    private void OnLostFocus()
    {
        Debug.Log("OnLostFocus : 窗口失去焦点时调用");
    }
    private void OnHierarchyChange()
    {
        Debug.Log("OnHierarchyChange : Hierarchy 视图发生改变时调用");
    }
    private void OnInspectorUpdate()
    {
        Debug.Log("OnInspectorUpdate : 每帧更新");
    }
    private void Update()
    {
        Debug.Log("Update : 每帧更新");
    }
    private void OnProjectChange()
    {
        Debug.Log("OnProjectChange : Project 视图发生改变时调用");
    }
    private void OnSelectionChange()
    {
        Debug.Log("OnSelectionChange : 在 Hierarchy 或者 Project 视图中选择一个对象时调用或对象变化时");
    }
}

//--------------------------------------------------------

//--EditorWindows 下拉菜单

using UnityEditor;
using UnityEngine;

public class EditorWindowsXiaLaMenuMyTools : EditorWindow, IHasCustomMenu
{
    public void AddItemsToMenu(GenericMenu menu)
    {
        menu.AddDisabledItem(new GUIContent("Disabled"));
        menu.AddItem(new GUIContent("test1"), true, () =>
        {
            Debug.Log("test1");
        });
        menu.AddItem(new GUIContent("test2"), false, () =>
          {
              Debug.Log("test2");
          });
        menu.AddSeparator("test/");
        menu.AddItem(new GUIContent("test/test3"), true, () =>
          {
              Debug.Log("test/test3");
          });
    }

    [MenuItem("Window/OpenMyEditorWindowsXiaLa")]
    static void EditorWindowsXiaLa()
    {
        EditorWindowsXiaLaMenuMyTools window = (EditorWindowsXiaLaMenuMyTools)GetWindow(typeof(EditorWindowsXiaLaMenuMyTools));
        window.titleContent = new GUIContent("WindowsXiaLa");
        window.Show();
    }
}

需要实现 IHasCustomMenu接口。通过AddItem()方法来添加列表元素。

//----------------------------------------------------

//--预览窗口

using UnityEditor;
using UnityEngine;

[CustomPreview(typeof(GameObject))]
public class GameObjectPreviewMyTools : ObjectPreview
{
    public override bool HasPreviewGUI()
    {
        return true;
    }

    public override void OnPreviewGUI(Rect r, GUIStyle background)
    {
        GUILayout.Label("GameObjectPreviewMyTools");
    }
}

原理就是继承 ObjectPreview 并且重写 HasPreviewGUI OnPreviewGUI方法,接着通过代码进行绘制。

[CustomPreview(typeof(GameObject))]中的gameobject 代表需要重新绘制的预览对象,也可以是别的系统对象或自定义的脚本对象。

//-----------------------------------------

//--获取预览信息

在自定义窗口中显示预览模型。

using UnityEditor;
using UnityEngine;

public class GetPreviewInfoMyTools : EditorWindow
{
    private GameObject m_MyGo;
    private Editor m_MyEditor;

    [MenuItem("Window/OpenMyPreviewInfo")]
    static void Init()
    {
        GetPreviewInfoMyTools window = (GetPreviewInfoMyTools)GetWindow(typeof(GetPreviewInfoMyTools));
        window.titleContent = new GUIContent("MyPreviewInfo");
        window.Show();
    }

    private void OnGUI()
    {
        m_MyGo = (GameObject)EditorGUILayout.ObjectField(m_MyGo, typeof(GameObject), true);
        if (m_MyGo != null)
        {
            if (m_MyEditor == null)
            {
                m_MyEditor = Editor.CreateEditor(m_MyGo);
            }
            m_MyEditor.OnPreviewGUI(GUILayoutUtility.GetRect(500, 500), EditorStyles.whiteLabel);
        }
    }
}

m_MyEditor.OnPreviewGUI()第二个参数,打开窗口会报错(DrawGUITexture: texture is null)但是不影响预览。

使用GUIStyle.none不会报错但是效果就不一样了。等解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值