Unity调用Win32的打开和保存文件对话框

Unity调用Win32的打开和保存文件对话框

原创  2017年06月20日 16:10:02
  • 955

在window平台下,有时我们需要打开或则保存一些东西到指定目录下,这时我们不需要再重复造轮子,完全可以调用系统的文件窗口,具体的调用如下:

第一步:创建打开窗口和保存窗口的类。

using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System;

namespace Common
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class FileDlg
    {
        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;
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenFileDlg : FileDlg
    {

    }
    public class OpenFileDialog
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetOpenFileName([In, Out] OpenFileDlg ofd);
    }
    public class SaveFileDialog
    {
        [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern bool GetSaveFileName([In, Out] SaveFileDlg ofd);
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class SaveFileDlg: FileDlg
    {

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

第二步:调用刚才创建的类,使用事件系统绑定以下两个方法。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Common;
public class FileControllor : MonoBehaviour 
{

public void OpenProject()
    {
        OpenFileDlg pth = new OpenFileDlg();
        pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
        pth.filter = "txt (*.txt)";
        pth.file = new string(new char[256]);
        pth.maxFile = pth.file.Length;
        pth.fileTitle = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir = Application.dataPath;  // default path  
        pth.title = "打开项目";
        pth.defExt = "txt";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
        if (OpenFileDialog.GetOpenFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  
            Debug.Log(filepath);
        }
    }
public void SaveProject()
    {
        SaveFileDlg pth = new SaveFileDlg();
        pth.structSize = System.Runtime.InteropServices.Marshal.SizeOf(pth);
        pth.filter = "txt (*.txt)";
        pth.file = new string(new char[256]);
        pth.maxFile = pth.file.Length;
        pth.fileTitle = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir = Application.dataPath;  // default path  
        pth.title = "保存项目";
        pth.defExt = "txt";
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
        if (SaveFileDialog.GetSaveFileName(pth))
        {
            string filepath = pth.file;//选择的文件路径;  
            Debug.Log(filepath);
        }
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

最终效果如下: 
打开文件对话框 
这里写图片描述
保存文件对话框: 
这里写图片描述

 

Unity跨平台原生文件对话框插件StandaloneFileBrowser实战指南 在桌面应用开发中,文件对话框是用户与本地文件系统交互的基础组件,其核心原理是通过操作系统提供的原生API实现文件选择与保存功能。从技术价值看,原生对话框不仅能提供符合用户操作习惯的交互体验,还能确保最佳的性能与稳定性。在跨平台开发场景下,直接调用各平台原生API(如Windows的Win32 API、macOS的Cocoa框架、Linux的GTK/命令行工具)需要处理复杂的平台差异,这催生了StandaloneFileBrowser这样的封装解决方案。该插件通过统一的C# API抽象了底层平台实现,让开发者 阅读详情

相关推荐

跨平台文件对话框:Unity/Electron/Qt开发中的原生体验统一方案

在桌面应用开发中,文件操作是基础且高频的需求,涉及用户与本地文件系统的交互。其核心原理在于通过操作系统提供的原生API(如Windows的IFileOpenDialog、macOS的NSOpenPanel、Linux的GTK/Qt对话框)来调用系统级文件选择界面。这项技术的价值在于,它能够为应用提供符合用户操作系统习惯的原生交互体验,并直接处理文件系统的访问权限。然而,在跨平台开发场景下,直接使用这些平台特定的API会导致代码充斥着条件编译,严重损害代码的可维护性,并可能因平台差异引发权限、路径格式不一致等

afeyfre41671的博客 416

unity多种方式实现文件选择和保存窗口

找到unity所在的安装路径下的Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\,注意不要复制错了,其他路径也会有同名的库,但是打包之后会出现报错的情况。编辑器的模式,可以利用EditorUtility类里面的方式实现,需要引用UnityEditor命名空间。由于方法也是从网上多个博主学习参考过来的,有些参数我也不太了解,感兴趣的可以自己研究一下。但此种办法终究是治标不治本,功能实现起来略微别扭,于是出现了第三种实现方法。

qq_42914882的博客 7006

3种 Unity 文件弹框方案对比:原生API、Win32 P/Invoke 与开源插件

本文全面对比了Unity开发中三种文件弹框方案:原生EditorUtility API、Win32 P/Invoke调用和开源插件。详细分析了每种方案的技术原理、适用场景和性能表现,特别关注了选择文件和选择文件夹等核心功能的实现差异,为开发者提供技术选型建议和优化策略。

weixin_29007135的博客 276

Unity调用Windows弹框(User32.dll/System.Windows.Forms.dll)

switch (MsgBoxBase.Show("Chinar,是 | 否,灯泡", GetType().Name, WinForms.MessageBoxButtons.YesNo, WinForms.MessageBoxIcon.Information))MsgBoxBase.Show("Chinar,OK按钮,警告", GetType().Name, WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Warning);print("对");

GarFe的博客 3727

Unity打开windows窗口

本项目有以下几个功能: 1.打开windows窗口 2.另存为 3.打开文件夹目录 4.上述都是打开窗口,第四条功能是打开文件浏览器

unity3d调用通用文件夹对话框

这个程序是unity3d的。本程序是功能主要是给当前场景照相,并调用通用文件夹对话框,自己选择路径和文件名保存图片。

Unity 打开Windows文件窗口

Unity 打开Windows文件窗口。

记录 1905

【实战指南】Jaspersoft Studio + JasperReports:从零构建企业级PDF报表

本文详细介绍了如何使用Jaspersoft Studio和JasperReports从零构建企业级PDF报表。通过可视化设计、数据连接、模板设计到最终输出的全链路支持,这套组合方案显著降低了报表开发的维护成本。文章还提供了开发环境搭建、中文乱码解决方案、Java集成代码及性能优化技巧,适合需要高效生成复杂PDF报表的开发者。

weixin_42666036的博客 246

Unity 保存/打开 系统文件

Unity 保存/打开 系统文件

qq_44810574的博客 643

Hodgkin-Huxley Model

介绍了经典的动力学模型:HH Model

weixin_73557167的博客 2473

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

Unity操作文件对话框

unity中调用打开文件窗口和保存窗口

杨绵的博客 5585

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 161

Unity 调用Win32系统保存对话框,带默认文件名

网上很多Unity调系统保存对话框的,但没有对话框中带默认值的,花了一天时间解决了带默认值的问题。 下面是代码,希望大家少走弯路,工作顺利。 //name就是默认值, sfn.file = name这个语句需要放在sfn.maxFile = sfn.file.Length语句后面,要不然会一直报错。 public static string OpenFileDlgToSave(string ...

weixin_38548431的博客 953

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

使用R语言整理GEO数据的简易教程

本教程介绍了使用R语言从GEO数据库下载数据并进行数据整理的基本步骤。根据实际研究问题,你可能需要进行更复杂的数据处理和分析。R语言作为一种强大的生物信息学工具,为GEO数据的整理、分析和可视化提供了丰富的功能和工具。希望这个教程能够帮助你入门GEO数据整理和R语言的应用。如果你在使用过程中遇到问题,或需要进一步的指导,请随时向我询问。祝你在GEO数据分析的旅程中取得成功!

Mrrunsen的博客 3740

◄ Unity 『功能总结』►——调用FileDialog(window弹框/调取本地文件)

调用FileDialog(window弹框/调取本地文件) 首先写好Win32调用类 using UnityEngine; using System.Collections; using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class OpenFileName { #region Config Fiel

八哥爱柠檬的博客 1912

OCR文字识别领域经典论文总结

本篇将介绍文字识别经典论文,内容包括文字检测、文字识别、端到端识别等方法,具体将分别对论文算法简介、思路、代码等几个部分展开介绍。目前各部分只举例经典论文,算法没有全部写完,后续会将在此部分基础上更新更多论文综述及代码实战部分。.................................

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 1万+

【UnityTools】Unity调用Window原生对话框,获取本地文件路径和保存文件夹路径

Unity调用Window原生对话框,获取本地文件路径和保存文件夹路径

Master__Y的博客 924

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1232

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity调用Windows原生文件对话框:P/Invoke与Win32 API实战指南

在跨平台应用开发中,实现本地文件系统交互是基础且关键的需求。其核心原理在于托管代码(如C#)与非托管系统API之间的通信,这通常通过平台调用服务(P/Invoke)实现。P/Invoke负责数据类型编组和调用约定转换,是连接.NET环境与底层操作系统功能的桥梁。这项技术的工程价值在于能够直接调用系统原生组件,从而获得最佳的性能、稳定性以及与操作系统一致的用户体验。在Unity引擎的桌面平台开发中,一个典型的应用场景就是需要弹出Windows风格的原生文件选择对话框。通过P/Invoke调用Comdlg32.

weixin_28077113的博客 263

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Unity|打开文件对话框批量选择文件_该用户还没想到昵称_新浪博客

最近在做图片/PDF文件转文字的一个工具,需要实现批量导入外部文件功能,总结一下相关方法。 方法一:使用windows窗体函数 获取System.Windows.Forms.dll文件:到Unity安装路径( Editor\Data\Mono\lib\mono\2.0)中将System.Windows.Forms.dll复制到相关工程的Plugins目录下; 修改Edit -...

该用户还没想到好的昵称的博客 975

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Unity独立应用文件浏览器开发指南:跨平台原生对话框集成与自定义UI实现

在桌面应用开发中,文件系统交互是基础且关键的功能模块,其核心在于提供稳定、原生的用户体验。跨平台文件对话框通过封装不同操作系统的原生API(如Windows的GetOpenFileName、macOS的NSOpenPanel),实现了统一的调用接口,解决了运行时环境下的文件选择难题。这一技术对于提升工具软件、内容创作平台等独立应用的专业度至关重要。在Unity引擎中,StandaloneFileBrowser插件正是这一原理的工程实践,它作为桥梁,将复杂的平台差异封装为简洁的C#接口。开发者借此可快速实现文

agcozdwdfvds08078的博客 453

Unity调用Windows原生文件对话框:P/Invoke与Comdlg32.dll实战指南

在桌面应用开发中,文件系统交互是基础且关键的功能,它直接关系到应用的专业性和用户体验。其核心原理是通过操作系统提供的原生API,实现与本地文件系统的安全、高效通信。在Windows平台上,这通常涉及调用系统动态链接库(DLL)中的函数。P/Invoke(平台调用)技术是实现这一目标的关键,它允许托管代码(如C#)安全地调用非托管DLL中的函数,是.NET生态中实现系统级功能集成的标准方式。这项技术的价值在于,它使开发者能够绕过高级框架的限制,直接利用操作系统提供的丰富、稳定且性能优异的底层功能,从而实现对应

weixin_29002595的博客 323

Unity调用Windows原生文件对话框:P/Invoke封装与实战避坑指南

在跨平台应用开发中,与操作系统原生功能交互是常见的工程需求。通过平台调用(P/Invoke)技术,托管代码能够安全地调用非托管动态链接库中的函数,这是实现深度系统集成的核心技术原理。这项技术为应用带来了无缝的原生用户体验和更高的专业性,尤其适用于需要直接操作文件系统、硬件或系统服务的场景。在Unity引擎的Windows平台开发中,一个典型应用就是调用系统原生文件对话框,以替代或补充Unity内置的有限文件操作功能。这涉及到对Win32 API中Comdlg32.dll的GetOpenFileName等函数

weixin_29014237的博客 238
上一篇: Python 几个重要的内置函数
下一篇: unity----OpenFileDialog打开选择对话框
hypercube2
博客等级 码龄18年 23粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值