Unity遍历资源下的所有文件以及子文件

原创 2017年07月09日 21:02:04

笔者介绍:姜雪伟,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遍历所选文件夹中包含某后缀名的文件路径

//遍历所选文件夹,查找该文件夹以及子文件夹中 后缀为 .prefab的文件路径 using UnityEngine; using System.Collections; using System....
  • LIQIANGEASTSUN
  • LIQIANGEASTSUN
  • 2014年12月24日 15:18
  • 6903

unity 获取某个文件夹下的所有图片

hello ,哈哈,第一次写博客略微有点小激动。在博客里写下自己平常的积累还是不错的,决定以后有的新的问题及解决方案都写出来共享一下。 前几天有朋友问我unity里怎么从某个文件夹下把所有的图片获取到...
  • fucun1984686003
  • fucun1984686003
  • 2015年07月15日 21:24
  • 6670

Unity 获取指定资源目录下的所有文件

获取 所有资源 [@MenuItem("Navy/Assets/Test")] static void Test_Compoent(){ //OK //这个不好用~ //Debug.L...
  • peanut__love
  • peanut__love
  • 2015年12月15日 12:13
  • 10645

Unity Resource文件夹的使用

Resource文件夹,用于在运行时加载资源。使用Resource.Load("path")的方式加载,简单方便。 但是尽量不要使用它,         1:它使内存管理变得困难;       ...
  • ydhmxj
  • ydhmxj
  • 2017年06月16日 11:52
  • 950

简单总结Unity使用Resources类资源管理

加载资源Resources.Load(),卸载资源分三种情况:非GameObject资源,GameObject资源及其克隆体...
  • qq_18995513
  • qq_18995513
  • 2016年07月19日 19:49
  • 4908

Unity资源路径及加载外部资源介绍

Unity3D中的资源路径 路径属性 路径说明 Application.dataPath 此属性用于返回程序的数据文件所在文件夹的路径。例如在Edi...
  • appppppen
  • appppppen
  • 2016年05月13日 16:11
  • 15936

Unity各种路径获取

Application.persistentDataPath http://docs.unity3d.com/ScriptReference/Application-persistentData...
  • or7rccl
  • or7rccl
  • 2015年11月21日 09:33
  • 3212

Unity编辑器获取文件夹下所有对象

有一次需要在Editor模式下获取任意文件夹下的所有资源对象,包括子文件夹,我尝试了AssetDatabase.LoadAllAssetsAtPath(string assetPath),理想中的Ob...
  • lfxq0168
  • lfxq0168
  • 2014年10月14日 14:21
  • 3282

Unity 获取指定资源目录下的所有文件

//路径           string fullPath = "Assets/Models/21/21000001" + "/";              //获取指定路径下面的所有资源文...
  • u014370148
  • u014370148
  • 2017年04月05日 16:25
  • 1913

unity3D 批量导出源代码

前几天 要搞软件著作权;需要源代码, 一共60页,每页50行。怎么搞 复制粘贴 60页? 想想作为程序员的我们,不应该干这么 土鳖的事情吧! 后来写了个脚本 导出所有源代码 到文件文件中, 使用之...
  • nicepainkiller
  • nicepainkiller
  • 2016年11月29日 09:47
  • 887
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity遍历资源下的所有文件以及子文件
举报原因:
原因补充:

(最多只允许输入30个字)