Unity3d制作一个简单的打开保存对话框-编写核心代码(1)

来源:互联网 发布:网络外汇销售的骗局 编辑:程序博客网 时间:2024/05/21 09:20

使用Unity3d制作一个简单的打开保存对话框-编写核心代码

 

前言:

前面我曾经提到过使用unity3d调用windows的打开和保存对话框的功能,但是我们发现这样在unity中可能会出现崩溃的问题,而且出现的情况貌似还有差异,因为看到有人在问我突然崩溃了怎么办,但是我这边项目的测试时候并没有出现过类似的情况,进而考虑到UI的风格必须要和windows自带的一样,那么如果我们想定制自己项目风格的UI呢,又或是多平台的发布和使用。从上面这些问题看来,仅仅使用win32的方式动态调用dll来使用保存和打开的对话框远远不能满足我们的需求,所以我们还是自己来做一套属于自己项目的打开和保存对话框的功能好了,这样也便于我们控制和管理。尽管本身制作的难度比较低,,,,那么我将分为几次来将整个制作方式写出来可以供大家参考。

 

获取整个所需要的目录路径以及其子目录

 

我们主要从FindDirectory来设计

 私有变量 

 

//当前文件目录

private string _currentDirectoryPath;

 

//当前文件目录下子目录

private ArrayList _directoriesPath;

//对应子目录的名称

private string [] _directoryName;

 

//当前目录下的文件的路径

private ArrayList _filesPath;

//对应文件的名称

private string [] _fileName;

 

//是否找到指定的文件

private bool _findFilesOrNot;

#endregion

 

#region Get Set方法

 

/// <summary>

/// 获取当前文件目录以及设置

/// </summary>

/// <value>The current directory path.</value>

public string CurrentDirectoryPath { }

 

/// <summary>

/// 子目录文件夹路径获取

/// </summary>

/// <value>The directories path found.</value>

public string[] DirectoriesPathFound {}

 

/// <summary>

/// 获取目录的名称

/// </summary>

/// <value>The directory name found.</value>

public string[] DirectoryNameFound {

get { return _directoryName; }

}

 

/// <summary>

/// 获取目录下的文件路径

/// </summary>

/// <value>The files path found.</value>

public string[] FilesPathFound{}

 

/// <summary>

/// 获取文件名称

/// </summary>

/// <value>The file name found.</value>

public string[] FileNameFound {}

 

 

 构造函数

 

/// <summary>

/// 默认构造函数

/// </summary>

public FindDirectory(){}

 

/// <summary>

/// 含当前文件目录路径的构造函数

/// </summary>

/// <param name="_currentDirectoryPath">_current directory path.</param>

public FindDirectory(string _currentDirectoryPath){}

 

 公共方法

 

 

/// <summary>

/// 寻找当前目录下的文件

/// </summary>

public void Find() {}

 

私有方法

 

/// <summary>

/// 寻找该目录下的内容

/// </summary>

private void FindProcess(string target){}

下面我会附上实现的FindDirectory类的代码。本身并没有太大的难度,主要是对目录以及其文件进行一次合理地封装。

 

