笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

Unity工具是游戏制作必须配备的,Unity虽然提供了强大的编辑器,但是对于游戏开发的需求来说还是远远不够的,这也需要我们自己编写一些小工具去实现特定的需求,比如编写遍历资源文件的所有子文件用于打包处理,这些需要我们自己去封装函数接口。

第一步,实现获取存储文件以及子文件的函数:

private static List<string> GetResAllDirPath()
	{
        List<string> ret = AssetBundleBuild.GetAllLocalSubDirs(cAssetsResourcesPath);
        if (DirExistResource(cAssetsResourcesPath))
        {
            if (ret == null)
                ret = new List<string>();
            ret.Add(cAssetsResourcesPath);
        }

        if (ret != null)
            ret.Sort(OnDirSort);
        return ret;
    }

该函数是对外提供的函数,它返回资源的所有文件以及子文件,在该函数中使用了接口

AssetBundleBuild.GetAllLocalSubDirs(cAssetsResourcesPath);

第二步,实现遍历所有子文件函数,它采用的是迭代的遍历:

	public static List<string> GetAllLocalSubDirs(string rootPath)
	{
		if (string.IsNullOrEmpty (rootPath))
			return null;
		string fullRootPath = System.IO.Path.GetFullPath (rootPath);
		if (string.IsNullOrEmpty (fullRootPath))
			return null;

		string[] dirs = System.IO.Directory.GetDirectories (fullRootPath);
		if ((dirs == null) || (dirs.Length <= 0))
			return null;
		List<string> ret = new List<string> ();

		for (int i = 0; i < dirs.Length; ++i) {
			string dir = AssetBunbleInfo.GetLocalPath(dirs[i]);
			ret.Add (dir);
		}
		for (int i = 0; i < dirs.Length; ++i) {
			string dir = dirs[i];
			List<string> list = GetAllLocalSubDirs(dir);
			if (list != null)
				ret.AddRange(list);
		}

		return ret;
	}

在上述函数中调用了函数接口

AssetBunbleInfo.GetLocalPath(dirs[i]);

该接口的实现函数如下所示:

	// 获得根据Assets目录的局部目录
	public static string GetLocalPath(string path)
	{
        return AssetBundleMgr.GetAssetRelativePath(path);
	}

继续接口的调用函数

GetAssetRelativePath

实现如下所示:

    public static string GetAssetRelativePath(string fullPath)
    {
        if (string.IsNullOrEmpty(fullPath))
            return string.Empty;
        fullPath = fullPath.Replace("\\", "/");
        int index = fullPath.IndexOf("Assets/", StringComparison.CurrentCultureIgnoreCase);
        if (index < 0)
            return fullPath;
        string ret = fullPath.Substring(index);
        return ret;
    }

最后一个函数是DirExistResource函数用于判断文件是否存在,它的实现代码如下所示:

// 根据目录判断是否有资源文件
	public static bool DirExistResource(string path)
	{
		if (string.IsNullOrEmpty (path))
			return false;
		string fullPath = Path.GetFullPath (path);
		if (string.IsNullOrEmpty (fullPath))
			return false;

		string[] files = System.IO.Directory.GetFiles (fullPath);
		if ((files == null) || (files.Length <= 0))
			return false;
		for (int i = 0; i < files.Length; ++i) {
			string ext = System.IO.Path.GetExtension(files[i]);
			if (string.IsNullOrEmpty(ext))
				continue;
			for (int j = 0; j < ResourceExts.Length; ++j)
			{
				if (string.Compare(ext, ResourceExts[j], true) == 0)
				{
					if ((ResourceExts[j] == ".fbx") || (ResourceExts[j] == ".controller"))
					{
						// ingore xxx@idle.fbx
						string name = Path.GetFileNameWithoutExtension(files[i]);
						if (name.IndexOf('@') >= 0)
							return false;
					} else
					if (ResourceExts[j] == ".unity")
					{
						if (!IsVaildSceneResource(files[i]))
							return false;
					}
					return true;
				}
			}
		}

		return false;
	}

代码中的

ResourceExts

是事先定义好的能够遍历到的文件扩展名,如下所示:

	// 支持的资源文件格式
	private static readonly string[] ResourceExts = {".prefab", ".fbx",
							 ".png", ".jpg", ".dds", ".gif", ".psd", ".tga", ".bmp",
							 ".txt", ".bytes", ".xml", ".csv", ".json",
							".controller", ".shader", ".anim", ".unity", ".mat",
							".wav", ".mp3", ".ogg",
							".ttf",
							 ".shadervariants", ".asset"};

最后一步是判断scene是否有效的函数接口:

