UnityTips 之在Scene视窗内创建可操作的Gizmos
2023-12-05 本文已影响0人
暴走TA
简介: 最近接到需求,开发一个可视化的参数编辑功能,啥叫可视化呢,就是例如一个组件有个半径属性,那么在场景中绘制一个球形的虚拟体(Gizmos),然后这个虚拟体可以直接调节半径范围。其实就有点类似 Unity 内置的 collider 的编辑工具。这个功能其实主要是靠Handles 这个类实现的。与 Gizmos 的最大区别就是 Gizmos 只进行了可视化表现,而 Handles 能看见且还可以直接调节
unity版本:20222.3.0fc1
官方文档
Handles 是Unity在场景视图中,用于操控物体的3D控制器,已内置许多操作GUI,比如我们熟悉的基于Transform对位置、缩放、旋转坐标的操作工具。当然,我们使用自定义的Editor,定义自己的Handle GUI操作显示也是可能的。这种GUIs将会非常有用于程序化生成的场景内容、“不可见”的子对象与组。比如路径点与坐标标记点。
Handles 主要用在 OnSceneGUI 方法内部,通过场景更新函数调用进行刷新。
Handles 提供了大量的静态方法,一部分是绘制类的,这种的没有交互,另一部分是 handle 类的,有交互效果。
Drawer类
![](https://img.haomeiwen.com/i19189157/bbd303af0500cfd6.png)
Handle 类
![](https://img.haomeiwen.com/i19189157/7ae65e1532e89085.png)
特殊用法
在进行可视化编辑时,我们可能需要锁定选择,这样可以防止我们操作的焦点丢失
只要在 OnSceneGUI 内每次都调用 HandleUtility.AddDefaultControl(0); 即可
实战半径设置
- 先写一个mono 类作为我们的载体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RadiusMono : MonoBehaviour
{
public float radius = 1;
}
- 再来一个 inspector 的界面类
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(RadiusMono))]
public class RadiusMonoEditor : Editor
{
private void OnSceneGUI()
{
var tar = target as RadiusMono;
if (tar.editorable)
{
HandleUtility.AddDefaultControl(0);
tar.radius=Handles.RadiusHandle(tar.transform.rotation,tar.transform.position,tar.radius,false);
}
}
}
![](https://img.haomeiwen.com/i19189157/740990b4869eed76.gif)
注意
- 这里绘制时使用的坐标系是世界空间。
- Editor类需要放在 Editor 文件夹下面,不然引用会报错
Enjoy~