| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 工具杂谈 #1 Unity 多选文件对话框 -> 正文阅读 |
|
[游戏开发]工具杂谈 #1 Unity 多选文件对话框 |
前言Unity 打开文件对话框的接口,如 资料搜集要做一个新的需求,第一步肯定是搜集现有资料,看看有无前人踩过坑甚至实现了的。经过一番搜索,我找到了三个可能的方向:① 直接调用 Windows 的原生接口;② 调用 Windows.Forms 的接口;③ 通过其他脚本语言实现。 方案详解方法一:Windows 原生接口Win32 原生接口中有个 大致思路就是构造一个和 Win32 中某个结构体字段以及布局完全一致的数据结构,用 但是这个接口有个最大的坑点就是如果你选择了多个文件,它并不会返回这些文件的列表,而是返回它们的父文件夹😅。官方文档写的清清楚楚: 文档传送门:OPENFILENAMEA (commdlg.h) - Win32 apps | Microsoft Docs 无奈只能放弃该方法😕。 方法二:Windows.Forms 窗体接口既然 win32 原生的行不通,那么就找其他的 dll。Windows 平台有个著名的应用类型叫 Windows 窗体应用,其中就提供了打开文件对话框的接口。顺着这个思路,我找到了一个开源项目: gkngkc/UnityStandaloneFileBrowser: A native file browser for unity standalone platforms (github.com) 在此只简单分析一下该项目的思路,具体实现查阅仓库即可。 该项目支持 Windows、Mac 和 Linux 三大平台。其中 Windows 平台是以第三方库 Ookii Dialogs 作为底层支持的,仅是对 Ookii 库做了一层封装,而 Ookii 依赖于 System.Windows.Forms,所以需要同时引入 Ookii.Dialogs.dll 和 System.Windows.Forms.dll。Mac 和 Linux 平台则引入了自定义的 StandaloneFileBrowser.jslib,并且没有任何说明,故无法考证底层用了什么方法。 Ookii Dialogs 的 GitHub 首页链接为:Ookii Dialogs (github.com) 可以看一下
其中,user32.dll 是每台 Windows 电脑都会有的,在目录 C:\Windows\System32 下,用 DllImport 特性可直接导入。 方法三:通过 Python 实现方法二虽然已有现成实现,但是不适合已上线的大项目,因为引入新的 dll 会拉长项目的编译时长,只为这一个小功能引入两个 dll 更是得不偿失。 但是前两个方法已经是代表了 C# 层的所有路子了:系统级 api,框架 api,第三方 api。所以,要想实现这个需求,必须另辟蹊径,比如——通过其他语言来实现。 我第一个想到的就是 Python,因为它有以下优点:一是脚本语言,很容易与其他语言结合;二是 Python 库非常丰富,你总能找到可以满足你需求的库。 Python 脚本我决定使用的库为 tkinter,当然你大可使用其他的库。tkinter 的 simpledialog 是处理文件对话框的模块,官方文档地址:Tkinter Dialogs — Python 3.10.0 documentation tkinter 库打开多选文件对话框的代码很简单:
但是在打开文件对话框的同时还会打开一个小小的白色窗口(Mac 平台则为黑色小窗口): 这样的小窗看着很糟心,要去掉也很简单,只需调用
函数
C# 层的封装众所周知,一个 Python 脚本可以通过命令行运行,如
我们只需要调整输入的命令为调用写好的 Python 脚本,然后获取命令行的输出即可。 完善细节好,现在大致的流程我们都清楚了,只需要丰富一点点细节就 OK。 解析命令行参数首先我们需要从 C# 传递参数给 python,仍是通过命令行方式。python 获取命令行参数的接口是 在此规定参数格式,假设我们要调用 python 脚本的完整命令行是:
解析命令行参数的代码如下:
此处省略 解析返回值python 层将选择的文件列表输出到了命令行,在 C# 层就需要读取 python 的输出。 我们先要调整 Process.StartInfo 的参数,才能够读取命令行的输出结果:
然后就可以对 output 进行操作,以获得选择的文件列表。 总结本文探讨了在 Unity 中实现多选文件对话框的三个方案:第一个方案不能满足我们的需求;第二个方案效果最佳,但是需要在项目里导入新的 dll,这样的做法在已上线的项目里是不可取的,因为引入 dll 势必会拉长编译时间,影响的是整个项目组的时间;第三个方案则是剑走偏锋,用偏门的方法实现。 希望这篇文章对你有用😁 最后附上完整实现的 GitHub 仓库链接:Dont-laugh/MultiFilePanel: Multi select file panel in Unity (github.com) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 21:05:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |