Unity 打开对话框
Pin Young Lv9

编辑模式(Editor)下:

1
2
3
4
5
6
7

string path = EditorUtility.OpenFilePanel("Load png Textures of Directory", "", "");
WWW www = new WWW("file:///" + path);
Debug.Log(www.url);
yield return www;
gui.texture = www.texture;

非编辑模式

1
2
3
4
5
6
7
8
9

OpenFileDialog diglog = new OpenFileDialog();
diglog.InitialDirectory = "file://" + UnityEngine.Application.dataPath; //定义打开的默认文件夹位置//定义打开的默认文件夹位置
if(ofd.ShowDialog() == DialogResult.OK)
{
// todo: 显示打开文件的窗口
Debug.Log(ofd.FileName);
}

注意: 以上操作需要添加 System.Windows.Forms.dll,放在Plugins文件夹下,同时需要更改.net 2.0 Subset为.net2.0

![http://tdou-cc.tdouguo.com/u3d_diglog/no_editor.jpg]

unity3d调用win32打开对话框

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
DllTest

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);
}
}

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
56
57
58
59
60
61
62
63
64
65
using UnityEngine;

using System.Collections;

using System.Text;

using System.Runtime.InteropServices;

using System;

public class Test : MonoBehaviour {

public GameObject plane;

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";

ofn.defExt = "JPG";//显示文件的类型
//注意 一下项目不一定要全选 但是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));//加载图片到panle

Debug.Log( "Selected file with full path: {0}"+ofn.file );

}

}

}

IEnumerator WaitLoad(string fileName)
{
WWW wwwTexture=new WWW("file://"+fileName);

Debug.Log(wwwTexture.url);

yield return wwwTexture;

plane.renderer.material.mainTexture=wwwTexture.texture;
}
}

![http://tdou-cc.tdouguo.com/u3d_diglog/u3d2win32-01.jpg]
![http://tdou-cc.tdouguo.com/u3d_diglog/u3d2win32-02.jpg]

参考知识:

  1. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.inattribute%28v=vs.85%29
  2. http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839%28v=vs.85%29.aspx
  3. C#和win32类型对应
  4. http://blog.csdn.net/wanfang323/article/details/6372995
  5. https://www.cnblogs.com/U-tansuo/archive/2012/07/10/GetOpenFileName.html

原文地址: 传送门