当前位置: 首页 > 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.dtcms.com/a/294160.html

相关文章:

  • PyTorch中nn.Module详解和综合代码示例
  • 不同地区的主要搜索引擎工具
  • Java项目中定时任务三方工具和技术的深度应用指南
  • C#定时任务实战指南:从基础Timer到Hangfire高级应用
  • 基于Python的新闻爬虫:实时追踪行业动态
  • SQL Server 数据类型的含义、特点及常见使用场景的详细说明
  • Redis 的事务机制是怎样的?
  • 【世纪龙科技】汽车专业数字课程资源-新能源汽车维护与故障诊断
  • UI自动化测试实战
  • RPA认证考试全攻略:如何高效通过uipath、实在智能等厂商考试
  • MCP vs 传统集成方案:AI时代下的协议革命与性能博弈
  • uniapp 仿美团外卖详情页滑动面板组件[可自定义内容、自定义高度]
  • UniApp H5 适配 PC 端新姿势:打造跨设备一致体验
  • 【Linux系统编程】基础指令
  • 实时视频传输遥控车:DIY智能家居监控与探索机器人
  • CentOS 7 Linux 基础知识点汇总
  • 【C++】OpenCV常用对比度增强方法
  • 华普微Matter模块HM-MT7201,打破智能家居生态孤岛
  • Shell 脚本里的流程控制
  • Android用户鉴权实现方案深度分析
  • Android Camera openCamera
  • 绿化工程路牙边界区分-CAD快速看图标注分类高效处理
  • 使用 MobaXterm 登录你的阿里云 ECS 实例
  • 不止于“亮”:一盏智慧路灯的技术进化史——塔能科技用“落地性”定义行业标准
  • RCLAMP0502A.TCT Semtech:超低电容TVS二极管,高速接口+军工级防护!
  • github最近的设计。
  • GraphQL批量查询优化:DataLoader如何让数据库访问速度飞起来?
  • Spring核心机制:@Bean注解与依赖注入的终极实践指南
  • ubuntu24的一些小问题
  • 分布式限流算法与组件