Unity资源导入自动化设置

  • 简介
  • 具体实现
  • 新的问题
  • 解决方法


简介

大家都知道,在Unity中导入的资源不同类型有不同的设置,

例如:模型文件导入之后是这样的

Unity profiler使用 unity reimport_Unity profiler使用


当导入数量少的时候我们可以手动去改,但是当数量很多,或者文件结构复杂的时候,手动去改的工作量就不小了,这里我们探讨一下如何自动化修改。

具体实现

Unity中提供了AssetPostprocessor这个API,首先我们创建C#脚本,继承AssetPostprocessor之后,只要实现对应的方法就可以在对应类型的资源导入时调用我们的逻辑了,有很多种类型对应的方法如下图:

Unity profiler使用 unity reimport_解决方法_02


比如我需要导入模型时,自动勾选模型数据可读写,则需要以下代码:

public class ModelPostprocessor : AssetPostprocessor
{
	//模型导入之前该方法会被调用
    public void OnPreprocessModel()
    {
        Debug.Log("OnPreprocessModel=" + this.assetPath);
        ModelImporter modelImporter = assetImporter as ModelImporter;

        //一定要加判断,防止死循环
        if (!modelImporter.isReadable)
        {
        	//设置为可读写
            modelImporter.isReadable = true;
            //重新导入,会再次调用此方法
            modelImporter.SaveAndReimport();
        }
    }
}

新的问题

当我们导入的是模型文件,以上方法是没有问题,但当我们导入的是含有模型文件的文件夹,会发现,上面的方法无效,因为文件夹并不是模型文件。那我们怎么做才能使导入文件夹也对其中的模型文件产生改变呢?

解决方法

//任何资源(包括文件夹)导入都会被调用的方法
void OnPreprocessAsset()
    {
		//模型文件不在这做处理
        if (this.assetPath.EndsWith(".fbx"))
        {
            return;
        }
        Debug.Log("OnPostprocessAsset=" + this.assetPath);

        string path = Application.dataPath + this.assetPath.Substring(this.assetPath.IndexOf("/"));
        DirectoryInfo root = new DirectoryInfo(path);
		//找到该文件下所有的fbx模型文件
        FileInfo[] files = root.GetFiles("*.fbx");

        for (int i = 0; i < files.Length; i++)
        {
            int index = files[i].FullName.IndexOf("Assets");
            string assetPath = files[i].FullName.Substring(index);
            ModelImporter modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter;
			//此处会触发我们之前的模型导入的代码
            modelImporter.SaveAndReimport();
            
        }
        
    }

目前的实现已经基本满足我的需求,后面有问题再做补充。

===================================
补充1:
经测试,如果删除Library目录重新导入资源,所有文件都会经历以上代码,这是我们不希望的。如果只对某些文件采用此规则需要在此处加入判断即可

public class ModelPostprocessor : AssetPostprocessor
{
	//模型导入之前该方法会被调用
    public void OnPreprocessModel()
    {
		//只针对指定下的文件夹
        if (!this.assetPath.StartsWith("Assets/Resources"))
            return;
            
        ...
    }
}

补充2:
今天运行发现,上文新的问题又不存在了。。。如果只写OnPreprocessModel就解决问题了那自然最好