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