解释这个脚本中每句代码的意思
时间: 2024-10-19 18:17:10 浏览: 22
大麦抢票脚本项目代码.zip
这个脚本是用于在Unity中实现文件对话框(打开和保存)的功能。以下是对每个部分的详细解释:
### 命名空间和类定义
```csharp
using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.IO;
public static class FileDialogForWindows
{
```
- `using` 指令:导入所需的命名空间,以便使用相应的类和方法。
- `public static class FileDialogForWindows`:定义一个静态类 `FileDialogForWindows`,用于封装文件对话框的相关功能。
### 对话框配置结构体
```csharp
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class DialogConfig
{
#region Config Field
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;
#endregion
}
```
- `[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]`:指定结构体的布局方式和字符集。
- `DialogConfig` 类:定义了一个结构体,用于配置文件对话框的各种参数。
### Windows API 封装
```csharp
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
static extern bool GetOpenFileName([In, Out] DialogConfig dialog);
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
static extern bool GetSaveFileName([In, Out] DialogConfig dialog);
```
- `[DllImport]`:导入Windows API函数。
- `GetForegroundWindow`:获取当前活动窗口的句柄。
- `GetOpenFileName` 和 `GetSaveFileName`:分别用于显示“打开文件”和“另存为”对话框。
### 过滤器辅助方法
```csharp
static string Filter(params string[] filters)
{
return string.Join("\0", filters) + "\0";
}
```
- `Filter` 方法:将多个过滤器字符串连接成一个符合要求的格式。
### 文件打开对话框方法
```csharp
public static string FileDialog(string title, params string[] extensions)
{
DialogConfig ofn = new DialogConfig();
ofn.structSize = Marshal.SizeOf(ofn);
var filters = new List<string>();
filters.Add("All Files");
filters.Add("*.*");
foreach (var ext in extensions)
{
filters.Add(ext);
filters.Add("*" + ext);
}
ofn.filter = Filter(filters.ToArray());
ofn.filterIndex = 2;
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 = title;
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;
ofn.dlgOwner = GetForegroundWindow();
if (!GetOpenFileName(ofn))
{
return null;
}
return ofn.file;
}
```
- `FileDialog` 方法:显示文件打开对话框。
- `ofn`:创建并初始化 `DialogConfig` 结构体。
- `filters`:添加文件过滤器。
- `ofn.filter`:设置过滤器。
- `ofn.file` 和 `ofn.fileTitle`:分配缓冲区以存储选定的文件路径和标题。
- `ofn.initialDir`:设置初始目录。
- `ofn.title`:设置对话框标题。
- `ofn.flags`:设置对话框标志。
- `ofn.dlgOwner`:设置对话框的所有者窗口。
- `GetOpenFileName(ofn)`:调用API显示对话框。
- 返回选定的文件路径。
### 文件保存对话框方法
```csharp
public static string SaveDialog(string title, string path)
{
var extension = Path.GetExtension(path);
DialogConfig ofn = new DialogConfig();
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = Filter("All Files", "*.*", extension, "*" + extension);
ofn.filterIndex = 2;
var chars = new char[256];
var it = Path.GetFileName(path).GetEnumerator();
for (int i = 0; i < chars.Length && it.MoveNext(); ++i)
{
chars[i] = it.Current;
}
ofn.file = new string(chars);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
ofn.initialDir = Path.GetDirectoryName(path);
ofn.title = title;
ofn.flags = 0x00000002 | 0x00000004;
ofn.dlgOwner = GetForegroundWindow();
if (!GetSaveFileName(ofn))
{
return null;
}
return ofn.file;
}
```
- `SaveDialog` 方法:显示文件保存对话框。
- `extension`:获取文件扩展名。
- `ofn`:创建并初始化 `DialogConfig` 结构体。
- `ofn.filter`:设置过滤器。
- `chars` 和 `it`:初始化文件名缓冲区。
- `ofn.file` 和 `ofn.fileTitle`:分配缓冲区以存储文件路径和标题。
- `ofn.initialDir`:设置初始目录。
- `ofn.title`:设置对话框标题。
- `ofn.flags`:设置对话框标志。
- `ofn.dlgOwner`:设置对话框的所有者窗口。
- `GetSaveFileName(ofn)`:调用API显示对话框。
- 返回选定的文件路径。
阅读全文