unity资源导入神器之StartAssetEditing/StopAssetEditing

Posted 程序员茶馆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于unity资源导入神器之StartAssetEditing/StopAssetEditing的主要内容,如果未能解决你的问题,请参考以下文章

Unity资源导入

Unity 游戏框架搭建 2018 资源管理神器 ResKit

使用Unity做一个电脑可直接运行的点名神器,可直接导入Excel文档使用哦文末源码

Unity 实战篇 |点名神器2.0可直接导入Excel文档在电脑中使用,新增点名历史排行榜功能

unity之spine骨骼动画使用

unity之spine骨骼动画使用