编辑器扩展总结
工欲善其事必先利其器
引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。
开发版本: Unity 2018.1.3f1
相关博客传送门
一、编辑器开发入门
八、EditorPrefs、ScriptableObject、Undo
文章目录
- 编辑器扩展总结
- 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