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

news2024/10/6 10:28:11

目录

一、概述

二、用法

1.选择文件

2.选择文件夹

3.保存文件

结束


一、概述

最近在做一个模拟仿真的项目,我采用了 Unity3d + 发布 PC 平台来完成,其中有一个功能,需要弹框让用户选择一个 txt 文件,并读取 txt 文件的内容,于是我在网上查了一些帖子,大部分帖子都是在 Unity 编辑器目录中找到一个 System.Windows.Forms.dll 导入到项目中,它的用法大概和 C# 中的 Winform 类似。

System.Windows.Forms.dll 路径:Unity Editor\2022.3.2t7\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api

经过测试,在 Unity 编辑器中运行并选择文件是一点问题都没有,一旦发布项目就报错(只发布 Windows 平台),就开始报错了:

而且,编辑器会经常的闪退,有时候甚至一打开项目就自动闪退,后面不得不删除 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 脚本

using UnityEngine;
using UnityEngine.UI;
using NativeFileBrowser;
using System.IO;

public class BasicSample : MonoBehaviour
{
	public Button _openFileButton;
	public Button _openFolderButton;
	public Button _saveFileButton;


	private void Awake()
	{
		_openFileButton.onClick.AddListener(OpenFiles);
		_openFolderButton.onClick.AddListener(SelectFolder);
		_saveFileButton.onClick.AddListener(SaveFile);
	}

	private void OpenFiles()
	{
		var title = "Open Image File";
		var extensions = new[]
		{
			new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
			new ExtensionFilter("JPG ", "jpg", "jpeg"),
			new ExtensionFilter("PNG ", "png"),
		};

		var path = StandaloneFileBrowser.OpenFilePanel(title, extensions, true);
		Debug.Log(path.Length);
	}

	private void SelectFolder()
	{
		var title = "Select Folder";

		var path = StandaloneFileBrowser.OpenFolderPanel(title);
        Debug.Log(path.Length);
    }

	private void SaveFile()
	{
		var title = "Save file";
		var extensionList = new[]
		{
			new ExtensionFilter("Binary", "bin"),
			new ExtensionFilter("Text", "txt"),
		};
		var file = StandaloneFileBrowser.SaveFilePanel(title,  "Save file", extensionList);
        Debug.Log(file);
    }
}

1.选择文件

代码:

