【Unity2021.2新機能】各アセットのインポート時間が一覧表示できるImport Activity Window

Unity2021.2新機能である、各アセットのインポート時間が一覧表示できるImport Activity Windowについてまとめます。

Unity2021.2b5(ベータ版時点の情報です)

はじめに

Unityプロジェクトは規模が大きくなるにつれてインポートにかかる時間も多くなります。
インポートプロセスで重い処理が走ってしまうと、新しいアセットが追加されたり、
Switch Platformしたり、新しくプロジェクトを開いたりする際に時間がかかり作業効率が低下します。

そこで時間がかかっている部分を最適化する必要が出てきますが、まずその前に分析が必要です。
そこでUnity2021.2で追加されるImport Activity Windowを使えば、アセットごとのインポート時間を可視化できます。

本記事ではこのImport Activity Windowの使い方についてまとめます。

使い方

Import Activity WindowはWindow > Analysis > Import Activity Windowから開けます。

f:id:halya_11:20210901184357p:plain:w600
Import Activity Window

アセットとそのインポート時間が一覧化されます。
インポート時間が長い順にソートしたり、アセットを選択して右側のエリアで詳細情報を確認したりできます。

またProjectビューからアセットを右クリック > View in Import Activity Window を選択して開くこともできます。

f:id:halya_11:20210901184632p:plain:w600
右クリックから開く

重いインポート処理を書いてみる

さてそれでは重いインポート処理を書いて処理時間が正常に計上されるか確認してみます。
tex_red_16x16.pngという名前の小さいテクスチャのインポート前後処理として、スレッドを1秒ずつスリープさせます。

using System.Threading;
using UnityEditor;
using UnityEngine;

public class HeavyAssetPostprocessor : AssetPostprocessor
{
    private const string FileName = "tex_red_16x16.png";

    private void OnPostprocessTexture(Texture2D tex)
    {
        if (assetPath.EndsWith(FileName))
        {
            Thread.Sleep(1000);
        }
    }

    private void OnPreprocessTexture()
    {
        if (assetPath.EndsWith(FileName))
        {
            Thread.Sleep(1000);
        }
    }
}

このPostprocessorのコンパイルが終わってから当該テクスチャをインポートし、Import Activity Windowを見てみます。

f:id:halya_11:20210901184951p:plain
計上された

当該テクスチャのインポートに2065ms掛かっており、正常に計測されたことがわかりました。

OnPostprocessAllAssetsで書いた処理は計上されないので注意

一点注意点として、OnPostprocessAllAssetsで行われた処理は計測されません。

using System.Threading;
using UnityEditor;

public class HeavyAssetPostprocessor : AssetPostprocessor
{
    private const string FileName = "tex_red_16x16.png";

    private static void OnPostprocessAllAssets(string[] importedAssetPaths, string[] deletedAssetPaths,
        string[] movedAssetPaths, string[] movedFromAssetPaths)
    {
        foreach (var importedAssetPath in importedAssetPaths)
        {
            if (importedAssetPath.EndsWith(FileName))
            {
                // Import Activity Windowに出てこない
                Thread.Sleep(1000);
            }
        }
    }
}

これはOnPostprocessAllAssetsがインポート対象が全てインポートし終わったあとに呼ばれるものであり、
個々のアセットのインポートプロセスの一部ではないためです。

そう考えると当然の挙動ではありますが、仕様として覚えておいた方が良さそうです。

参考

docs.unity.cn

docs.unity3d.com