编辑器扩展总结

工欲善其事必先利其器

引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。
开发版本: Unity 2018.1.3f1

相关博客传送门
一、编辑器开发入门

二、编辑器的相关特性

三、自定义Inspector面板

四、创建编辑器窗体

五、Gizmos辅助调试工具

六、扩展Scene视图

七、数组或list集合的显示方式

八、EditorPrefs、ScriptableObject、Undo

九、GUIStyle、GUISkin

十、AssetPostprocessor资源导入管线


文章目录

  • 编辑器扩展总结
  • Gizmos辅助调试工具
  • 通过OnDrawGizmo或者OnDrawGizmosSelected方法
  • 通过DrawGIzmos特性
  • 常用Gizmos的方法
  • 拓展:实现场景中一直显示主摄像机的视野范围
  • 参考资料


Gizmos辅助调试工具

Gizmos是Scene场景的可视化调试或辅助工具,可以通过两种方式实现。

通过OnDrawGizmo或者OnDrawGizmosSelected方法

OnDrawGizmos在每一帧都会被调用,其渲染的Gizmos是一直可见的,而OnDrawGizmosSelected是当物体被选中的时候才会显示。

public class GizmosExample : MonoBehaviour
{
    //绘制效果一直显示
    private void OnDrawGizmos()
    {
        var color = Gizmos.color;
        Gizmos.color = Color.white;
        Gizmos.DrawCube(transform.position, Vector3.one);
        Gizmos.color = color;
    }
    //绘制效果在选中对象时显示
    private void OnDrawGizmosSelected()
    {
        var color = Gizmos.color;
        Gizmos.color = Color.white;
        Gizmos.DrawWireCube(transform.position, Vector3.one);
        Gizmos.color = color;
    }
}

P.S. Gizmos.color作为全局的静态变量,为了防止这里的color修改会对其他地方的绘制造成影响,所以在绘制完Gizmos的时候,将Gizmos.color修改为原先的值。
OnDrawGizmo或者OnDrawGizmosSelected作为MonoBehaviour的方法,可以直接放在业务逻辑脚本中

通过DrawGIzmos特性

新建一个表示业务逻辑的类TargetExample,将其挂载在场景中的对象身上

using UnityEngine;
using UnityEditor;

public class GizmosTest
{
    //表示物体显示并且被选择的时候,绘制Gizmos
    [DrawGizmo(GizmoType.Active | GizmoType.Selected)]
    //第一个参数需要指定目标类,目标类需要挂载在场景对象中
    private static void MyCustomOnDrawGizmos(TargetExample target, GizmoType gizmoType)
    {
        var color = Gizmos.color;
        Gizmos.color = Color.white;
        //target为挂载该组件的对象
        Gizmos.DrawCube(target.transform.position, Vector3.one);
        Gizmos.color = color;
    }
}

P.S. 该方法需要将该类放在Editor文件夹内,使用特性的方法可以将业务逻辑和调试脚本分开。由于其针对的是编辑器组件的方法,需要设置为Static方法。

GizmosType

描述

Active

如果激活,则绘制

SelectedOrChild

如果被选择或者选择子物体时,则绘制

NotSelected

如果全没选择,则绘制

Selected

如果选择,则绘制

Pickable

在编辑器中gizmo可以被点选

常用Gizmos的方法

  • Gizmos.DrawCube() 绘制实体立方体
  • Gizmos.DrawWireCube() 绘制立方体边框
  • Gizmos.DrawRay() 绘制射线
  • Gizmos.DrawLine() 绘制直线
  • Gizmos.DrawIcon() 绘制Icon,Icon素材需要放在Gizmos文件夹中
  • Gizmos.DrawFrustum() 绘制摄像机视椎体的视野范围

拓展:实现场景中一直显示主摄像机的视野范围

private Camera mainCamera;

    private void OnDrawGizmos()
    {
        if(mainCamera == null)
            mainCamera = Camera.main;
        Gizmos.color = Color.green;
        //设置gizmos的矩阵   
        Gizmos.matrix = Matrix4x4.TRS(mainCamera.transform.position, mainCamera.transform.rotation, Vector3.one);
        Gizmos.DrawFrustum(Vector3.zero, mainCamera.fieldOfView, mainCamera.farClipPlane, mainCamera.nearClipPlane, mainCamera.aspect);
    }

参考资料

Unity中关于可视化辅助类Gizmos的使用

Unity之DrawGizmo