前两天想用unity3d调用一下打开和保存对话框,网上学习了一下,希望能给有用到的朋友一点帮助。这里有点小问题,最开始想引用system.windows.forms,用openfiledialog和savefiledialog,但是unity会直接崩溃这个我不知道是什么问题,如果有人知道的话能给说一下吗。。。最后用到的是win32的方式才成功的
using UnityEngine; using System.Collections; using System; using System.Runtime.InteropServices; [ 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 class DllTest { [DllImport("Comdlg32.dll",SetLastError=true,ThrowOnUnmappableChar=true, CharSet = CharSet.Auto)] public static extern bool GetOpenFileName([In, Out] OpenFileName ofn); public static bool GetOpenFileName1([ In, Out ] OpenFileName ofn ) { return GetOpenFileName(ofn); } [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)] public static extern bool GetSaveFileName([In, Out] OpenFileName ofn); public static bool GetSaveFileName1([In, Out] OpenFileName ofn) { return GetSaveFileName(ofn); } }
using UnityEngine; using System.Collections; using System.Text; using System.Runtime.InteropServices; using System; using System.IO; public class Test : MonoBehaviour { void OnGUI() { if (GUI.Button(new Rect(0, 0, 100, 35), "OpenDialog")) { OpenFileName ofn = new OpenFileName(); ofn.structSize = Marshal.SizeOf(ofn); ofn.filter = "All Files\0*.*\0\0"; ofn.file = new string(new char[256]); ofn.maxFile = ofn.file.Length; ofn.fileTitle = new string(new char[64]); ofn.maxFileTitle = ofn.fileTitle.Length; ofn.initialDir = UnityEngine.Application.dataPath;//默认路径 ofn.title = "Open Project"; //注意 一下项目不一定要全选 但是0x00000008项不要缺少 ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR if (DllTest.GetOpenFileName(ofn)) { StartCoroutine(WaitLoad(ofn.file)); } } if (GUI.Button(new Rect(0, 100, 100, 35), "SaveDialog")) { OpenFileName ofn = new OpenFileName(); ofn.structSize = Marshal.SizeOf(ofn); ofn.filter = "All Files\0*.*\0\0"; ofn.file = new string(new char[256]); ofn.maxFile = ofn.file.Length; ofn.fileTitle = new string(new char[64]); ofn.maxFileTitle = ofn.fileTitle.Length; ofn.initialDir = UnityEngine.Application.dataPath;//默认路径 ofn.title = "Save Project"; ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008; if (DllTest.GetSaveFileName(ofn)) { StartCoroutine(WaitSave(ofn.file)); } } } IEnumerator WaitLoad(string fileName) { FileInfo fi = new FileInfo(fileName); fi.CopyTo(UnityEngine.Application.dataPath + "/Resources/a.txt", true); yield return fi; } IEnumerator WaitSave(string fileName) { FileInfo fi = new FileInfo(UnityEngine.Application.dataPath + "/Resources/a.txt"); fi.CopyTo(fileName, true); yield return fi; } }源码分享