美文网首页
UnityTips 之在Scene视窗内创建可操作的Gizmos

UnityTips 之在Scene视窗内创建可操作的Gizmos

作者: 暴走TA | 来源:发表于2023-12-05 19:15 被阅读0次

    简介: 最近接到需求,开发一个可视化的参数编辑功能,啥叫可视化呢,就是例如一个组件有个半径属性,那么在场景中绘制一个球形的虚拟体(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~

    相关文章

      网友评论

          本文标题:UnityTips 之在Scene视窗内创建可操作的Gizmos

          本文链接:https://www.haomeiwen.com/subject/kscdgdtx.html