using System.Collections;using System.IO;using System;/// <summary>/// 获取文件目录以及文件类/// </summary>public class FindDirectory  {#region 私有变量 //当前文件目录private string _currentDirectoryPath;//当前文件目录下子目录private ArrayList _directoriesPath;//对应子目录的名称private string [] _directoryName;//当前目录下的文件的路径private ArrayList _filesPath;//对应文件的名称private string [] _fileName;//是否找到指定的文件private bool _findFilesOrNot;#endregion#region Get Set方法/// <summary>/// 获取当前文件目录以及设置/// </summary>/// <value>The current directory path.</value>public string CurrentDirectoryPath {get { return _currentDirectoryPath; }set { _currentDirectoryPath = value; }}/// <summary>/// 子目录文件夹路径获取/// </summary>/// <value>The directories path found.</value>public string[] DirectoriesPathFound {get {//新建存放文件夹路径string[] directories = new string[_directoriesPath.Count];//将存放子目录的动态数组复制一份并返回_directoriesPath.CopyTo(directories);return directories;}}/// <summary>/// 获取目录的名称/// </summary>/// <value>The directory name found.</value>public string[] DirectoryNameFound {get { return _directoryName; }}/// <summary>/// 获取目录下的文件路径/// </summary>/// <value>The files path found.</value>public string[] FilesPathFound{get{string[] files=new string[_filesPath.Count];_filesPath.CopyTo(files);return files;}}/// <summary>/// 获取文件名称/// </summary>/// <value>The file name found.</value>public string[] FileNameFound {get { return _fileName; }}#endregion#region 构造函数/// <summary>/// 默认构造函数/// </summary>public FindDirectory(){_directoriesPath = new ArrayList ();_filesPath = new ArrayList ();}/// <summary>/// 含当前文件目录路径的构造函数/// </summary>/// <param name="_currentDirectoryPath">_current directory path.</param>public FindDirectory(string _currentDirectoryPath){_directoriesPath = new ArrayList ();_filesPath = new ArrayList ();this._currentDirectoryPath = _currentDirectoryPath;}#endregion#region 公共方法/// <summary>/// 寻找当前目录下的文件/// </summary>public void Find(){//当前目录路径不是空且存在if (CurrentDirectoryPath != "" || CurrentDirectoryPath != null) {FindProcess(CurrentDirectoryPath);} else {NGUIDebug.Log("找不到当前文件目录");}}#endregion#region 私有方法/// <summary>/// 寻找该目录下的内容/// </summary>private void FindProcess(string target){try{//清空上次搜索的全部内容’_directoriesPath.Clear();_filesPath.Clear();_directoryName=null;_fileName=null;//获取目录中子目录的名称和路径string[] subDirectoryEntities=Directory.GetDirectories(target);//将该目录下的所有文件夹名称和路径添加进入文件子目录路径foreach(string sub in subDirectoryEntities){_directoriesPath.Add(sub);}//目录名称数组设置为目录路径动态数组的大小_directoryName=new string[_directoriesPath.Count];//将文件目录路径直接全部拷贝到文件目录名称中_directoriesPath.CopyTo(_directoryName);//对文件目录名称进行修正for(int i=0;i<_directoryName.Length;i++){//从字符串末尾获取目录分隔符的位置int endSeparator=_directoryName[i].Trim().LastIndexOf(Path.DirectorySeparatorChar.ToString());//重组文件目录名称,从目录分割符的下一个开始获取_directoryName[i]=_directoryName[i].Substring(endSeparator+1).Trim();}//若获取到文件目录if(_findFilesOrNot){//获取目录下的文件路径和名称string[] fileEntities=Directory.GetFiles(target);foreach(string f in fileEntities){//将目录下的文件路径添加进入文件路径动态数组中_filesPath.Add(f);}//获取文件名称_fileName=new string[_filesPath.Count];//将整个文件路径拷贝给文件名称_filesPath.CopyTo(_fileName);//对文件名称进行修正for(int i=0;i<_fileName.Length;i++){//从字符串末尾获取目录分隔符的位置int endSeparator=_fileName[i].Trim().LastIndexOf(Path.DirectorySeparatorChar.ToString());//重组文件名称,从目录分割符的下一个开始获取_fileName[i]=_fileName[i].Substring(endSeparator+1).Trim();}}}catch(Exception e){}}#endregion}

那么当核心的FindDirectory实现后,我们在unity3d中使用的话那就需要配上我们的UI进行管理。所以我们继续创建一个UIFindDirectory的类,我们对UI中需要进行的操作再进行一次封装,再次封装的内容我下一篇将会继续介绍,那我们为了测试现在的效果,我们可以先在UI的类中进行调用查看效果,下面附上我的测试代码:

using UnityEngine;using System.Collections;public class UIFindDirectory : MonoBehaviour {// Use this for initializationvoid Start () {FindDirectory _findDirectory=new FindDirectory("G:/英雄联盟");_findDirectory.Find();/*string[] _directoryName=_findDirectory.DirectoryNameFound;foreach(string s in _directoryName){Debug.Log(s);}*/string[] _direoryPath=_findDirectory.DirectoriesPathFound;foreach(string s in _direoryPath){Debug.Log(s);}}}

下面附上我本机的测试的结果图:


那么我们第一步便完成了,我们获取了当前目录下的子目录的名称和路径,当然获取当前目录中的文件名称和路径也是可以的,那么你需要稍微调整上面测试代码便可以。下一篇我们将继续从UI的角度来编写一套在unity3d可以使用的UI脚本,进行再一次的功能封装。

 

0 0
原创粉丝点击