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);//读资源 ...
随机推荐
- 20135302魏静静——linux课程第七周实验及总结
linux课程第七周实验及总结 实验及学习总结 1. 编译链接的过程和ELF可执行文件格式(以hello为例) GNU编译系统编译源码: 首先,运行C预处理器(cpp),将.c文件翻译成.i文件——g ...
- CentOS7下安装VLC
用最新的CentOS7发现没有视频播放器,于是在http://pkgs.org/上查找,发现了nux dextop仓库上有,于是到他的官网上http://li.nux.ro/repos.html查了下 ...
- Android studio 运行模拟器报:Application Installation Failed
前两天笔记本加了个SSD硬盘,原机械硬盘移植到光驱位,硬盘盘符都变了,结果在用android studio 运行以前的程序编译不报错,运行模拟器就会报如下错误. Installation failed ...
- HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (二)
接上篇 HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (一) 整个 ppt 可以去这里下载. 这一篇主要从服务端应该如何返回合理的返回值的角度,讨论如何设计一个合理的 HTTP ...
- python中的参数传递和返回值
python中的参数传递类似java,有着自己的内存回收机制,这和C++有着很大的差别. 1.函数的参数传递: >>> a = [, , ] >>> def fun ...
- linux怎么上真正的国际互联网
1.安装git yum install -y git 2.执行git clone git@github.com:XX-net/XX-Net.git 3.升级python到python 2.7(妈妈说p ...
- Devops 到底是什么?
Devops 到底是什么? 过去一年以来,一批来自欧美的.不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps.DevOps就是开发(Development)和运维(Operations ...
- u-boot-2015.07 make xxx_config 分析
1.u-boot编译脚本:mk.sh #! /bin/sh export PATH=$PATH:/opt/ti-sdk-am335x-evm-08.00.00.00/linux-devkit/sysr ...
- codevs 1085 数字游戏 dp或者暴搜
1085 数字游戏 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单 ...
- js删除数组中某一项或几项的几种方法
1:js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...