Unity遍历资源下的所有文件以及子文件
笔者介绍:姜雪伟,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遍历资源下的所有文件以及子文件的更多相关文章
- IO流-递归遍历目录下指定后缀名结尾的文件名称
/* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...
- PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹
PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...
- C#遍历指定文件夹中的所有文件和子文件夹
参考:http://www.cnblogs.com/skylaugh/archive/2012/09/23/2698850.html DirectoryInfo TheFolder=new Direc ...
- php 遍历一个文件夹下的所有文件和子文件
php 遍历一个文件夹下的所有文件和子文件 <?php /** * 将读取到的目录以数组的形式展现出来 * @return array * opendir() 函数打开一个目录句柄,可由 clo ...
- Shell遍历目前下后缀名为.xml的文件并替换文件内容
1.shell查找 .xml文件 find /home/esoon/test/external/ -type f -name '*.xml' 2.替换方法 sed -i "s/10.111. ...
- 一个php函数,能够遍历一个文件夹下的所有文件和子文件夹
<?phpfunction my_scandir($dir){ $files=array(); if(is_dir($dir)) { if($handle=op ...
- php 遍历一个文件夹下的所有文件和子文件夹
<?php function my_scandir($dir) { $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { ...
- PHP 遍历文件夹下的文件以及子文件夹
// 递归的方式实现function my_dir( $dir ){ if ( !is_dir($dir) ) { return 'not dir';die(); } $files = array() ...
- PHP 遍历目录下面的所有文件及子文件夹
//遍历文件夹下面所有文件及子文件夹 function read_all_dir ( $dir ){ $result = array(); $handle = opendir($dir);//读资源 ...
随机推荐
- 翻翻git之---可用作课程表/排班表的自定义table库ScrollTableView
转载请注明出处:王亟亟的大牛之路 最近一直在写混合开发的东西,是时候温故下native的了. 一年多之前领导提了一个双性滚动+快点击的"TableView"那时候自己整了2 3天没 ...
- LeetCode——remove-duplicates-from-sorted-list
Question Given a sorted linked list, delete all duplicates such that each element appear only once. ...
- 【链接】SpringBoot启动错误
[错误解决]SpringBoot启动错误 https://blog.csdn.net/Small_Mouse0/article/details/78551900
- Python 实现C语言 while(scanf("%d%d", &a, &b) != EOF) 语句功能
reference:Python 实现C语言 while(scanf("%d%d", &a, &b) != EOF) 语句功能 在python中,无法通过input ...
- 编译libmemcached
php的扩展memcache,不支持cas,所以我们要装memcached扩展,memcached扩展是基于libmemcached,所以要先安装libmemcached 一.下载软件 1.libme ...
- [转载]Eclipse的常用快捷键
常用的快捷键 ctrl+1:快速修复错误 ctrl+shift+L :查看快捷键 alt+?或alt+/:自动补全代码或者提示代码 ctrl+o:快速outline视图 ctrl+shift+r:打开 ...
- cygwin下安装软件
cygwin下安装软件cygwin工具安装新的软件和常见的命令windows8.1下安装Cygwin并通过apt-cyg安装软件包Cygwin利用apt-cyg安装gcc.g++.make和gdb 首 ...
- nyoj最少乘法次数——快速幂思想
最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...
- day29 主机管理-堡垒机2-原生ssh会话记录
day29课堂代码:https://github.com/liyongsan/git_class/tree/master/day29 课堂笔记: 通过原生Ssh 记录会话1. 在我们自己的堡垒机交互脚 ...
- 同步锁Lock
用于解决多线程安全问题有三种方式: 同步代码块(隐式锁,基于JVM) 同步方法(隐式锁,基于JVM) 同步锁(显式锁,jdk1.5后出现,相对于前两种方式,更加灵活) 下面通过一段程序来说明一下同步锁 ...