unity编辑器扩展

Unity 编辑器扩展四 Gizmos辅助调试工具

2021-12-09  本文已影响0人  合肥黑

参考
Unity Editor 基础篇(五):Gizmos
【Unity 编辑器】扩展总结五:Gizmos辅助调试工具

Gizmos是用于在Scene场景视图中,可视化调试或辅助设置用的。所有Gizmo绘制需要在以下两个函数里完成:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyGizmos : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        Debug.Log("invocation in every frame");
    }

    private void OnDrawGizmosSelected()
    {
        Debug.Log("you click on me!");
    }
}

将以上脚本挂到物体上,把鼠标放在Scene场景里,就能看到打印信息了。

一、Draw系列API
1.DrawWireSphere
    public float areaRadius;
    private void OnDrawGizmos()
    {
        //绘制线框球体
        Gizmos.DrawWireSphere(transform.position,areaRadius);
        Debug.Log("invocation in every frame");
    }
image.png
2.DrawLine
    public float areaRadius;
    public float size;
    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position,areaRadius);
        Gizmos.DrawLine(transform.position,transform.position+transform.forward*size);
        Debug.Log("invocation in every frame");
    }
3.Mathf.Repeat

参考unity笔记3 - Mathf.Repeat and Mathf.PingPong

public static float Repeat(float t,float length); 
循环值t,使输出不会大于等于length,也不会小于0。
        //输入 012345678
        //输出 012012012
        for (int i = 0; i < 9; i++)
        {
            Debug.Log(Mathf.Repeat(i,3));
        }

其实跟取模(%)的结果一样,但是取模的结果会有负数,Repeat的结果只会是整数

4.DrawSphere
    public float areaRadius;
    public float size;
    public Vector3[] nodePoints;
    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position,areaRadius);

        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position,transform.position+transform.forward*size);

        Gizmos.color = Color.blue;
        for (int i=0;i < nodePoints.Length;i ++)
        {
            Gizmos.DrawSphere(nodePoints[i], 0.5f);
        }

        for (int i = 0; i < nodePoints.Length;i++)
        {
            Gizmos.DrawLine(nodePoints[i],
                nodePoints[(int)Mathf.Repeat(i+1,nodePoints.Length)]);
        }
    }
image.png

Gizmos.color作为全局的静态变量,为了防止这里的color修改会对其他地方的绘制造成影响,所以在绘制完Gizmos的时候,将Gizmos.color修改为原先的值。

    private void OnDrawGizmosSelected()
    {
        var color = Gizmos.color;
        Gizmos.color = Color.white;
        Gizmos.DrawWireCube(transform.position, Vector3.one);
        Gizmos.color = color;
    }
5.DrawIcon
Gizmos.DrawIcon(transform.position, "icon.png");

在Assets/Gizmos路径下放一个icon.png图片,就能在场景中看到


image.png
6.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);
    }
二、DrawGIzmos标签

在Scripts文件夹下新建一个表示业务逻辑的类TargetExample,将其挂载在场景中的对象身上。
在Editor文件夹内新建MyCustomOnDrawGizmos

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;
    }
}

image.png
private static void MyCustomOnDrawGizmos(TargetExample target, GizmoType gizmoType)

这里指定了TargetExample 类型对象,由于其针对的是编辑器组件的方法,需要设置为Static方法。
GizmosType 描述

上一篇下一篇

猜你喜欢

热点阅读