unity Gizmos详解(TODO)

一、介绍

Gizmos 是 Unity 编辑器中的一种可视化工具,用于在 Scene 视图绘制调试信息、辅助线、形状等。它们不会出现在最终的游戏中,仅在编辑器中可见,方便开发者进行调试和设

  • 与Handles的区别

    • Gizmos:仅用于可视化,无交互功能。
    • Handles:提供可交互的控件(如拖拽手柄、旋转工具),通常用于自定义编辑器扩展(如通过[CustomEditor]实现的编辑器脚本)。

二、用途

  • 调试和可视化:在 Scene 视图中显示游戏对象的范围、路径或特定属性。
  • 辅助设计:帮助开发者在设计阶段快速布局和调整游戏元素。
  • 交互式编辑:通过 Gizmos 提供交互控件,如拖动、旋转等。

三、用法

3.1 绘制图形:

  • 绘制线条

    Gizmos.color = Color.red; // 设置线条颜色
    Gizmos.DrawLine(Vector3.zero, new Vector3(1, 0, 0)); // 从原点画到 (1, 0, 0)
  • 绘制立方体

    Gizmos.color = Color.green;
    Gizmos.DrawWireCube(Vector3.zero, Vector3.one); // 在原点画一个边长为 1 的立方体
  • 绘制球体

    Gizmos.color = Color.blue;
    Gizmos.DrawWireSphere(Vector3.zero, 1.0f); // 在原点画一个半径为 1 的球体
  • 绘制网格

    Gizmos.color = Color.yellow;
    Gizmos.DrawWireGrid(Vector3.zero, Vector3.one, 10); // 在原点画一个 10x10 的网格

3.2 在 MonoBehaviour 中使用 

通常在 OnDrawGizmos 或 OnDrawGizmosSelected 方法中使用 Gizmos:

  • OnDrawGizmos:在每一帧都会调用,无论对象是否被选中。
  • OnDrawGizmosSelected:仅当对象被选中时调用。
using UnityEngine;

public class GizmoExample : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        // 绘制一个红色立方体,表示对象的范围
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(transform.position, new Vector3(2, 2, 2));
    }

    private void OnDrawGizmosSelected()
    {
        // 当对象被选中时,绘制一个绿色球体
        Gizmos.color = Color.green;
        Gizmos.DrawWireSphere(transform.position, 1.0f);
    }
}

3.3. 自定义 Gizmos

除了内置的 Gizmos 方法,还可以通过 Handles 类创建更复杂的交互式 Gizmos(通常用于编辑器脚本中):

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(GizmoExample))] 使用属性来指定这个编辑器类用于 GizmoExample 脚本
public class GizmoExampleEditor : Editor
{
    // 在 Scene 视图中绘制自定义 Gizmos 的方法
    private void OnSceneGUI()
    {
        GizmoExample example = (GizmoExample)target;
        Handles.color = Color.cyan;

        // 在目标对象的位置绘制一个圆盘
        // example.transform.position: 圆盘的中心位置
        // Vector3.up: 圆盘的法线方向(这里是 Y 轴正方向)
        // 1.5f: 圆盘的半径
        Handles.DrawWireDisc(example.transform.position, Vector3.up, 1.5f);
    }
}

3.4 示例:绘制球形

将脚本挂载到cube上

using UnityEngine;

public class DrawSphere : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        Gizmos.DrawSphere(transform.position, 0.8f);
    }
}

3.5 场景视图渲染机制

Gizmos的绘制直接集成在Unity场景视图的渲染管线中,其图形通过OpenGL/DirectX等底层API渲染,但与游戏运行时的渲染完全隔离。开发者无需手动处理渲染逻辑,仅需调用Gizmos的静态方法(如DrawWireCubeDrawLine)即可。

3.6 坐标系与矩阵变换

Gizmos的绘制默认使用世界坐标系,但可通过修改Gizmos.matrix属性切换到局部坐标系:

void OnDrawGizmos() {
    Gizmos.matrix = transform.localToWorldMatrix; // 切换到局部坐标系
    Gizmos.DrawCube(Vector3.zero, Vector3.one);   // 在局部坐标系原点绘制立方体
}

四、 性能优化

  • 性能影响

    • Gizmos的绘制仅在编辑器模式下生效,不会影响游戏运行性能。但过度复杂的Gizmos绘制可能导致编辑器帧率下降,尤其在大型场景中。避免在 Update 中调用 Gizmos。

  • 可见性控制

    • 开发者可通过场景视图顶部的Gizmos下拉菜单全局启用/禁用Gizmos显示。
    • 某些Gizmos(如地形调试警告)需通过菜单手动勾选才会显示。
  • 资源管理

    • 自定义图标需放置在Assets/Gizmos文件夹下,并通过Gizmos.DrawIcon方法引用。
    • 避免在Gizmos方法中执行复杂计算(如物理模拟、大量对象遍历),以免拖慢编辑器响应速度。

五、应用场景

  • 显示攻击范围:在角色周围绘制一个圆形或扇形区域,表示攻击范围。
  • 路径规划:绘制一条折线,表示 AI 的移动路径。
  • 碰撞体积:可视化对象的碰撞器范围,方便调试。

示例:显示对象的移动路径

using UnityEngine;

public class PathGizmo : MonoBehaviour
{
    public Vector3[] pathPoints; // 路径点数组

    private void OnDrawGizmos()
    {
        if (pathPoints == null || pathPoints.Length < 2) return;

        Gizmos.color = Color.magenta;
        for (int i = 0; i < pathPoints.Length - 1; i++)
        {
            Gizmos.DrawLine(pathPoints[i], pathPoints[i + 1]);
        }

        // 绘制路径点
        Gizmos.color = Color.yellow;
        foreach (var point in pathPoints)
        {
            Gizmos.DrawSphere(point, 0.2f);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值