Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

news2025/4/2 22:17:44

       Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。

一.定义概述

Gizomsd 概述

Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态方法。

既然提到Gizoms不得不提到OnDrawGizmosxxx 系列函数。命名相近需要区分一下。

OnDrawGizmosxxx 概述

包含OnDrawGizmos( )和OnDrawGizmoselected( ),它们是Unity的MonoBehaviour中的生命周期函数,作为绘制Gizmos的入口点,开发者需要再此方法内调用Gizmos的绘制函数,定义需要的图形

OnDrawGizmosxxx是定义何时绘制如何触发的入口方法,而Gizmos是提供具体绘制能力的工具类。

二.Gizmos的核心功能

1.调试可视化

无需运行游戏,直接在场景视图中显示自定义图形。

常用函数

DrawLine:绘制直线

DrawSphere:绘制球体

DrawFrustum:绘制视椎体

DrawWireCube:绘制空心立方

属性控制

Gizmos.color:后续绘制颜色

Gizmos.matrix:基于对象坐标系绘制

示例代码

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.blue;
        Gizmos.matrix=transform.localToWorldMatrix;
        Gizmos.DrawCube(Vector3.forward,Vector3.one*0.5f);
        Gizmos.matrix = Matrix4x4.identity; 
    }

示例效果

基于物体自身坐标系的forward方向渲染立方体

开关控制

场景视图中的Gizmos菜单可全局启用或禁用Gizmos显示

下拉Gizmos菜单中且可以控制所有目标脚本内及其他的Gizmos绘制显示

2.图标标记

DrawIcon()可绘制icon或Tex,便于显示定位。

示例代码:

 private void OnDrawGizmos()
 {
     Gizmos.DrawIcon(transform.position, "tree.jpg");
 }

DrawIcon( )第二个输入参数string name 表示位于Assets/Gizmos路径下的资源名称。

经过多次实验,我认为需要带上资源的图片格式后缀(如jpg,png)。

实验结果:

三.Gizmos的相关应用

1.逻辑/碰撞检测可视化

在制作像平台游戏中的敌人AI时,我们经常需要多重射线和碰撞盒进行检测判断,此时可视化检测范围是较为重要的可提高效率的手段。

例如我们需要绘制一条竖直的射线来检测玩家是否到达地面。

或者敌人需要对面前一定距离或区域进行检测,查看是否看到了玩家进入追击状态等。

这里拿我以前的一个小项目举例:

敌人身上的白色圆形可视化区域是来检测是否可以进行攻击,白色的短直线用来可视化检测前方是否是地面边缘。

2.自定义图形绘制(仅场景视图)

我分别在四个空物体上挂载测试脚本,并在场景中绘制了四个空心立方体。

示例代码

  //每帧在Scene内绘制
  void OnDrawGizmos()
  {
      Gizmos.color = Color.cyan;//绘制青色空心立方体
      Gizmos.DrawWireCube(transform.position, Vector3.one * 0.5f);
  }

实验结果

       接着我们来实现一个小功能:在场景视图内,当我们选择一个游戏物体时,渲染一条自原点与该游戏物体的连线。

这里我写一个专门用于编辑器下的功能脚本,在Editor文件夹下新建脚本。

示例代码

using UnityEditor;
using UnityEngine;

public class GizmosEditor
{
    //挂载目标脚本的对象被选中且激活状态下绘制
    [DrawGizmo(GizmoType.Active | GizmoType.Selected)]
    static void CustomOnDrawGizmos(GizmosText traget, GizmoType type)
    {
        //物体被选中时将会显示自身至原点的一条连线
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(Vector3.zero, traget.transform.position);
    }
}

实验效果

接着我想加工一下这四个立方体,当我选中一个立方体时,该立方体会更复杂一些。

另外需要注意的是:

OnDrawGizmos()//在Scene视图内每帧绘制

OnDrawGizmosSelected()   //选中该脚本挂载对象时每帧在Scene内绘制

为减少不必要的性能消耗,我们可以使用一个bool变量来决定如何渲染。

这里我采用了一个bool变量来控制立方体是否在选中时绘制图形。

示例代码

using UnityEngine;

