参考
API
示例
Mono脚本
using UnityEngine;
public class TestScene : MonoBehaviour
{
[SerializeField] string testName;
}
Editor脚本
重写InspectorGUI,在该函数中通过Event的Type参数获取当前的拖拽类型
拖拽中,如果鼠标指针进入目标区域,修改鼠标指针
拖拽释放,判断鼠标是否在目标区域,如果是,获取拖拽内容的路径
注意:不设置鼠标指针为通用状态无法获取拖拽对象的路径
using UnityEditor;
[CustomEditor(typeof(TestScene))]
public class TestSceneInspector : Editor
{
SerializedProperty testName;
private void OnEnable()
{
testName = serializedObject.FindProperty(nameof(testName));
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(testName, new GUIContent("测试"));
if (GetDragObjectPathsInProjectWindow(GUILayoutUtility.GetLastRect(), out string[] paths))
{
if (paths.Length > 0)
testName.stringValue = System.IO.Path.GetFileNameWithoutExtension(paths[0]);
}
serializedObject.ApplyModifiedProperties();
}
bool GetDragObjectPathsInProjectWindow(Rect targetRect, out string[] paths)
{
//拖拽提示
if (Event.current.type == EventType.DragUpdated)
{
Event.current.Use();
if (DragObjectInArea(targetRect))
DragAndDrop.visualMode = DragAndDropVisualMode.Generic;//鼠标指针修改为通用拖拽模式,设置为该模式该可以获取拖拽对象的路径
else
DragAndDrop.visualMode = DragAndDropVisualMode.None;//鼠标指针修改为无指示模式
}
//拖拽释放并且在目标区域内
if (Event.current.type == EventType.DragPerform && DragObjectInArea(targetRect))
{
Event.current.Use();
paths = DragAndDrop.paths;
return true;
}
else
{
paths = null;
return false;
}
bool DragObjectInArea(Rect rect)
{
return rect.Contains(Event.current.mousePosition);
}
}
}