UEDL9——HandleUtility公共类

本章代码关键字

1
HandleUtility.WorldToGUIPoint()

HandleUtility公共类

HandleUtility​ 是 Unity 中的一个工具类
用于处理场景中的编辑器句柄(Handles​)以及其他一些与编辑器交互相关的功能
它提供了一系列静态方法,用于处理编辑器中的鼠标交互、坐标转换以及其他与Handles​相关的功能

HandleUtility​的更多内容可看:

回顾如何获取窗口上鼠标位置

具体可看:Event.current.mousePosition​

HandleUtility类中的常用API

  1. HandleUtility.GetHandleSize(Vector3 position)

    我们之前已经使用过的API,具体可看HandleUtility.GetHandleSize()​。用于获取在场景中给定位置的句柄的合适尺寸
    该方法通常用于根据场景中对象的距离来调整句柄的大小,以便在不同的缩放级别下保持合适的显示大小

  2. HandleUtility.WorldToGUIPoint(Vector3 worldPosition)
    将世界坐标转换为 GUI 坐标
    这个方法通常用于将场景中的某个点的位置转换为屏幕上的像素坐标
    以便在 GUI 中绘制相关的信息

    可以通过该方法让GUI的控件绘制在Scene窗口上显示的某个对象,
    例如要让一个按钮绘制在一个GameObject​相对于GUI坐标的位置上

    1
    2
    3
    4
    5
    6
    7
    private void OnSceneGUI()
    {
    Vector2 pos = HandleUtility.WorldToGUIPoint(targetObj.transform.position);
    Handles.BeginGUI();
    GUI.Button(new Rect(pos.x, pos.y, 60, 20), "测试按钮");
    Handles.EndGUI();
    }

    绘制效果:image

  3. HandleUtility.GUIPointToWorldRay(Vector2 position)
    将屏幕上的像素坐标转换为射线,这个方法通常用于从屏幕坐标中获取一条射线,用于检测场景中的物体或进行射线投射

    假设当我们选中被拓展的脚本依附的对象时,鼠标指向哪个有碰撞器的游戏对象,就输出游戏对象的名字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private Lesson26 targetObj;

    private void OnEnable()
    {
    targetObj = target as Lesson26;
    }

    private void OnSceneGUI()
    {
    Ray r = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
    RaycastHit info;
    if (Physics.Raycast(r, out info))
    Debug.Log(info.collider.name);
    }

    显示效果:

    image

  4. HandleUtility.DistanceToLine(Vector3 lineStart, Vector3 lineEnd)
    计算场景中一条线段与鼠标光标的最短距离,可以用来制作悬停变色等功能

    1
    2
    3
    4
    5
    private void OnSceneGUI()
    {
    float dis = HandleUtility.DistanceToLine(Vector3.zero, Vector3.right);
    Debug.Log(dis);
    }

    输出(鼠标光标离线段越来越近时,输出的最短距离也越来越小):

    image

  5. HandleUtility.PickGameObject(Vector2 position, bool isSelecting)
    在编辑器中进行对象的拾取,这个方法通常用于根据鼠标光标位置获取场景中的对象,以实现对象的选择或交互操作

    注:以下代码的运行实际上会报错,如果运气不好还会导致Scene窗口无法渲染,
    但是在报错的情况下,也可以在鼠标光标指向某个对象时输出该对象的名字

    1
    2
    3
    4
    5
    6
    private void OnSceneGUI()
    {
    GameObject testObj = HandleUtility.PickGameObject(Event.current.mousePosition, true);
    if (testObj != null)
    Debug.Log("选择对象的名字:" + testObj.name);
    }