unity3d中调用打开和保存对话框(PC发布)

前两天想用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); 
} 
  
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
这是C#引用非托管的C/C++的DLL的一种定义定义结构体的方式,主要是为了内存中排序,LayoutKind有两个属性Sequential和Explicit
Sequential表示顺序存储,结构体内数据在内存中都是顺序存放的
Explicit表示精确布局,需要用FieldOffset()设置每个成员的位置
这都是为了使用非托管的指针准备的,知道什么意思就行,C#的CLR提供了更为灵活的自动管理方式,所以对C#来说可有可无。
CharSet=CharSet.Ansi表示编码方式
OpenfileName里面是对话框的一些基本属性,在实例化的时候根据情况写。
下面

这个是c#动态调用dll的一种方式。c#需要调用外部dll的方法,那么需要告诉编译器,引进的dll的名称,要调用该dll的哪个方法(动态入口点),以及调用的方式。这三个是主要的,CharSet 这种的设置就依情况而定了。然后用到win32的两个api:OpenFileName   和  SaveFileName  然后是unity


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; 
  
    } 
  
  
}
源码分享
http://pan.baidu.com/s/1dD7zcRn

你可能感兴趣的:(unity3d中调用打开和保存对话框(PC发布))