unity自定义Scene窗口

unity自定义Scene窗口。Scene窗口添加按钮等,以下效果编辑器

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using UnityEngine.Tilemaps;
using UnityEditor.Experimental;
using System.Reflection;
using System;

public class SceneViewEx : SceneView
{
    [MenuItem("Test/SceneViewEx")]
    static void SceneViewExShow()
    {
        EditorWindow.GetWindow<SceneViewEx>().Show();

        Texture2D texture2D = InnerLoadGeneratedIconOrNormalIcon("SceneviewFx");


    }

   
    
    public override void OnEnable()
    {
        //getAttribute();
        //OnEnableTest();
        try
        {
            base.OnEnable();
        }
        catch
        {

        }
         
    }

    private void Awake()
    {
        AwakeInvoke();
        //getAttribute();
    }

    private void AwakeInvoke()
    {
        MethodInfo methodInfo = typeof(SceneView).GetMethod("Awake", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.CreateInstance);
        methodInfo.Invoke(this, null);
    }
    int mask;
    float v;
    Color color;
    AnimationCurve animationCurve;
    UnityEngine.Object gameObject;
    private void OnGUI()
    {
        OnGUIInvoke();
        WragUI();

    }
    private void WragUI()
    {
        value = EditorGUILayout.FloatField(value);
        EditorGUILayout.LabelField("文本");
        mask = EditorGUILayout.MaskField(new GUIContent { text = "测试" }, mask, new string[] { "test" });
        v = EditorGUILayout.Slider(v, 0, 1);
        color = EditorGUILayout.ColorField(new GUIContent { text = "颜色" }, color, true, true, true);
        animationCurve = EditorGUILayout.CurveField(animationCurve);
        EditorGUILayout.DropdownButton(new GUIContent { text = "DropdownButton" }, FocusType.Passive);
        gameObject= EditorGUILayout.ObjectField(gameObject,gameObject.GetType(),true);
    }
    float value;
    private void OnGUIInvoke()
    {
        MethodInfo methodInfo = typeof(SceneView).GetMethod("OnGUI", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.CreateInstance);
        methodInfo.Invoke(this, null);
        
    }
        private void getAttribute()
    {
       Attribute[] attributes = new List<Attribute>( typeof(SceneView).GetCustomAttributes()).ToArray();
 
        object[] attrs = typeof(SceneView).GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Type typeTemp =attr.GetType();
            CustomAttributeData[] dd=new List<CustomAttributeData>( attr.TypeId.GetType().CustomAttributes).ToArray();
            if (typeTemp.Name== "EditorWindowTitleAttribute")
            {
              PropertyInfo  propertyInfo = typeTemp.GetProperty("useTypeNameAsIconName");
              propertyInfo.SetValue(attr,true);
                PropertyInfo iconName = typeTemp.GetProperty("icon");
                iconName.SetValue(attr, "SceneviewFx");
            }
        }
    

    }

    public string title { get; set; }
    public string icon { get; set; }
    public bool useTypeNameAsIconName { get; set; }

    public override void OnDisable()
    {
        base.OnDisable();
    }

    public override void AddItemsToMenu(GenericMenu menu)
    {
        base.AddItemsToMenu(menu);
    }



    #region 测试代码

    private void OnEnableTest()
    {


        GUIContent m_Lighting = EditorGUIUtility.TrIconContent("SceneviewLighting", "When toggled on, the Scene lighting is used. When toggled off, a light attached to the Scene view camera is used.");
        GUIContent m_Fx = EditorGUIUtility.TrIconContent("SceneviewFx", "Toggle skybox, fog, and various other effects.");
        GUIContent m_AudioPlayContent = EditorGUIUtility.TrIconContent("SceneviewAudio", "Toggle audio on or off.");
        GUIContent m_GizmosContent = EditorGUIUtility.TrTextContent("Gizmos", "Toggle the visibility of different Gizmos in the Scene view.");
        GUIContent m_2DModeContent = EditorGUIUtility.TrTextContent("2D", "When togggled on, the Scene is in 2D view. When toggled off, the Scene is in 3D view.");
        GUIContent m_RenderDocContent = EditorGUIUtility.TrIconContent("renderdoc", "Capture the current view and open in RenderDoc.");

    }
    /// <summary>
    /// 加载编辑器图片
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    static Texture2D InnerLoadGeneratedIconOrNormalIcon(string name)
    {
        Texture2D tex = EditorGUIUtility.Load(EditorResources.generatedIconsPath + name + ".asset") as Texture2D;

        if (!tex)
        {
            tex = EditorGUIUtility.Load(EditorResources.iconsPath + name + ".png") as Texture2D;
        }
        if (!tex)
        {
            tex = EditorGUIUtility.Load(name) as Texture2D; // Allow users to specify their own project path to an icon (e.g see EditorWindowTitleAttribute)
        }

        return tex;
    }

    #endregion 测试代码
}