来啦,补上IMGUI的Unity编辑器拓展最后一节,场景视图。
场景视图的拓展有两个基本方法,分别是方便的简单绘图方法OnDrawGizmos和更灵活的Editor子类的OnSceneGUI方法。

OnGizmos

OnGizmos函数直接写在需要进行拓展的脚本本身,与Start、Awake等生命周期函数没什么区别,非常方便;不过Gizmos能做的东西非常少,而且多少也有些降低代码可读性,就当是个偷懒的小工具好了。
编写OnGizmos主要用Gizmos类下的几个静态方法和属性,看看方法名就可以了解个大概。下面给个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;

public class Enemy : MonoBehaviour
{
[Tooltip("攻击范围")] [SerializeField] private float attackRange;
[Tooltip("是否可以攻击")] [SerializeField] private bool canAttack;
private void OnDrawGizmos()
{
if (canAttack) Gizmos.color = Color.green;
else Gizmos.color = Color.red;

Gizmos.DrawWireSphere(transform.position, attackRange);
}
}

Gizmos效果
你可以在Scene窗口右上角关掉指定脚本的Gizmos↑
Gizmos一般也就是用来画画圆、球、线之类的视图(甚至不能用来打文字标签),不适合做很复杂的拓展,更不能做可交互的GUI。有更多的需求的话可以选择下面的方法

OnSceneGUI(另外的OnGUI)

这种方法其实和第二节组件拓展是一样的,只是使用了不同的函数。下面创建一个SceneCanvas类,展示这种拓展的基本格式。

1
2
3
4
5
6
7
using UnityEngine;

public class SceneCanvas : MonoBehaviour
{

}
//拓展脚本本身不需要做什么处理

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(SceneCanvas))]
public class SceneCanvasEditor : Editor
{
private void OnSceneGUI()
{
SceneCanvas t = target as SceneCanvas; //拓展目标的实例
//拓展内容
}
//当然,有需要的话你可以同时加上OnInspectorGUI
}

OnSceneGUI的拓展主要靠Handles类,支持文字标签、更多复杂形状和可交互的UI。

拓展

关于Scene View拓展的一系列博客