【unity游戏开发——编辑器扩展】Gizmos可视化辅助工具

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

前言

1、Gizmos 基础概念

Gizmos和Handles一样,是用来让我们拓展Scene窗口的。相对于Handles,Gizmos主要用于在 Scene 视图中绘制辅助图形(如线框、图标等),而Handles主要用于编辑器工具开发,创建可交互的控制手柄(如移动、旋转手柄)。

2、Gizmos相关的生命周期函数

在继承MonoBehaviour的脚本中实现以下生命周期函数,便可以在其中使用Gizmos来进行图形图像的绘制:

2.1 OnDrawGizmos()

在每帧调用,绘制的内容随时可以在Scene窗口中看见。

private void OnDrawGizmos()
{
    Debug.Log("OnDrawGizmos");
}

2.2 OnDrawGizmosSelected()

仅当脚本依附的GameObject被选中时才会每帧调用绘制相关内容。

private void OnDrawGizmosSelected()
{
    Debug.Log("OnDrawGizmosSelected");
}

3、基本设置

设置绘制颜色(支持透明度)

Gizmos.color = Color.red;

Gizmos.color = new Color(1, 0, 0, 0.5f);

一般它不会单独拿来使用,都会配合其他api绘制出不同颜色的辅助线

一、基本图形绘制

1、绘制立方体

1.1 绘制实体立方体

(1) 介绍
//实体立方体
Gizmos.DrawCube(中心点, 大小);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(transform.position, Vector3.one);
    }
}

效果
在这里插入图片描述

1.2 绘制线框立方体

(1) 主要API
//线框立方体
Gizmos.DrawWireCube(中心点, 大小);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(transform.position, new Vector3(2, 1, 3));
    }
}

效果
在这里插入图片描述

2、Gizmos绘制球体

2.1 绘制实体球体

(1) 主要API
Gizmos.DrawSphere(中心点, 半径);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawSphere(transform.position, 2);
    }
}

效果
在这里插入图片描述

2.2 绘制线框球体

(1) 主要API
Gizmos.DrawWireSphere(中心点, 半径);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(this.transform.position, 3);
    }
}

效果
在这里插入图片描述

3、绘制任意网格

3.1 绘制任意实体网格

(1) 主要API
Gizmos.DrawMesh(mesh, 位置, 角度);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    public Mesh mesh;
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        if (mesh != null) Gizmos.DrawMesh(mesh, transform.position, transform.rotation);
    }
}

效果
在这里插入图片描述

3.2 绘制任意线框网格

(1) 主要API
Gizmos.DrawWireMesh(mesh, 位置, 角度);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    public Mesh mesh;
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        if (mesh != null) Gizmos.DrawWireMesh(mesh, this.transform.position, this.transform.rotation);
    }
}

效果
在这里插入图片描述

4、绘制视锥体

(1) 主要API
Gizmos.DrawFrustum(绘制中心, FOV(Field of View,视野)角度, 远裁切平面, 近裁切平面, 屏幕长宽比);
(2) 示例
using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawFrustum(transform.position, 30, 50, 0.5f, 1.7f);
    }
}

效果
在这里插入图片描述

二、绘制内容跟随对象旋转

注意:因为Gizmos绘制图形是不能跟随对象旋转的,所以我们要自行处理

1、主要API

  • 修改Gizmos绘制前的矩阵

    Gizmos.matrix = Matrix4x4.TRS(位置, 角度, 缩放);
    
  • 还原矩阵

    Gizmos.matrix = Matrix4x4.identity
    

2、示例

using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        // 将绘制矩阵该为某个对象的,这样就可以跟着移动、旋转、缩放了
        Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one);

        // Gizmos绘制视锥
        Gizmos.color = Color.red;
        Gizmos.DrawFrustum(transform.position, 30, 50, 0.5f, 1.7f);

        // 将绘制矩阵还原,以下绘制的对象不会跟随旋转
        Gizmos.matrix = Matrix4x4.identity;
        
        // Gizmos绘制线框立方体
        Gizmos.color = Color.blue;
        Gizmos.DrawWireCube(transform.position, new Vector3(2, 1, 3));
    }
}

效果
在这里插入图片描述

三、绘制线段射线

1、绘制线段

1.1 主要API

Gizmos.DrawLine(起点, 终点);

1.2 示例

using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position, transform.position + Vector3.one);
    }
}

效果
在这里插入图片描述

2、绘制射线

2.1 主要API

Gizmos.DrawRay(起点, 方向);

2.2 示例

using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawRay(transform.position, transform.forward);
    }
}

效果
在这里插入图片描述

四、绘制贴图、图标

1、Gizmos绘制贴图

1.1 主要API

图片默认是反过来的

Gizmos.DrawGUITexture(new Rect(x, y, w, h), 图片信息);

1.2 示例

using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    public Texture texture;

    private void OnDrawGizmosSelected()
    {
        if (texture != null)
        {
            // 注意只能在xy跟随对象移动,在z轴移动不起作用
            Gizmos.DrawGUITexture(new Rect(transform.position.x, transform.position.y, 160, 90), texture);
        }
    }
}

效果
在这里插入图片描述

2、Gizmos绘制图标

2.1 主要API

图标需要放置在固定文件夹中 Assets/Gizmos/
在这里插入图片描述

Gizmos.DrawIcon(Vector3.up, “图标名”);

2.2 示例

using UnityEngine;

public class TestGizmosMono : MonoBehaviour
{
    private void OnDrawGizmosSelected()
    {
        Gizmos.DrawIcon(transform.position, "MyIcon");
    }
}

效果
在这里插入图片描述


专栏推荐

地址
【unity游戏开发入门到精通——C#篇】
【unity游戏开发入门到精通——unity通用篇】
【unity游戏开发入门到精通——unity3D篇】
【unity游戏开发入门到精通——unity2D篇】
【unity实战】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】
【unity游戏开发——模型篇】
【unity游戏开发——InputSystem】
【unity游戏开发——Animator动画】
【unity游戏开发——UGUI】
【unity游戏开发——联网篇】
【unity游戏开发——优化篇】
【unity游戏开发——shader篇】
【unity游戏开发——编辑器扩展】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向宇it

创作不易,感谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值