【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
{

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值