在 UnityEditor 中,实现拖拽 Prefab 时在 Scene 窗口下显示 Prefab 样子需要进行以下步骤:

  1. 创建一个新的 Editor 脚本。

  2. 在脚本中定义一个变量,用于存储拖拽的 Prefab。

  3. OnSceneGUI 函数中,通过 Event.current.type 判断当前操作是拖拽还是释放。

  4. 如果是拖拽操作,通过 Event.current.mousePosition 获取鼠标位置,然后通过 HandleUtility.GUIPointToWorldRay 将鼠标位置转换为世界坐标。

  5. 通过 PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot 函数获取拖拽的 Prefab 的路径。

  6. 通过 AssetDatabase.LoadAssetAtPath 函数加载 Prefab 资源。

  7. 通过 Handles.DrawPrefab 函数在 Scene 窗口中显示 Prefab 的样子。

以下是实现这个功能的代码示例:

using UnityEditor;
using UnityEngine;

public class DragPrefab : Editor
{
    private GameObject prefab;

    [DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Selected)]
    static void DrawGameObjectName(Transform transform, GizmoType gizmoType)
    {
        Handles.Label(transform.position, transform.gameObject.name);
    }

    [DrawGizmo(GizmoType.NotInSelectionHierarchy | GizmoType.Selected)]
    static void DrawPrefab(Transform transform, GizmoType gizmoType)
    {
        if (Event.current.type == EventType.DragUpdated)
        {
            Vector3 mousePos = Event.current.mousePosition;
            mousePos.y = SceneView.currentDrawingSceneView.camera.pixelHeight - mousePos.y;
            Ray ray = SceneView.currentDrawingSceneView.camera.ScreenPointToRay(mousePos);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(hit.transform.gameObject);
                if (!string.IsNullOrEmpty(prefabPath))
                {
                    GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
                    if (prefab != null)
                    {
                        Handles.DrawPrefab(prefab, hit.transform.position, hit.transform.rotation, 1f);
                        Event.current.Use();
                    }
                }
            }
        }
    }
}

在上面的代码中,我们定义了一个变量 prefab 用于存储拖拽的 Prefab,然后在 DrawPrefab 函数中判断当前操作是拖拽还是释放,如果是拖拽操作,就通过 Handles.DrawPrefab 函数在 Scene 窗口中显示 Prefab 的样子。

UnityEditor 拖拽 Prefab 预览功能实现:在 Scene 窗口实时显示 Prefab 外观

原文地址: https://www.cveoy.top/t/topic/lNxR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录