在开发中,我们会为某些类实现自己的属性面板,然后可能存在一个文本框,接收拖动一个场景或者资源对象,把路径赋值给这个文本框。
把拖动的资源变成一个路径:
public override void OnInspectorGUI()
{
//获得一个长500的框
mExcelPathRect = EditorGUILayout.GetControlRect(GUILayout.Width(500));
EditorGUI.TextField(mExcelPathRect, curPath);
//如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在位置在文本输入框内
if ((Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited)&& mExcelPathRect.Contains(Event.current.mousePosition))
{
//改变鼠标的外表
DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
{
string retPath = DragAndDrop.paths[0];
curPath = retPath;
}
}
serializedObject.ApplyModifiedProperties();
}
把一个场景节点变成一个路径:
public override void OnInspectorGUI()
{
//获得一个长500的框
mExcelPathRect = EditorGUILayout.GetControlRect(GUILayout.Width(500));
EditorGUI.TextField(mExcelPathRect, curPath);
//如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在位置在文本输入框内
if ((Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited)&& mExcelPathRect.Contains(Event.current.mousePosition))
{
if (DragAndDrop.objectReferences != null &&
DragAndDrop.objectReferences.Length > 0)
{
if (DragAndDrop.objectReferences[0] is GameObject)
{
GameObject obj = (GameObject)DragAndDrop.objectReferences[0];
string path = obj.name;
while (obj.transform.parent != null)
{
obj = obj.transform.parent.gameObject;
if (obj.name == "StoryNode")
{
break;
}
path = obj.name + "/" + path;
}
str = path;
}
}
}
serializedObject.ApplyModifiedProperties();
}