前言
Unity 打开文件对话框的接口,如 EditorUtility.OpenFilePanel
和 EditorUtility.OpenFilePanelWithFilters
,它们都有一个缺点,就是不支持多选文件。但是实际开发中会遇到需要多选文件的需求,这时候就得自行开发接口了。这时候就有同学要问了:你选择一个文件夹不就可以了吗?试想,若一个文件夹下有 100 个文件,我只想一次性选择其中 10 个文件,选整个文件夹肯定是不行的,我又不想打开 10 次对话框——这就是需求背景。
资料搜集
要做一个新的需求,第一步肯定是搜集现有资料,看看有无前人踩过坑甚至实现了的。经过一番搜索,我找到了三个可能的方向:① 直接调用 Windows 的原生接口;② 调用 Windows.Forms 的接口;③ 通过其他脚本语言实现。
方案详解
方法一:Windows 原生接口
Win32 原生接口中有个 GetOpenFileName
,支持多选文件,如何在 Unity C# 中使用该接口我也找到了一篇博客,写的非常详细:【Unity编辑器开发】工具开发之Windows单选或多选文件踩坑记录 - 陌冉 - 博客园 (cnblogs.com)
大致思路就是构造一个和 Win32 中某个结构体字段以及布局完全一致的数据结构,用 DllImport
属性引入 Comdlg32.dll(该 dll 在目录 C:/Windows/System32
文件夹下)的 GetOpenFileName
方法。
但是这个接口有个最大的坑点就是如果你选择了多个文件,它并不会返回这些文件的列表,而是返回它们的父文件夹😅。官方文档写的清清楚楚:
文档传送门:OPENFILENAMEA (commdlg.h) - Win32 apps | Microsoft Docs
无奈只能放弃该方法😕。
方法二:Windows.Forms 窗体接口
既然 win32 原生的行不通,那么就找其他的 dll。Windows