UnityEditor 拖拽 Prefab 预览功能实现:在 Scene 窗口实时显示 Prefab 外观
在 UnityEditor 中,实现拖拽 Prefab 时在 Scene 窗口下显示 Prefab 样子需要进行以下步骤:
-
创建一个新的 Editor 脚本。
-
在脚本中定义一个变量,用于存储拖拽的 Prefab。
-
在
OnSceneGUI函数中,通过Event.current.type判断当前操作是拖拽还是释放。 -
如果是拖拽操作,通过
Event.current.mousePosition获取鼠标位置,然后通过HandleUtility.GUIPointToWorldRay将鼠标位置转换为世界坐标。 -
通过
PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot函数获取拖拽的 Prefab 的路径。 -
通过
AssetDatabase.LoadAssetAtPath函数加载 Prefab 资源。 -
通过
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 的样子。
原文地址: https://www.cveoy.top/t/topic/lNxR 著作权归作者所有。请勿转载和采集!