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

【Unity编辑器开发与拓展Handles】

以下是 Unity 中 Handles 的详细介绍及其与 Gizmos 的区别,结合官方文档和技术解析整理:


一、Handles 的核心功能

HandlesUnityEditor 命名空间下的类,用于在 Scene 视图中创建交互式 3D 控件,支持编辑场景对象属性。其核心特点包括:

  1. 交互性

    • 提供可拖拽、旋转、缩放的控件(如箭头、滑块、圆弧),用户可通过鼠标直接操作修改对象属性。
    • 示例:通过 Handles.ScaleValueHandle 调整护盾半径,实时更新数值。
    // 修改 shieldArea 的交互式手柄
    myObj.shieldArea = (float)Handles.ScaleValueHandle(myObj.shieldArea, myObj.transform.position + myObj.transform.forward * myObj.shieldArea,myObj.transform.rotation, 1, Handles.ConeHandleCap, 1
    );
    
  2. 自定义绘制

    • 支持绘制复杂图形(如圆弧 DrawWireArc、圆盘 DrawWireDisc),并叠加 2D GUI 控件(按钮、标签)。
    • 需在 Editor.OnSceneGUI 方法中使用,且配合 Handles.BeginGUI()/EndGUI() 包裹 2D UI 代码。
  3. 坐标系转换

    • 通过 HandleUtility 实现 2D 屏幕坐标与 3D 世界坐标的转换(如 GUIPointToWorldRay)。

二、Handles 与 Gizmos 的关键区别

以下是两者核心差异的对比:

特性HandlesGizmos
交互性✅ 支持拖拽、旋转等用户交互❌ 仅可视化,无交互功能
使用场景编辑器扩展(如自定义组件工具)调试辅助(如显示碰撞范围、路径点)
绘制位置仅 Scene 视图Scene 视图 + Game 视图(需开启 Gizmos 开关)
坐标系统世界坐标(需设置相机)世界坐标(自动适配当前视图)
依赖脚本类型需继承 Editor 并在 OnSceneGUI 中调用可在普通 MonoBehaviourOnDrawGizmos 中使用
典型方法PositionHandle, Button, DrawWireArcDrawWireCube, DrawLine, DrawSphere

代码示例对比

// Handles 示例:自定义旋转手柄(仅编辑器生效)
[CustomEditor(typeof(MyComponent))]
public class MyEditor : Editor {void OnSceneGUI() {MyComponent comp = target as MyComponent;comp.rotation = Handles.RotationHandle(comp.rotation, comp.position);}
}// Gizmos 示例:显示选中对象的球体范围(运行时也可见)
public class GizmoDemo : MonoBehaviour {void OnDrawGizmosSelected() {Gizmos.color = Color.green;Gizmos.DrawWireSphere(transform.position, 1.0f);}
}

三、Handles 的典型应用场景

  1. 路径点编辑器

    • PositionHandle 拖拽编辑路径点位置,DrawPolyLine 连接点形成路径。
  2. 自定义属性控件

    • 为数值型属性(如半径、角度)创建滑块 (Slider)、旋钮 (Knob),替代 Inspector 输入。
  3. 程序化生成内容的编辑

    • 编辑程序生成的地形标记点或不可见对象(如触发器区域),通过 Handles.Label 显示关键信息。

四、开发注意事项

  1. 性能优化

    • 避免在 OnSceneGUI 中频繁计算复杂逻辑,否则会导致 Scene 视图卡顿。
  2. 条件编译

    • 使用 #if UNITY_EDITOR 包裹 Handle 代码,避免发布版本包含编辑器依赖。
  3. 坐标系问题

    • 绘制图形时需通过 Handles.SetCamera(Camera.main) 指定相机,否则可能显示错位。

总结

  • Handles:专注编辑器交互,为自定义组件提供类 Unity 原生工具的操控体验(如拖拽手柄、按钮),是编辑器扩展的核心工具。
  • Gizmos:专注运行时可视化,用于调试信息展示(如碰撞体、射线方向),无交互能力。

建议结合使用两者:例如用 Gizmos 显示对象范围,用 Handles 提供编辑控件。更多用例可参考 官方手册

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

相关文章:

  • CRMEB 单商户PRO多商户通用去版权教程
  • Oracle迁移到高斯,查询字段默认小写,解决办法
  • 微软Fabric重塑数据管理:Forrester报告揭示高ROI
  • 基于Kafka实现简单的延时队列
  • BUUCTF(web)部分题解
  • 设计模式九:构建器模式 (Builder Pattern)
  • springboot 升级到3.5.x后knife4j 文档无法识别问题解决
  • 新手向:Idea的使用技巧
  • Kubernetes服务发布基础
  • 【数据结构】线性表概括
  • [特殊字符] 从数据库无法访问到成功修复崩溃表:一次 MySQL 故障排查实录
  • SQL基础⑧ | 表格篇
  • React中的antd的表格使用方法
  • 在 Ubuntu 上将 Docker 降级到版本 25.0.5 (二) 降低版本,涉及兼容性问题
  • 解决 i.MX6ULL 通过 ADB 连接时权限不足问题 not in the plugdev group
  • C++ 扫描局域网某个端口是否开放(如 5555 )(android adb) 线程并发加速
  • 苍穹外卖DAY11
  • 华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑
  • gig-gitignore工具实战开发(一):项目愿景与蓝图规划
  • C#与WPF使用mvvm简单案例点击按钮触发弹窗
  • C Primer Plus 第6版 编程练习——第10章(上)
  • MySQL金融级数据一致性保障:从原理到实战
  • 视频、音频录制
  • Javascript常见的使用场景
  • 基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)
  • Deep learning--模型压缩的五种方法
  • 什么是5G-A三防平板?有什么特点?哪些领域能用到?
  • Java 抽象类 vs 接口(Abstract Class vs Interface)对比笔记
  • 220V降5V,输出100MA,为家电电器消费类产品提供电源WD5202L
  • 【Dify】-进阶11- 权限与发布配置详解