【Unity3D日常开发】Unity3D中打开Window文件对话框打开文件(PC版)

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • QQ群:398291828
  • 小红书
  • 小破站

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

这篇文章继续讲如何使用Unity3D打开Window文件对话框选择文件。

之前写了一篇:【Unity3D日常开发】Unity3D中适用WEBGL打开Window文件对话框打开/上传文件是基于WEBGL的。

这篇文章是基于PC端的,也就是打包后是exe的版本。

效果图:
在这里插入图片描述

二、正文

2-1、解决方案

WEBGL端打开Window文件对话框原理是通过Unity3D去调用JavaScript脚本来完成操作。

PC端是通过调用Window系统的动态链接库Comdlg32.dll来打开Window操作系统中的通用对话框函数。

2-2、实现

(1)引入外部动态库

PC端是通过调用Window系统的动态链接库Comdlg32.dll,这个库是Windows操作系统中包含通用对话框函数(如文件对话框)的库。代码如下:

[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]

其中SetLastError = true表示将上一个错误代码设置为非零值。这对于调试和错误处理非常有用。如果调用失败,可以通过检查 Marshal.GetLastWin32Error() 获取错误代码。

而CharSet = CharSet.Auto表示字符集由运行时环境自动选择。

(2)声明GetOpenFileName函数
然后我们需要调用GetOpenFileName函数。这个函数是 Windows 操作系统提供的一个 API 函数,用于显示标准的文件打开对话框。该对话框允许用户选择一个或多个文件,并返回用户所选文件的路径信息。代码如下:

public static extern bool GetOpenFileName([In, Out] OpenFileName ofd);

从关键字extern可以看出,该函数是一个本机方法,其实现并不在C#中,而是在本机代码中。

[In, Out]是修饰符,用于指定参数是既输入又输出的(类似于引用传参)。

(3)封装OpenFileName对象
该函数接收一个OpenFileName 类型的参数,因此需要封装一个该类型的类对象,代码如下:

