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

来源:互联网 发布:中金公司待遇 知乎 编辑:程序博客网 时间:2024/05/18 00:16

笔者介绍:姜雪伟,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.fbxstring name = Path.GetFileNameWithoutExtension(files[i]);if (name.IndexOf('@') >= 0)return false;} elseif (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;}

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


原创粉丝点击