Unity3D 编辑器通过拖拽获取文件路径

Unity3D 项目开发过程中咱们难免会碰到一些需要设置 Prefab 路径的时候,例如某个攻击动作的特效,虽然我们最终都是通过填表来完成,如果完全手动填表那实在让人崩溃啊,碰到有的特效命名不小心填错了,那就更加无聊了,所以作为程序猿的我们肯定是要通过更加友好的方式来获取各种目录下各种文件的路径了。

我们早已经习惯了在各种地方通过拖拽来进行文件路径设置了,那么显然拖拽是非常简单又人性化的设定啊。假设我们现在有一个技能设置的编辑器,如下图:

技能编辑器

特效路径就是我们想设置的,而且可能会在平时做一些修改,每次都自己手动输入显然不是我们想要的,那么怎么让这个 TextField 支持将 Project 视图下的文件拖拽到这个文本输入框中,并且让它自动获取我拖拽的文件的路径呢?

『技能编辑器』这整个 Window 其实就是通过各种小控件给拼起来的,Unity3D 中默认所有控件都是支持拖拽事件的,所以我们不需要做任何设置,直接针对我们的需求开始就好了。

我们想要的是,特效路径这个 Label 后边跟着的这个可输入的 TextField 文本输入框可以接受拖拽文件的方式来进行路径的输入。那么我们需要做的就是在这个『技能编辑器』的 Window 中监听鼠标拖拽的事情,同时判断鼠标拖拽时鼠标的位置是否处于这个可输入的 TextField 文本输入框之中就 OK 了,上代码。
[code lang=”csharp”]
EditorGUILayout.BeginHorizontal ();
EditorGUILayout.LabelField (" 特效路径", GUILayout.Width (80));
// 获得特效路径文本输入框的位置和大小参数,用于后续判断鼠标在文本输入框内使用
Rect sfxPathRect = EditorGUILayout.GetControlRect(GUILayout.Width (250));
// 用刚刚获取的文本输入框的位置和大小参数,创建一个文本输入框,用于输入特效路径
string sfxPathText = EditorGUI.TextField (sfxPathRect, meleeAttackSection.sfxPath);
// 判断当前鼠标正拖拽某对象或者在拖拽的过程中松开了鼠标按键
// 同时还需要判断拖拽时鼠标所在位置处于文本输入框内
if ((Event.current.type == EventType.DragUpdated
|| Event.current.type == EventType.DragExited)
&& sfxPathRect.Contains (Event.current.mousePosition)) {
// 判断是否拖拽了文件
if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0) {
string sfxPath = DragAndDrop.paths [0];
// 拖拽的过程中,松开鼠标之后,拖拽操作结束,此时就可以使用获得的 sfxPath 变量了
if (!string.IsNullOrEmpty (sfxPath) && Event.current.type == EventType.DragExited) {
DragAndDrop.AcceptDrag ();
// 好了,这下想用这个 sfxPath 变量干嘛就干嘛吧
}
}
}
EditorGUILayout.EndHorizontal ();
[/code]