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类

Drawer类型的方法

Handle 类

可操作手柄类

特殊用法

在进行可视化编辑时,我们可能需要锁定选择,这样可以防止我们操作的焦点丢失
只要在 OnSceneGUI 内每次都调用 HandleUtility.AddDefaultControl(0); 即可

实战半径设置

  1. 先写一个mono 类作为我们的载体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RadiusMono : MonoBehaviour
{
   public float radius = 1;
}
  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);
        }
    }
}
实操效果

注意

  1. 这里绘制时使用的坐标系是世界空间。
  2. Editor类需要放在 Editor 文件夹下面,不然引用会报错
    Enjoy~
上一篇下一篇

猜你喜欢

热点阅读