【Unity】编辑器扩展-04-拓展Scene视图

【Unity】编辑器扩展-04-拓展Scene视图


辅助元素

借助Gizmo绘制

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

public class Script_12 : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position,Vector3.one);
        Gizmos.DrawCube(Vector3.one,Vector3.one);
    }
}

辅助UI

我们使用EditorGUI,可以方便的在视图中处理一些操作事件。

我们可以在Scene视图中绘制辅助UI,EditorGUI代码需在Handles.BeginGUI()Handles.EndGUI()之间绘制完成。

注意:编辑器绘制脚本如果存在多个只有第一个能够生效

[CustomEditor(typeof(Camera))]
public class Script_13 : Editor
{
    private void OnSceneGUI()
    {
        Camera camera = target as Camera;
        if (camera != null)
        {
            Handles.color = Color.red;
            Handles.Label(camera.transform.position,camera.transform.position.ToString());
            Handles.BeginGUI();
            GUI.backgroundColor = Color.red;
            if (GUILayout.Button("click", GUILayout.Width(200f)))
            {
                Debug.LogFormat("click = {0}",camera.name);
            }
            GUILayout.Label("Label");
            Handles.EndGUI();
        }
    }
}

常驻辅助UI

辅助UI需在选中对应的游戏对象才会显现,我们可以使得EditorGUI常驻显示在Scene视图中

将绘制函数绑定至委托duringSceneGui

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

public class Script_14
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        SceneView.duringSceneGui += delegate
        {
            Handles.BeginGUI();

            if (GUI.Button(new Rect(0, 0, 50, 20), "click"))
            {
                Debug.Log("常驻UI");
            }
            GUI.Label(new Rect(0, 20, 50, 25), "click-label");
            Handles.EndGUI();

        };
    }
}

禁用选中目标

FocusType.Passive表示禁止接收控制焦点,获取他的ID,将禁止点击事件穿透下去

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

public class Script_15 
{
    [InitializeOnLoadMethod]
    static void InitializeOnLoadMethod()
    {
        SceneView.duringSceneGui += delegate
        {
            Event e = Event.current;
            if (e != null)
            {
                int controlID = GUIUtility.GetControlID(FocusType.Passive);
                if(e.type == EventType.Layout)
                {
                    HandleUtility.AddDefaultControl(controlID);
                }
            }
        };
    }
}

另外一种方法:锁层

在这里插入图片描述

直接在Scene视图中选中目标很容易选中子节点,我们可以给他绑定一个[SelectionBase]标记,这样依赖该脚本下的所有节点都会定位到绑定这个标记的对象上

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

[SelectionBase]
public class RootScript : MonoBehaviour
{

}

猜你喜欢

转载自blog.csdn.net/qq_52324195/article/details/126049726