目录

在Unity中操作资源目录,如果用c#默认的文件操作方式,会产生很多莫名其妙的问题。应该使用Unity提供的一系列API


 

一、资源数据库(AssetDatabase)

资源数据库是操作Unity资源目录的最常见的接口。包括:导入导出资源,加载资源,重命名资源,文件夹操作,移动资源,刷新资源,拷贝资源(API参考)

AssetDatabase.SaveAssets() -- 保存所有被修改过的资源

AssetDatabase.Refresh() -- 刷新资源

是比较常用的接口,当我们在操作完资源后,需要用Refresh来刷新一下资源,否则会出现资源读取的延迟

AssetDatabase.LoadAssetAtPath() -- 加载资源

如果资源目录不在Resources目录中,可以通过这种方式来读取资源。项目由于要打包成AssetBundle,没有把资源放在Resources中,而是放在RawRes文件夹中,然后统一在编辑器Mode运行下就用LoadAssetAtPath接口来加载。这样的好处就是在打包的时候,不用再手动清理或移动Resources文件夹中的资源,因为Resources文件夹以外的资源是不会被默认打进包里的

需要注意这个接口传入的Path路径,需要包含文件后缀。Path路径可以用Assets这层目录开始。

AssetDatabase.LoadAllAssetAtPath() -- 加载资源中包括所有子资源在内的资源

一个资源的结构并不是像我们看到的简单,比如一个FBX文件,它不单纯只是一个模型文件,比如下面这段代码:



UnityEngine.Object[] assets = AssetDatabase.LoadAllAssetsAtPath(fbx_path);
foreach (UnityEngine.Object a in assets)
{
    string action_name = a.name;
   Debug.Log(action_name + "   type:" + a.GetType().ToString());
}



打印如下: 

unity 弹出win资源管理器窗口 unity的资源管理_c#

可以看到其中的结构是比较复杂的,而这个资源在Projector面板上展开是长这样的

unity 弹出win资源管理器窗口 unity的资源管理_游戏_02

我们通过LoadAllAssetAtPath就可以访问FBX文件中的动画clip,将这些动画clip指定到状态机上,构建属于某个模型特定的状态机。

 


 

二、资源导入类(AssetImport)

 当我们单击一个Project面板中的资源时,Inspector面板会有该资源对应的信息。这些信息是该资源的设置,用来控制资源的解析方式,如图:

 

unity 弹出win资源管理器窗口 unity的资源管理_数据库_03

    

图中的设置我们也可以在这里(TextureImporter)找到对应的设置API。

我们使用AssetImport派生出的各种XXXImport来更改资源设置。基本上每一种资源在Inspector上的设置都能在XXXImport手册中中找到用于设置的API(常见ModelImport, TextureImport等)

在修改完AssetImport之后,需要调用AssetImport:SaveAndReimport()来保存设置,并重新导入资源

项目工具也大量使用了各种Import,比如代码修改ModelImport来设置Mesh的优化选项,代码修改TextureImport来设置贴图的压缩方式等。


 

三、组件工具集(***Utility)

Unity在操作某些类型的组件时,需要用到组件对应的工具集,这些工具集一般都是以Utility结尾的。

GUIUtility,LODUtility,JsonUtility,EditorUtility,LayoutUtility,PrefabUtility,GeometryUtility,AnimationUtility,GUILayoutUtility,EditorJsonUtility,GameObjectUtility,RectTransformUtility

PrefabUtility是比较常用的工具集,用来操作Prefab,项目中的角色,怪物,npc的Prefab生成就大量用到这个工具集

GameObjectUtility可以设置GameObject的Static标志位等

参考


 

四、AssetPostprocessor(资源导入后期加工)

项目中有遇到需要对导入的模型(角色,怪物,npc)做统一的操作:

1) 设置模型的简化选项(不导入材质、不生成第二套UV,模型压缩等)

2) 获取模型文件中的AnimationClip,设置其帧事件(用来做模型动画播放到一定时间播放特效)

我们希望在每次导入资源时,都能自动完成这些设置。这时候就需要用到AssetPostprocessor

编写一个继承于AssetPostprocessor的类,就可以可用来捕获资源导入工程的回调,比如我们要统一修改所有Mesh的导入设置,我们就可以重载OnPreprocessModel,直接使用assetImport这个变量来修改导入设置。之后一旦有新的Mesh导入,就会自动执行这些Import修改操作了。

类似的接口一般都是以OnPostprocess或者OnPreprocess开头的,加上一个Asset类型。如OnPostprocessModel或OnPostprocessTexture。

OnPostprocess与OnPreprocess的区别是一前一后。OnPreprocess是在资源导入之前的回调。OnPostprocess是在导入资源之后,我们可能需要立即对新的资源生成附加文件或者其他,可以在这里做


public class MyAssetImporter : AssetPostprocessor
{
    public void OnPreprocessModel()
    {
        ModelImporter modelImporter = (ModelImporter)assetImporter;
        modelImporter.importMaterials = false;      //不导入材质
     }
}

 


 

结语:

本文旨在让读者对Unity中操作资源的方式有一个大体的了解,能够对有哪些API可以做到什么样的功能心中有数,实际编写工具时根据需求查阅手册,一步一步慢慢完成自己的工具。