private void OpenFiles()
{
	var title = "Open Image File";
	var extensions = new[]
	{
		new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
		new ExtensionFilter("JPG ", "jpg", "jpeg"),
		new ExtensionFilter("PNG ", "png"),
	};

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

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

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

var extensions = new[]
{
	new ExtensionFilter("Image Files", "png", "jpg", "jpeg"),
	new ExtensionFilter("JPG ", "jpg", "jpeg"),
	new ExtensionFilter("PNG ", "png"),
};

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

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

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

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

2.选择文件夹

代码:

private void SelectFolder()
{
	var title = "Select Folder";
	var path = StandaloneFileBrowser.OpenFolderPanel(title);
}

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

3.保存文件

代码:

private void SaveFile()
{
	var title = "Save file";
	var extensionList = new[]
	{
		new ExtensionFilter("Binary", "bin"),
		new ExtensionFilter("Text", "txt"),
	};
	var file = StandaloneFileBrowser.SaveFilePanel(title,  "Save file", extensionList);
    Debug.Log(file);
}

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

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

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

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

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

结束

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

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

今年找工作有多难

前言 这几天在网上刷到一个读文案策划专业的刚毕业的女大学生在网上哭诉找工作难,面试30家公司都没有找到工作,有的公司还说试用期没有钱,且试用期后不保证能转正。小姑娘泪流满面的说:不知道读大学的意义在哪里,自己…

springboot学习(八十六) springboot使用graalvm编译native程序

一、windows环境下 1.下载graalvm的jdk https://injdk.cn/ 下载windows版本 配置java环境变量,配置过程略 2.下载visual Studio Build Tools 下载地址:https://aka.ms/vs/17/release/vs_BuildTools.exe 安装后选择组件: 其中windows S…

SpringBoot-邮件任务

很多时候的网站都有邮件发送功能&#xff0c;下面我们来看看邮件发送功能结合springboot该怎么实现下面的例子我是用的qq邮箱来完成的 1.导入依赖 我的springboot的版本是2.x.x的&#xff0c;如果发现运行不成功&#xff0c;请将版本降低到2.x.x <!--邮件任务--><depe…

2024最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据

电商日常运营很容易理解&#xff0c;就是店铺商品维护&#xff0c;上下架&#xff0c;评价维护&#xff0c;库存数量&#xff0c;协助美工完成制作详情页。店铺DSR&#xff0c;好评率&#xff0c;提升客服服务等等&#xff0c;这些基础而且每天都必须做循环做的工作。借助电商A…

C语言实现一个两个数加减乘除的答题代码(含文件保存),用户增加,题目增加,题目测试,题目答题等等

目录 1、这是我大一自己写的小代码&#xff0c;现在翻到了就分享出来&#xff0c;高手勿喷。 2、项目运行 3、获取完整源码网址 1、这是我大一自己写的小代码&#xff0c;现在翻到了就分享出来&#xff0c;高手勿喷。 2、项目运行 &#xff08;1&#xff09;测试模块 每次…

如何在CentOS系统部署AMH主机面板并实现无公网IP远程连接

文章目录 推荐1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击…

hcia复习总结9

NAT 在ip地址空间中&#xff0c;A,B,C三类地址中各有一部分地址&#xff0c;他们被称为私有地址&#xff08;私网IP地址&#xff09;&#xff0c;其余的所有地址都被称为公有地址&#xff08;公网IP地址&#xff09; A&#xff1a;10.0.0.0-10.255.255.255--相当于一个A类网络…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库&#xff1a;GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库&#xff0c;使用的时候先安装&#xff0c;然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

碳课堂|什么是碳减排?如何减少碳排放?

一、碳减排的定义及提出背景&#xff1a; 碳减排&#xff0c;即减少人类在生产、生活中二氧化碳&#xff08;CO2&#xff09;等温室气体的排放量&#xff0c;以应对全球气候变暖。 18世纪工业革命起&#xff0c;人类在生产活动中使用大量矿物燃料&#xff08;如煤、石油等&am…

el-upload的多个文件与单个文件上传

样式图&#xff1a; 场景多个&#xff1a; 使用el-upload上传多个文件 <el-upload class"upload-demo" :action"uploadUrl" :on-remove"handleRemove1":on-success"handleAvatarSuccess1" multiple :limit"5" :on-exc…

MySQL连接数不足导致服务异常GetConnectionTimeoutException

文章目录 场景复现解决方案一、调整连接数二、优化程序 场景复现 已经上线正常运行的项目突然很多功能无法使用&#xff0c;查看程序日志发现MySQL报错&#xff0c;异常信息: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.Ge…

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…

内衣洗衣机排行榜测评:RUUFFY、希亦、小吉三款全面性能对比

在内衣洗衣机越来越受欢迎的今天&#xff0c;不少朋友都在犹豫要不要买一台内衣洗衣机&#xff0c;专门来清洗一些自身的贴身衣物&#xff0c;这个问题的答案是很有必要的&#xff0c;因为目前市场上的大型洗衣机只是起到了清洁的作用&#xff0c;并不能有效地清洁干净我们的贴…

ssh连接报错:REMOTE HOST IDENTIFICATION HAS CHANGED问题解决

ssh之前连接没有问题&#xff0c;远程主机发生修改后&#xff0c;重新连接&#xff0c;出现如下报错&#xff1a;WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED! 问题原因&#xff1a; ssh-keygen是用于为SSH创建新的身份验证密钥对的工具。此类密钥对用于自动登录&#xf…

如何监听抖音、快手、哔哩哔哩弹幕实现弹幕游戏制作?直播互动助手开放 API 帮你快速构建详细教程

弹幕直播概述 如何监听抖音、快手、哔哩哔哩弹幕实现弹幕游戏制作&#xff1f;随着中短视频平台直播热度的攀升&#xff0c;基于弹幕监听的直播模式也逐渐让大家熟知。如何去进行弹幕直播&#xff0c;去实现基于弹幕和礼物的直播新模式。边缘骇客直播互动助手是一款兼容大部分…

学会用AI写文案,一分钟就能做一条爆款短视频:方法简单可复制

在这个信息爆炸的时代,短视频已成为人们获取信息、娱乐和社交的重要方式。而一条爆款短视频,除了精彩的画面和音乐外,文案的作用也不容忽视。 学会用AI写短视频文案,能够让你在竞争激烈的市场中脱颖而出,快速吸引观众的注意力。本文将为你揭示如何利用AI快速写出爆款短视…

sentinel基本流控

基本流控 规则配置 这里和控制台显示的属性一一对应 /*** 规则id、资源名、针对来源 这三个字段在父类 AbstractRule 里*/ public class FlowRule extends AbstractRule {// 阈值类型&#xff1a;1 代表 QPS&#xff1b;0 代表 并发线程数private int grade RuleConstant.F…

AI检测识别技术,为智能化视频生产赋能

在科技飞速发展的今天&#xff0c;智能化生产已经成为企业提高效率、降低成本、增强竞争力的关键所在。美摄科技&#xff0c;作为一家在音视频处理技术领域保持领先的创新型企业&#xff0c;不仅致力于提供卓越的音视频处理技术&#xff0c;更在AI检测识别领域积累了深厚的实力…

LayerNormalization 和 RMSNormalization的计算方法和区别

目录 问题来源 Layer Normalization 与 RMSNormalization 的详细计算方法 Layer Normalization&#xff08;层归一化&#xff09; RMSNormalization&#xff08;均方根归一化&#xff09; Layer Normalization与RMSNormalization的异同 Layer Normalization RMSNormaliza…

【WEEK3】 【DAY4】JSON交互处理第三部分【中文版】

2024.3.14 Thursday 接上文【WEEK3】 【DAY3】JSON交互处理第二部分【中文版】 目录 6.7.编写抽象类6.7.1.原因6.7.2.新建JsonUtils.java6.7.3.在UserController添加一个方法json6验证抽象类可调用6.7.4.在UserController添加一个方法json7验证该抽象类可复用6.7.5.运行 6.8.…