/// <summary>
/// 文件日志类
/// </summary>
// [特性(布局种类.有序,字符集=字符集.自动)]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
{public int structSize = 0;public IntPtr dlgOwner = IntPtr.Zero;public IntPtr instance = IntPtr.Zero;public String filter = null;public String customFilter = null;public int maxCustFilter = 0;public int filterIndex = 0;public String file = null;public int maxFile = 0;public String fileTitle = null;public int maxFileTitle = 0;public String initialDir = null;public String title = null;public int flags = 0;public short fileOffset = 0;public short fileExtension = 0;public String defExt = null;public IntPtr custData = IntPtr.Zero;public IntPtr hook = IntPtr.Zero;public String templateName = null;public IntPtr reservedPtr = IntPtr.Zero;public int reservedInt = 0;public int flagsEx = 0;public OpenFileName(){this.structSize = Marshal.SizeOf(this);this.filter = "Texure Files(*图片文件)\0*.png;*.jpg;*.bmp;*.jpeg\0";this.file = new string(new char[256]);this.maxFile = this.file.Length;this.fileTitle = new string(new char[64]);this.maxFileTitle = this.fileTitle.Length;this.initialDir = "C:\\"; //默认路径this.title = "打开项目";this.defExt = "JPG";this.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;}
}

该结构体需要满足WindowsAPI所期望的格式,所以可以将它当作固定用法,这里就不作解释。

(4)调用GetOpenFileName函数

上述准备工作做完后就可以调用函数了,代码如下:

void BtnOpenFileEvent()
{OpenFileName path = new OpenFileName();if (GetOpenFileName(path)){}
}

首先实例化一个OpenFileName对象,并且实例化。

然后通过调用GetOpenFileName函数,该函数返回一个bool值,通常用于表示用户是否成功选择了文件并点击了文件对话框的 “打开” 按钮。因此当返回值为true时,返回获取到的文件地址即可。

*注意,经过实际测试,想要正常打开文件对话框似乎需要确保以管理员权限运行。

(5)新建一个Image用来显示图片,一个Button用来调用打开文件夹的操作

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;public class OpenFileHandle : MonoBehaviour
{public Button BtnOpenFile;public Image showImg;//打开文件[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]public static extern bool GetOpenFileName([In, Out] OpenFileName ofd);void Start(){BtnOpenFile.onClick.AddListener(BtnOpenFileEvent);}void BtnOpenFileEvent(){OpenFileName path = new OpenFileName();if (GetOpenFileName(path)){string filepath = path.file;StartCoroutine(ReadTexture(filepath, LoadImg));}}/// <summary>/// 读取图片/// </summary>/// <param name="path"></param>/// <param name="action"></param>/// <returns></returns>IEnumerator ReadTexture(string path, UnityAction<Texture> action){Debug.Log(path);UnityWebRequest request = UnityWebRequestTexture.GetTexture(path);yield return request.SendWebRequest();if (request.isNetworkError || request.isHttpError){Debug.Log(request.error);}else{byte[] imgdata = request.downloadHandler.data;action(DownloadHandlerTexture.GetContent(request));}}/// <summary>/// 加载图片/// </summary>/// <param name="texture"></param>void LoadImg(Texture texture){Sprite ImgSprite = Sprite.Create((Texture2D)texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));showImg.sprite = ImgSprite;}
}

效果图:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 逆向学习 - Inter-Process Communication:进程间通信

iOS 逆向学习 - Inter-Process Communication&#xff1a;进程间通信 一、进程间通信概要二、iOS 进程间通信机制详解1. URL Schemes2. Pasteboard3. App Groups 和 Shared Containers4. XPC Services 三、不同进程间通信机制的差异四、总结 一、进程间通信概要 进程间通信&am…

零基础 监控数据可视化 Spring Boot 2.x(Actuator + Prometheus + Grafana手把手) (上)

一、安装Prometheus Releases prometheus/prometheus GitHubhttps://github.com/prometheus/prometheus/releases 或 https://prometheus.io/download/https://prometheus.io/download/ 1. 下载适用于 Windows 的二进制文件&#xff1a; 找到最新版本的发布页面&#xf…

【API】免费调用Qwen-vl2对图像打标

首次调用通义千问API_大模型服务平台百炼(Model Studio)-阿里云帮助中心https://help.aliyun.com/zh/model-studio/getting-started/first-api-call-to-qwen?spma2c4g.11186623.help-menu-2400256.d_0_1_0.8c693048HxtUzZ&scm20140722.H_2840915._.OR_help-T_cn~zh-V_1 一…

CF 371A.K-Periodic Array(Java实现)

题目分析 这里的意思是一共n个值每k个一组循环&#xff0c;最少改变多少个值就能让循环相同 思路分析 我在这里首先想的是二维数组方便观察循环&#xff0c;依据题目即为每一竖列比较&#xff0c;哪一个值出现的最少那么那就是需要更改的次数&#xff0c;(此题在这儿不考虑需要…

信息科技伦理与道德3:智能决策

1 概述 1.1 发展历史 1950s-1980s&#xff1a;人工智能的诞生与早期发展热潮 1950年&#xff1a;图灵发表了一篇划时代的论文&#xff0c;并提出了著名的“图灵测试”&#xff1b;1956年&#xff1a;达特茅斯会议首次提出“人工智能”概念&#xff1b;1956年-20世纪70年代&a…

一路相伴,非凸科技助力第49届ICPC亚洲区决赛

2024年12月27日-29日&#xff0c;第49届国际大学生程序设计竞赛亚洲区决赛在西北工业大学圆满举行。非凸科技再次作为EC Final的主要赞助方&#xff0c;鼎力支持这群心怀梦想的青年才俊&#xff0c;激励他们勇攀科技高峰&#xff0c;实现创新突破。 EC Final参赛名额主要由当…

MPLS原理及配置

赶时间可以只看实验部分 由来&#xff1a;90年代中期&#xff0c;互联网流量的快速增长。传统IP报文依赖路由器查询路由表转发&#xff0c;但由于硬件技术存在限制导致转发性能低&#xff0c;查表转发成为了网络数据转发的瓶颈。 因此&#xff0c;旨在提高路由器转发速度的MPL…

《机器学习》——TF-IDF(关键词提取)

文章目录 TF-IDF简介TF-IDF应用场景TF-IDF模型模型参数主要参数 TF-IDF实例实例步骤导入数据和模块处理数据处理文章开头和分卷处理将各卷内容存储到数据帧jieba分词和去停用词处理 计算 TF-IDF 并找出核心关键词 TF-IDF简介 TF - IDF&#xff08;Term Frequency - Inverse Do…

【计算机网络】窥探计网全貌:说说计算机网络体系结构?

标签难度考察频率综合题⭐⭐⭐60% 这个问题在计算机网络知识体系中是一个比较重要的问题&#xff0c;只有完整地了解计算机网络的体系结构才能清晰地认识网络的运行原理。 在回答这个问题时&#xff0c;笔者认为有几个比较重要的点&#xff1a; 首先一定要分清楚前置条件&am…

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…

【解决】okhttp的java.lang.IllegalStateException: closed错误

问题 Android 使用OKHttp进行后端通信&#xff0c;后端处理结果&#xff0c;反馈给前端的responseBody中其实有值&#xff0c;但是一直报异常&#xff0c;后来才发现主要是OkHttp请求回调中response.body().string()只能有效调用一次&#xff0c;而我使用了两次&#xff1a; 解…

从硬件设备看Linux

一、介绍 DM3730通过各种连接方式连接了各种设备&#xff0c;输入输出设备根据不同的类型大体可 以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM 3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连…

【优选算法】DC-Quicksort-Mysteries:分治-快排的算法之迷

文章目录 1.概念解析2.颜色分类3.排序数组4.数组中的第k个最大元素5.库存管理Ⅲ希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 本篇是优选算法之分治-快排&#xff0c;快排可以在更短的时间内完成相同规模数据的排序任务&#xff0c;大大提升了…

浅谈云计算09 | 服务器虚拟化

服务器虚拟化基础 一、虚拟化的定义二、系统虚拟化三、服务器虚拟化的核心要义四、典型实现&#xff1a;探索不同路径五、全虚拟化与半虚拟化六、主流服务器虚拟化技术 一、虚拟化的定义 虚拟化是一种将物理资源抽象为逻辑资源的技术&#xff0c;通过在物理硬件与操作系统、应…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一&#xff0c;它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范&#xff0c;每个HTML元素都被视为一个矩形盒子&#xff0c;这个盒子由以下四个部分组成&#xff1a; 内容区&#xff08;Content area&#xff…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …