Editor编辑器扩展在Scene View添加按钮和logo

最近发现一个不得了的lego项目,

可以很简单的做出,马里奥64位那样的横版3D过关游戏

其实这个项目也在unity官方模板出现很久了,只是一直在深山修炼,孤陋寡闻

看了这个项目的logo很是喜欢

那么我们今天就来做一个

1)首先就是继承Editor Window

2)然后这样。。。。。。。。是不行的

 3)原来要Editor。OnSceneUI,但我们还是直接用更内核的。 SceneView

    void OnEnable()
    {
        SceneView.duringSceneGui += SceneGUI;
        
    }
    
    void OnDisable()
    {
        SceneView.duringSceneGui -= SceneGUI;
    }

4,一开始scenView 不好用,后来发现小哥的文章获得答案(下面参考链接)

一开始小哥也是用错的,各种Canvas GUIContent方案尝试,后来他成功了

    void SceneGUI(SceneView view)
    {
        //错的
        if (GUILayout.Button("fdsafadsf"))
        {
            
        }
        //还是错的
        GUI.Button(new Rect(10,10,100,100),"11111111");
    }

5)

    // 绑定duringSceneGui等代码略,详见github工程
    private void SceneGUI(SceneView view)
    {
        Handles.BeginGUI();

6) 哦,对了,后来用回,继承Editor,的OnSceneGUI,根本没成功。。。。。

不知道是不是新版本Unity2020 的问题

7)最终完整代码

SceneView 的GUI,只是和普通 OnGui()略有不同,GUILayout, EditorGUILayout这些帮助类,只能少用了

// copyright (c) by [email protected]

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class LolToolsWindows : EditorWindow
{
    [MenuItem("Tools/Lol/Animation Window")]
    public static  void ShowWnd()
    {
        GetWindow<LolToolsWindows>().Show();
    }

    void OnEnable()
    {
        SceneView.duringSceneGui += SceneGUI;
        
    }

    private void OnGUI()
    {
        if (GUILayout.Button(("创建 Animation in Scene")))
        {
            var go = GameObject.Find("LolSceneView");
            if (go == null)
            {
                go = new GameObject("LolSceneView");
            }

            if (go.GetComponent<LolSceneMono>() == false)
            {
                go.AddComponent<LolSceneMono>();
            }

            Selection.activeObject = go;
        }
    }

    void OnDisable()
    {
        SceneView.duringSceneGui -= SceneGUI;
    }

    void SceneGUI(SceneView view)
    {
        //c参考:https://zhuanlan.zhihu.com/p/124269658
        Handles.BeginGUI();
        GUILayout.BeginArea(view.position); // 规定显示区域为屏幕大小
        if (GUILayout.Button("fdsafadsf"))
        {
            
        }
        GUI.Button(new Rect(10,10,100,100),"11111111");
        
        GUILayout.EndArea();
        Handles.EndGUI();
    }
    
    
}


参考:

unity Scene View扩展之显示常驻GUI - 知乎

猜你喜欢

转载自blog.csdn.net/avi9111/article/details/125572859