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

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:基于对象坐标系绘制

示例代码

cs 复制代码
    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,便于显示定位。

示例代码:

cs 复制代码
 private void OnDrawGizmos()
 {
     Gizmos.DrawIcon(transform.position, "tree.jpg");
 }

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

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

实验结果:

三.Gizmos的相关应用

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

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

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

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

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

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

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

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

示例代码

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

实验结果

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

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

示例代码

cs 复制代码
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变量来控制立方体是否在选中时绘制图形。

示例代码

cs 复制代码
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);//绘制一个空心黄球体
    }
}

实验结果

本篇完~

相关推荐
susu108301891137 分钟前
如何选择文件夹然后用vscode直接打开
ide·vscode·编辑器
非得登录才能看吗?37 分钟前
开发环境 之 编辑器、编译器、IDE梳理
ide·编辑器
ONLYOFFICE5 小时前
【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
java·编辑器·onlyoffice
深耕AI5 小时前
【MFC 小白日记】对话框编辑器里“原型图像”到底要不要勾?3 分钟看懂!
c++·编辑器·mfc
猫头虎6 小时前
IDE mac M芯片安装报错:如何解决“InsCode.app 已损坏”,无法打开
ide·vscode·macos·inscode·编辑器·idea·mac
2301_793116947 小时前
Unity 解决天空盒中间出现一条线
unity
佩京科技VR7 小时前
禁毒教育展厅互动设备-禁毒教育基地-禁毒体验馆方案-VR禁毒教育软件
unity·vr·禁毒展厅·vr禁毒学习机
平行云1 天前
Paraverse平行云实时云渲染助力第82届威尼斯电影节XR沉浸式体验
unity·云原生·ue5·xr·实时云渲染
東雪蓮☆1 天前
深入掌握sed:Linux文本处理的流式编辑器利器
linux·运维·编辑器
Xeon_CC1 天前
Unity中,软遮罩SoftMaskForUGUI的使用
unity·游戏引擎