public class GizmosText : MonoBehaviour
{
    [Header("仅在被选中时绘制")]
    public bool isOnSelectedCanDraw = true;
    //每帧在Scene内绘制
    void OnDrawGizmos()
    {
        Gizmos.color = Color.cyan;
        Gizmos.DrawWireCube(transform.position, Vector3.one * 0.5f);
        if (!isOnSelectedCanDraw)
           DrawMyCube();
    }
    //选中该脚本挂载对象时每帧在Scene内绘制
    //只有选中该物体才会绘制
    private void OnDrawGizmosSelected()
    {
        if (isOnSelectedCanDraw)
            DrawMyCube();
    }

    void DrawMyCube()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(transform.position, Vector3.one * 0.4f);//绘制一个小实心立方体
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, 0.6f);//绘制一个空心黄球体
    }
}

实验结果

本篇完~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器(新加坡国立) 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能…

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…

【Git】5 个分区的切换方式及示例

目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash&#xff0…

Java高频面试之并发编程-02

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:进程和线程的区别是什么? 1. 资源分配与独立性 进程: 独立性:每个进程拥有独立的内存…

openwebui和keycloak集成,使用keycloak的用户名和密码登录

1,实现效果 使用keycloak定义的用户名和密码,直接登录openwebui 2,实现原理 keycloak中用户信息中包含用户名和密码,以及email。 使用keycloak中的用户名和密码登录之后,会用email创建一个openwebui的账号。之后每次…

【区块链安全 | 第八篇】多签机制及恶意多签

部分参考:慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限,完全控制账户 恶意多签成因 在区块链中,多签(M…

二月公开赛Web-ssrfme

目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内,拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面&#xff0c…

告别枯燥工作,走向自动化

嘿,小伙伴们!今天给你们介绍两款超实用的RPA办公自动化软件,用它们,再也不用像机器一样做重复劳动啦,超省时间! 工具名称:影刀RPA(类似产品,八爪鱼 RPA,操作上…

可信数据空间:构筑安全可控数据流通

前言:可信数据空间是一种数据基础设施,发展可信数据空间是全国及各地数据基础设施建设的重要方面。国内数据空间的探索和实践仍然数据探索阶段。本期分享:可信数据空间构筑安全可控数据流通,包括可信数据空间技术介绍、如何助力数…

Zookeeper特性与节点数据类型

数据结构和监听机制 CP 文件系统形式存储 观察者模式监听节点数据变化、 临时节点客户端超时或发生异常节点就会删除 2888同步数据 3888选举端口 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来…

处理 Linux 信号:进程控制与异常管理的核心

个人主页:chian-ocean 文章专栏-Linux 前言: 在 Linux 操作系统中,信号是用于进程间通信的一种机制,能够向进程发送通知,指示某些事件的发生。信号通常由操作系统内核、硬件中断或其他进程发送。接收和处理信号是 Li…

【蓝桥杯每日一题】4.1

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x "今日秃头刷题,明日荣耀加冕!" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看:【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …

分享系列项目的基础项目

本人分享了一系列的框架项目,它们共同需要依赖这个公共基础,结构如下图所示: 其中: audit: JPA的审计信息基础类auth:认证授权相关类config: 包括redis配置,client中token配置,openai文档配置…

为 MinIO AIStor 引入模型上下文协议(MCP)服务器

Anthropic 最近宣布的模型上下文协议 (MCP) 将改变我们与技术交互的方式。它允许自然语言通信替换许多任务的复杂命令行语法。不仅如此,语言模型还可以总结传统工具的丰富输出,并以人类可读的形式呈现关键信息。MinIO 是世界领先的…

数据结构实验1.1: 顺序表的操作及其应用

这里写自定义目录标题 一、实验目的二、注意事项三、实验内容(一)问题描述(二)基本要求 四,操作步骤(一)使用visual studio集成环境编写程序 五,示例代码六,运行效果 一、…

基于yolov11的汽车损伤检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的汽车损伤检测系统是一种先进的计算机视觉技术,旨在快速准确地识别汽车的各种损伤类型。该系统利用YOLOv11模型的强大性能,实现了对车辆损伤的精确检测与分类。 该系统能够识别的损伤类型包括裂纹(crack&#xff…

基于Spring Boot的平面设计课程在线学习平台系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档:MyBatis Plus官方文档…