前言
我们新建一个脚本来控制我们的Scene视图的拓展,这里注意我们的这个脚本不需要放在我们的Editor文件夹中,然后我们添加一个预处理指令来控制这个脚本在编辑器模式下运行。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestSceneOver : MonoBehaviour
{
//加上一个预处理指令,让他在编译器模型下运行
#if UNITY_EDITOR
private void OnDrawGizmos()
{
//绘制一条线
Gizmos.DrawLine(transform.position,transform.position+Vector3.up);
}
#endif
}
Gizmos拓展
Gizmos是Scene场景的可视化调试或辅助工具,接下来我们就拓展一下Gizmos的功能
上面我们选中游戏物体时就会绘制一条白线:
然后这里有两个函数,一个是选中时生效,一个是选不选中都生效:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TestSceneOver : MonoBehaviour
{
//加上一个预处理指令,让他在编译器模型下运行
#if UNITY_EDITOR
//选中时生效
private void OnDrawGizmosSelect()
{
//绘制一条线
Gizmos.DrawLine(transform.position, transform.position + Vector3.up);
}
//选不选中都生效
private void OnDrawGizmos()
{
//绘制一个球
Gizmos.color = new Color(0, 0, 0, 0.5f);
Gizmos.DrawSphere(transform.position, 1);
}
#endif
}
看下效果:
添加UI
如果我们想在场景内绘制UI,可以通过以下这种方式,需要Handles.BeginGUI()和Handles.EndGUI()这样一个操作,然后需要在指定的游戏对象上才会执行:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
/// <summary>
/// 只有游戏对象身上有这个组件的时候才会执行
/// </summary>
[CustomEditor(typeof(TestSceneOver))]
public class TestSceneGUI : Editor
{
//绘制场景中的GUI
private void OnSceneGUI()
{
Handles.BeginGUI();
//绘制我们的UI
if (GUILayout.Button("test1"))
{
Debug.Log(target.name);
}
Handles.EndGUI();
}
//private
}
效果如下:
常驻UI绘制
上述脚本需要在选中游戏对象时候会出现,现在我们需要在未选中的时候也显示出来我们可以这样1做:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
/// <summary>
/// 只有游戏对象身上有这个组件的时候才会执行
/// </summary>
[CustomEditor(typeof(TestSceneOver))]
public class TestSceneGUI : Editor
{
//绘制场景中的GUI
private void OnSceneGUI()
{
Handles.BeginGUI();
//绘制我们的UI
if (GUILayout.Button("test1",GUILayout.Width(100)))
{
Debug.Log(target.name);
}
Handles.EndGUI();
}
[InitializeOnLoadMethod]
static void InitialzeOnLoad()
{
//添加事件监听
SceneView.duringSceneGui += (SceneView) =>
{
Handles.BeginGUI();
if (GUILayout.Button("test2"))
{
Debug.Log("test2");
}
Handles.EndGUI();
};
}
}