当前位置:   article > 正文

Unity 弹框选择文件、文件夹、保存文件_unity 选择文件

unity 选择文件

一、概述

最近我负责一个模拟仿真项目,我使用 Unity3d + 发布 PC 平台作为解决方案。其中有一个功能,需要弹框让用户选择一个 txt 文件,并读取 txt 文件的内容,于是我开始网上查找资料,发现大多数帖子都是通过在 Unity 编辑器的特定目录中(如:Unity Editor\2022.3.2t7\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api)找到一个 System.Windows.Forms.dll 文件,并将其导入项目中。看到这个 dll 的名字,做过 Winform 开发的应该很熟悉,Winform 的 UI 控件和各种弹框都是用它来完成的。

于是我就复制了网上的代码,开始测试,在 Unity 编辑器中运行还算正常,当我高兴的以为任务完成时,发布项目时顿时傻眼,就发布 Windows 平台也报错:

你这不是官方的 dll 么?又不是从 Winform 中复制出来的,为什么还会报错?难道是因为我用的是团结引擎而不是 Unity 引擎么?然而问题还不止如此,Unity 编辑器开始经常闪退,甚至一打开项目就自动闪退,搞的我莫名火大,后面不得不删除 Library 文件夹,重新打开项目,编辑器这才恢复正常了。

看到那么多帖子都是这么用的,难道他们在写之前都不测试的么?我都开始怀疑自己是不是用法不对导致的,但问题总是要解决的,终于在 Github 上,我找到了一个叫 Compact Standalone File Browser 的插件,解决了发布时报错的问题,看看 Github 上的描述:

======================================

Compact Standalone File Browser for Unity3d

A compact wrapper for native Windows file dialogs.
Inspired by: https://github.com/gkngkc/UnityStandaloneFileBrowser

  • Only Desktop Windows platform supported.
  • IL2CPP compatible.
  • No additional plugins required.
  • Save File dialog, Open file/files dialog, Select folder dialog.

INSTALL URL: https://github.com/eastafiev/CompactStandaloneFileBrowser.git?path=Assets/StandaloneFileBrowser

======================================

下载地址:

https://github.com/eastafiev/CompactStandaloneFileBrowser

二、用法

将代码直接下载下来后,将这两个文件夹复制到你的项目中

如果你的项目已经有了 TextMesh Pro 文件夹,那么只需要复制 StandaloneFileBrowser 文件夹,和 StandaloneFileBrowser.meta 即可。

找到 Sample 文件夹,BasicSampleScene 场景就是对应的 demo

BasicSample 脚本就是这个 demo 对应的代码。

这里提供了三个功能,选择文件,选择文件夹,和保存文件。

BasicSample 脚本

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using NativeFileBrowser;
  4. using System.IO;
  5. public class BasicSample : MonoBehaviour
  6. {
  7. public Button _openFileButton;
  8. public Button _openFolderButton;
  9. public Button _saveFileButton;
  10. private void Awake()
  11. {
  12. _openFileButton.onClick.AddListener(OpenFiles);
  13. _openFolderButton.onClick.AddListener(SelectFolder);
  14. _saveFileButton.onClick.AddListener(SaveFile);
  15. }
  16. private void OpenFiles()
  17. {
  18. var title = "Open Image File";
  19. var extensions = new[]
  20. {
  21. new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
  22. new ExtensionFilter("JPG ", "jpg", "jpeg"),
  23. new ExtensionFilter("PNG ", "png"),
  24. };
  25. var path = StandaloneFileBrowser.OpenFilePanel(title, extensions, true);
  26. Debug.Log(path.Length);
  27. }
  28. private void SelectFolder()
  29. {
  30. var title = "Select Folder";
  31. var path = StandaloneFileBrowser.OpenFolderPanel(title);
  32. Debug.Log(path.Length);
  33. }
  34. private void SaveFile()
  35. {
  36. var title = "Save file";
  37. var extensionList = new[]
  38. {
  39. new ExtensionFilter("Binary", "bin"),
  40. new ExtensionFilter("Text", "txt"),
  41. };
  42. var file = StandaloneFileBrowser.SaveFilePanel(title, "Save file", extensionList);
  43. Debug.Log(file);
  44. }
  45. }

1.选择文件

代码:

  1. private void OpenFiles()
  2. {
  3. var title = "Open Image File";
  4. var extensions = new[]
  5. {
  6. new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
  7. new ExtensionFilter("JPG ", "jpg", "jpeg"),
  8. new ExtensionFilter("PNG ", "png"),
  9. };
  10. var path = StandaloneFileBrowser.OpenFilePanel(title, extensions, true);
  11. }

第一句代码中的 title 变量是弹框时提示的标题,参考:

第二句代码是实例化了一个数组 extensions,extensions 是设置选择文件的类型,这里提供了三个下拉框作为筛选。

  1. var extensions = new[]
  2. {
  3. new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
  4. new ExtensionFilter("JPG ", "jpg", "jpeg"),
  5. new ExtensionFilter("PNG ", "png"),
  6. };

第三句代码则是打开弹框了

var path = StandaloneFileBrowser.OpenFilePanel(title, extensions, true);

这里有三个参数,第一个参数就是上面讲的标题,第二个参数是类型筛选器,第三个参数是是否允许选择多个文件,这个设置值为 true 表示可以选择多个文件。

返回值则是一个 string 类型数组,如果选择了多个文件,则会返回多个文件的路径。

2.选择文件夹

代码:

  1. private void SelectFolder()
  2. {
  3. var title = "Select Folder";
  4. var path = StandaloneFileBrowser.OpenFolderPanel(title);
  5. }

选择文件夹的代码相对来说比较简单,就传入了一个标题,同样的,这里的返回值也是一个  string 类型数组,如果选择了多个文件夹,那么返回的就是所以文件夹的路径。

3.保存文件

代码:

  1. private void SaveFile()
  2. {
  3. var title = "Save file";
  4. var extensionList = new[]
  5. {
  6. new ExtensionFilter("Binary", "bin"),
  7. new ExtensionFilter("Text", "txt"),
  8. };
  9. var file = StandaloneFileBrowser.SaveFilePanel(title, "Save file", extensionList);
  10. Debug.Log(file);
  11. }

变量 extensionList 是保存时的格式筛选器,如下:

第三句代码中,第一个参数是标题,第二个参数就是上图中的文件名处字符串“Save file”,第三个参数是类型筛选器。

注意这里,点击保存后,并不会真的保存,而是返回一个 string 类型的变量,表示当前的保存路径。

你可以使用保存文件的代码来继续完成这个功能,可以参考我的帖子

C# 文件操作(复制、移动、重命名、创建、打开、删除)_c# 创建文件-CSDN博客

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/739281
推荐阅读
相关标签
  

闽ICP备14008679号