【unity】资源导入神器之StartAssetEditing/StopAssetEditing

最近公司在研发一套基于Houdini和Unity的美术工作流程,涉及到大量美术资源的导入与设置,因此怎样快速导入与设置资源成为了影响美术工作效率的一个关键点。调研发现AssetDatabase.StartAsseteEditing和StopAssetEditing这两个API真的是快速资源导入必备神器。现将使用这两个API过程中的一些想法及遇到的坑记录如下:

1.使用背景:

a.大批量资源导入(比如批量贴图导入);

b.大批量资源操作(比如批量图片格式设定);

2.技术原理:

Unity官方的解释:Starts importing Assets into the Asset Database. This lets you group several Asset imports together into one larger import.通俗点讲就是对大量的import操作进行合批,进而加快import效率。StartAssetEditing/StopAssetEditing是成对出现的,Unity引擎内部有一个gLock字段用于记录StartAssetEditing/StopAssetEditing操作,每执行一次StartAssetEditing,gLock++,同样每执行一次StopAssetEditing,gLock--,当gLock=0时标志着一次import合批完成。为了实现import合批,unity会挂起StartAssetEditing/StopAssetEditing之间的所有Import和Refresh操作,等到StopAssetEditing后,一次性Import和Refresh。

3.使用方法:

StartAssetEditing/StopAssetEditing一先一后调用,当在两者之间抛出异常,会打断StopAssetEditing的调用,将会导致Unity除菜单外任何窗口都将失去响应,因此最好用try...catch或者try...finally块包起来。如下:

        try
        {
            AssetDatabase.StartAssetEditing();
            //TODO:Import,Refresh
          
        }
        finally
        {
            AssetDatabase.StopAssetEditing();
        }

4.注意事项(避坑):

因为Unity在import合批时,会挂起期间所有的Import和Refresh操作,因此在对资源导入或设定后立马回读将会出现无法读取资源或资源读取异常情况,比如采用上述方式,导入贴图并立马对图片进行格式设定会无法读取贴图。

StartAssetEditing/StopAssetEditing是成对出现的,缺一不可,否则会出现编辑器界面无响应的情况(并非假死)。

5.改进:

在多种资源同时批量导入时,会在很多地方使用这两个API,为了避免多写或者漏写导致界面无响应情况,同时在导入期间可能需要临时强制刷新,这里对StartAssetEditing/StopAssetEditing包装一下,如下:

using System;
using UnityEditor;
public static class AssetImportUtils
{
    private static bool isStartAssetEditing = false;
    public static void StartAssetEditing()
    {
        if (!isStartAssetEditing)
        {
            AssetDatabase.StartAssetEditing();
            isStartAssetEditing = true;
        }
    }
    public static void StopAssetEditing()
    {
        if (isStartAssetEditing)
        {
            AssetDatabase.StopAssetEditing();
            isStartAssetEditing = false;
        }
    }
    public static void ForceRefresh(ImportAssetOptions options)
    {
        if (isStartAssetEditing)
            AssetDatabase.StopAssetEditing();
        AssetDatabase.Refresh(options);
        if (isStartAssetEditing)
            AssetDatabase.StartAssetEditing();
    }
}

6.应用实例:

这里将未采用和采用上述方式进行图片导入和设置情况分析如下:(500张128x128的png图片导入与格式设定)

耗时(ms)导入设置
采用4477082433
未采用77173114761

由上表可见,采用上述API对导入和设置效率的提升是相当可观的。

7.工程源码:

详见本人github:https://github.com/xinjay/ExternalAssetImport

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值