IsVaildSceneResource

实现代码如下所示:

private static bool IsVaildSceneResource(string fileName)
	{
		bool ret = false;

		if (string.IsNullOrEmpty (fileName))
			return ret;

		string localFileName = AssetBunbleInfo.GetLocalPath (fileName);
		if (string.IsNullOrEmpty (localFileName))
			return ret;

		var scenes = EditorBuildSettings.scenes;
		if (scenes == null)
			return ret;

		var iter = scenes.GetEnumerator ();
		while (iter.MoveNext()) {
			EditorBuildSettingsScene scene = iter.Current as EditorBuildSettingsScene;
			if ((scene != null) && scene.enabled)
			{
				if (string.Compare(scene.path, localFileName, true) == 0)
				{
					ret = true;
					break;
				}
			}
		}

		return ret;
	}

这样遍历所有资源下的文件和子文件的所有函数就完成了,放在工具代码中实现即可。

Unity遍历资源下的所有文件以及子文件的更多相关文章

  1. IO流-递归遍历目录下指定后缀名结尾的文件名称

    /* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...

  2. PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹

    PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...

  3. C#遍历指定文件夹中的所有文件和子文件夹

    参考:http://www.cnblogs.com/skylaugh/archive/2012/09/23/2698850.html DirectoryInfo TheFolder=new Direc ...

  4. php 遍历一个文件夹下的所有文件和子文件

    php 遍历一个文件夹下的所有文件和子文件 <?php /** * 将读取到的目录以数组的形式展现出来 * @return array * opendir() 函数打开一个目录句柄,可由 clo ...

  5. Shell遍历目前下后缀名为.xml的文件并替换文件内容

    1.shell查找 .xml文件 find /home/esoon/test/external/ -type f -name '*.xml' 2.替换方法 sed -i "s/10.111. ...

  6. 一个php函数,能够遍历一个文件夹下的所有文件和子文件夹

    <?phpfunction my_scandir($dir){    $files=array();    if(is_dir($dir))     {        if($handle=op ...

  7. php 遍历一个文件夹下的所有文件和子文件夹

    <?php function my_scandir($dir) { $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { ...

  8. PHP 遍历文件夹下的文件以及子文件夹

    // 递归的方式实现function my_dir( $dir ){ if ( !is_dir($dir) ) { return 'not dir';die(); } $files = array() ...

  9. PHP 遍历目录下面的所有文件及子文件夹

    //遍历文件夹下面所有文件及子文件夹 function read_all_dir ( $dir ){ $result = array(); $handle = opendir($dir);//读资源 ...

随机推荐

  1. awk循环语句-【AWK学习之旅】

      AWK中两种循环语句:if-else 和 while   控制流语句: 1.if-else 求总数,平均值: [root@monitor awkdir]# awk '$3>6 {n = n ...

  2. 20145324 《Java程序设计》第8周学习总结

    20145324 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 1.NIO使用频道来衔接数据节点,可以设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记,提供clear ...

  3. Win7下硬盘安装fedora17

    Win7下硬盘安装fedora17 这几天经过很多次的百度和实验,终于成功的在我的x64机子上装上了fedora17,以此分享给大家,希望能给大家帮助. 一.准备工作: 1.工具,因为我们电脑上大部分 ...

  4. 如何生成SSH key

    SSH key提供了一种与GitHub通信的方式,通过这种方式,能够在不输入密码的情况下,将GitHub作为自己的remote端服务器,进行版本控制 步骤 检查SSH keys是否存在 生成新的ssh ...

  5. [BZOJ1584]Cleaning Up 打扫卫生

    Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...

  6. SaltStack使用salt-ssh模式-第十一篇

    salt-ssh介绍 1.salt-ssh 是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也不需要master. 2.salt-ssh 支持salt大部分的功能:如 grai ...

  7. linux centos7安装phpMyAdmin详解,以及解决各种bug问题

    使用php和mysql开发网站的话,phpmyadmin和navicat是目前非常好的mysql管理工具,但是phpmyadmin最主要是免费开源,目前很多集成的开发环境都会自带phpmyadmin, ...

  8. LeetCode——Counting Bits

    Question Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calcu ...

  9. 数据结构(十一)B树

    之前的二叉排序树,平衡二叉树都是基于二叉树的实现,但是在搜索过程中,效率和树的深度有关,所以就想到把二叉树改为多叉树,B树和B+树都基于多叉树的实现 多路查找树 B树 定义   应用场景   B+树 ...

  10. Ubuntu16.04 + Digits + caffee

    reference: csdn 必要依赖包安装 sudo apt-get install build-essential sudo apt-get install --no-install-recom ...