当前位置: 首页 > web >正文

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

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

文章目录

  • 前言
    • 1、Gizmos 基础概念
    • 2、Gizmos相关的生命周期函数
      • 2.1 OnDrawGizmos()
      • 2.2 OnDrawGizmosSelected()
    • 3、基本设置
      • 设置绘制颜色(支持透明度)
  • 一、基本图形绘制
    • 1、绘制立方体
      • 1.1 绘制实体立方体
        • (1) 介绍
        • (2) 示例
      • 1.2 绘制线框立方体
        • (1) 主要API
        • (2) 示例
    • 2、Gizmos绘制球体
      • 2.1 绘制实体球体
        • (1) 主要API
        • (2) 示例
      • 2.2 绘制线框球体
        • (1) 主要API
        • (2) 示例
    • 3、绘制任意网格
      • 3.1 绘制任意实体网格
        • (1) 主要API
        • (2) 示例
      • 3.2 绘制任意线框网格
        • (1) 主要API
        • (2) 示例
    • 4、绘制视锥体
        • (1) 主要API
        • (2) 示例
  • 二、绘制内容跟随对象旋转
    • 1、主要API
    • 2、示例
  • 三、绘制线段射线
    • 1、绘制线段
      • 1.1 主要API
      • 1.2 示例
    • 2、绘制射线
      • 2.1 主要API
      • 2.2 示例
  • 四、绘制贴图、图标
    • 1、Gizmos绘制贴图
      • 1.1 主要API
      • 1.2 示例
    • 2、Gizmos绘制图标
      • 2.1 主要API
      • 2.2 示例
  • 专栏推荐
  • 完结

前言

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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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

http://www.xdnf.cn/news/9088.html

相关文章:

  • Leetcode 1924. 安装栅栏 II
  • RabbitMQ 集群与高可用方案设计(二)
  • PyTorch实战(7)——生成对抗网络(Generative Adversarial Network, GAN)实践详解
  • 黑龙江云前沿-服务器托管
  • CentOS7安装 htop(100% 可以安上)
  • 使用VuePress开发日志
  • Redis与Lua脚本深度解析:原理、应用与最佳实践
  • ES文件管理器 安卓APP(文件管理器) v4.4.3.0 无广告高级版
  • 【无标题】第一章 Hello World的诅咒
  • 古腾堡编辑器教程:如何使用WordPress图库区块
  • 第十讲 | 继承
  • 商品颜色/尺码选项太多谷歌爬虫不收录怎么办?
  • 自动化测试:等待方式
  • 体育数据支撑比分网的全链路技术解析:从架构设计到场景落地
  • SQLMesh 用户定义变量详解:从全局到局部的全方位配置指南
  • OpenSSL 文件验签与字符串验签原理及 C 语言实现详解
  • 编程中优秀大模型推荐:特点与应用场景深度分析
  • Pycharm的简单介绍
  • 002大模型-提示词工程,少样本提示,角色扮演,思维链
  • 基于python+Django+Mysql的校园二手交易市场
  • 在 Windows 上使用 WSL 安装 Ansible详细步骤
  • x86 与 ARM 汇编深度对比:聚焦 x86 汇编的独特魅力
  • 利用python爬虫获取淘宝天猫商品评论封装API实战演示
  • 【生物信息学】k-mer的基本概念及应用
  • python打卡day37@浙大疏锦行
  • tc3975开发板上有ft2232这块的电路,我想知道这个开发板有哪些升级方式,重点关注是怎样通过ft2232实现的烧录升级的
  • 单片机上按键功能通常都是用什么方法写?
  • 《DeepSeek行业应用全景指南(视频微课版)》:从入门到精通的AI落地实践手册
  • 2025年文件加密软件——数据保险箱,为您的文件上锁
  • DIY 自己的 MCP 服务-核心概念、基本协议、一个例子(Python)