コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity エディタが重い・Hold on や Unity is busy が長い時に試すこと 31 選

はじめに

Unity エディタが重くて操作に時間がかかる時や
Hold on・Unity is busy のプログレスバーが消えずに Unity が操作できない時に
自分が試して解決した方法や、
公式フォーラムなどでこうすると解決したと報告があった方法を紹介していきます

目次

Unity プロジェクトのフォルダ内の Library フォルダを削除

Unity プロジェクトのフォルダ内の Library フォルダには
アセットのキャッシュなどが保存されており、
プロジェクトの規模が大きくなったりずっと開発を続けていたりすると
これらのキャッシュが不整合を起こして Unity エディタが重くなることがあるので
Unity を終了した状態で Library フォルダを削除してから Unity を起動する

Unity プロジェクトのフォルダ内の Library/ShaderCache フォルダを削除

Unity プロジェクトのフォルダ内の Library フォルダに含まれている
ShaderCache フォルダにはシェーダのコンパイル結果がキャッシュされるが
シェーダを頻繁に変更すると、このフォルダが肥大化して
Unity エディタが重くなることがあるので
Unity を終了した状態で ShaderCache フォルダを削除してから Unity を起動する

個々のシェーダーバリアントのコンパイル結果は、
プロジェクト内の Library/ShaderCache フォルダーにキャッシュされています。
つまり、100% 同じシェーダーやそのスニペットは、以前のコンパイル結果を再利用します。
また、頻繁に変更されるシェーダーが多くある場合は、
シェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。
これはいつ削除しても問題ありません。
削除されたシェーダーバリアントが再コンパイルされるだけのことです。

また、Unity メニューの「Edit > Project Settings」を選択して
左メニューで「Editor」を選択して「Asynchronous Shader Compilation」をオフにして
非同期シェーダーコンパイルを無効化すると
ShaderCache が肥大化することを防げる可能性がある

GI Cache の Clean Cache を実行

GI のキャッシュが肥大化して Unity エディタが重くなることがあるので
Unity メニューの「Edit > Prerefences」を選択して
左メニューで「GI Cache」を選択して「Clean Cache」を押して
GI のキャッシュを削除する

Package Manager のキャッシュを削除

C:\Users\【ユーザー名】\AppData\Local\Unity\cache

Package Manager のキャッシュが保存される上記のフォルダを
Unity を終了した状態で削除してから Unity を起動すると
Unity エディタの動作が軽くなる可能性がある

Windows 以外での Package Manager のキャッシュの保存場所は
公式ドキュメントに記載されている

並列インポートを有効化

PC のスペックに余裕があれば並列インポートを有効化することで
プロジェクトの起動やインポートが速くなる

Auto Refresh を無効化

Unity メニューの「Edit > Prerefences」を選択して
左メニューで「General」を選択して「Auto Refresh」をオフにすると
アセット変更時の自動インポートを無効化できるので
Unity エディタの動作が軽くなる

自動インポートが無効化されるので Ctrl + R を押して手動でリフレッシュする必要がある

Unity を再生する時にアセットをリフレッシュするエディタ拡張を導入すれば
手動リフレッシュの手間を省略できる

Directory Monitoring を無効化

Unity メニューの「Edit > Prerefences」を選択して
左メニューで「General」を選択して「Directory Monitorning」をオフにすると
フォルダの監視が無効化されて Unity エディタの動作が軽くなる可能性がある

Additional asset pipeline updates include directory monitoring
on Windows for faster asset refresh,
speeding up the Refresh by updating only relevant assets
(we will add support for macOS in a future release).
We also added support for serialized files greater than 2GB.

Directory Monitoring はアセットのリフレッシュの高速化や
関連するアセットのみを更新するリフレッシュの高速化に関する機能らしい

Busy Progress Delay に大きな値を設定

Unity メニューの「Edit > Prerefences」を選択して
左メニューで「General」を選択して「Busy Progress Delay」に大きな値を設定すると
Hold on のプログレスバーが表示されるのを遅延して
Unity エディタが操作不能になることを防げる可能性がある

Disable Editor Analytics (Pro Only) を有効化

Unity メニューの「Edit > Preferences」を選択して
左メニューで「General」を選択して「Disable Editor Analytics (Pro Only)」をオンにして
匿名データを送信しないようにすると Unity エディタの動作が軽くなる可能性がある

このメニューは Unity Pro ライセンスを持っていると変更できる

Compress Assets on Import を無効化

Unity メニューの「Edit > Preferences」を選択して
左メニューで「General」を選択して「Compress Assets on Import」をオフにして
テクスチャインポート時の圧縮処理を無効化すると
テクスチャインポート時の Unity エディタの動作が軽くなることがある

プレハブモードの Auto Save を無効化

プレハブを開いている時に Scene ビューの「Auto Save」をオフにすると
プレハブが自動で保存されなくなり Unity エディタの動作が軽くなる

自動で保存されなくなるので編集したら手動で保存する必要がある

Scene ビューの Gizmo を無効化

Scene ビューの「Gizmos」をオフにすると Scene ビューを開いている時の
Unity エディタの動作が軽くなる可能性がある

Unity エディタの Layout を Default に変更

Unity 右上の「Layout > Default」を押してレイアウトをデフォルトにすると
Unity エディタの GUI がリセットされて
Unity エディタの動作が軽くなる可能性がある

Reset All Layouts を実行

Unity 右上の「Layout > Reset All Layouts」を押してすべてのレイアウトをリセットすると
Unity エディタの GUI がリセットされて
Unity エディタの動作が軽くなる可能性がある

シーンファイルが破損していないか確認

特定のシーンを開いている時のみ Unity エディタが重い場合は
シーンファイルが破損している可能性があるため
シーンファイルを作り直すと Unity エディタの動作が軽くなる可能性がある

Unity Collaborate から Git に移行

Unity Collaborate の動作が重い可能性があるので
Unity Collaborate を使用している場合は Git に移行すると
Unity エディタの動作が軽くなる可能性がある

Unity Collaborate を使用していないプロジェクトであれば
Unity メニューの「Window > Package Manager」を選択して
「Version Control」パッケージを「Remove」すると
Unity エディタの動作が軽くなる可能性がある

JetBrains Rider の「Automatically refresh assets in Unity」を無効化

JetBrains Rider メニューの「ファイル > 設定」を選択して
左メニューで「言語 & フレームワーク > Unity Engine」を選択して
「Automatically refresh assets in Unity」をオフにして「Save」を押すと
Jetbrains Rider でコードを編集して保存した時に
Unity 側で自動でコンパイルが始まらなくなるので
Unity エディタの動作が軽くなる

Visual Studio の「保存時に Unity の AssetDatabase を更新」を無効化

Visual Studio メニューの「ツール > オプション」を選択して
左メニューで「Tools for Unity」を選択して
「保存時に Unity の AssetDatabase を更新」を「False」にして「OK」を押と
Visual Studio でコードを編集して保存した時に
Unity 側で自動でコンパイルが始まらなくなるので
Unity エディタの動作が軽くなる

InitializeOnLoad / InitializeOnLoadMethod で重たい処理を実行していないか確認

using UnityEditor;

[InitializeOnLoad]
public static class Example
{
    static Example()
    {
        // 重たい処理
    }
}
using UnityEditor;

public static class Example
{
    [InitializeOnLoadMethod]
    private static void InitializeOnLoadMethod()
    {
        // 重たい処理
    }
}

InitializeOnLoad / InitializeOnLoadMethod で対象になっているメソッドは
Unity の再生時やコンパイル完了時にも呼び出されるため
重たい処理を実行していないか確認する

たとえば Unity エディタの初回起動時にのみ行えば良い処理であれば
上記のページの内容のように初回起動時にのみ処理を走らせるようにする

AssetPostprocessor で重たい処理を実行していないか確認

using UnityEditor;

public sealed class Example : AssetPostprocessor
{
    private static void OnPostprocessAllAssets
    (
        string[] importedAssets,
        string[] deletedAssets,
        string[] movedAssets,
        string[] movedFromAssetPaths
    )
    {
        // 重たい処理
    }

    private void OnPreprocessTexture()
    {
        // 重たい処理
    }
}

AssetPostprocessor でアセットのインポート時に
重たい処理を実行していないか確認する

OnDrawGizmos / OnDrawGizmosSelected で重たい処理を実行していないか確認

using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        // 重たい処理
    }

    private void OnDrawGizmosSelected()
    {
        // 重たい処理
    }
}

OnDrawGizmos / OnDrawGizmosSelected で
重たい処理を実行していないか確認する

Unity と Unity プロジェクトのフォルダをウィルス対策ソフトのスキャンから除外

Windows のスタートメニューから「設定」を開いて
「更新とセキュリティ > Windows セキュリティ > ウイルスと脅威の防止」を選択して
「ウイルスと脅威の防止の設定」の欄の「設定の管理」を選択し、
「除外」の欄の「除外の追加または削除」を選択して

「除外の追加 > フォルダ」を選択して Unity や Unity プロジェクトのフォルダを
選択することでウィルス対策ソフトのスキャンから除外できて
Unity エディタの動作が軽くなることがある

詳細な手順は上記のページに記載しています

Windows のファイルインデックスから除外

Unity プロジェクトのフォルダを右クリックして「プロパティ」を選択して
「詳細設定」を押して

「このフォルダー内のファイルに対し、プロパティだけでなくコンテンツにも
インデックスを付ける」をオフにして「OK」を押して
プロパティのウィンドウでも「OK」を押して

上記のダイアログが表示されたら
「変更をこのフォルダー、サブフォルダーおよびファイルに適用する」をオンにして
「OK」を押して

適用が完了するのを待ちます
これで、その Unity プロジェクトを編集する時の Unity エディタの動作が軽くなる可能性がある

Visual Studio Editor パッケージを削除

Unity メニューの「Window > Package Manager」を選択して
「Visual Studio Editor」パッケージを選択して「Remove」を押して
Visual Studio Editor パッケージを Unity プロジェクトから削除することで
Unity エディタの動作が軽くなる可能性がある

このパッケージを削除しても Visual Studio 上でコードを編集したり
デバッガを Unity にアタッチすることは可能

AssetGraph の除外

AssetGraph を使用している場合はキャッシュが肥大化して
インポートやコンパイルに時間がかかるようになることがあるため
AssetGraph を Unity プロジェクトから削除すると Unity エディタの動作が軽くなる

TortoiseGit をアンインストール

TortoiseGit を使用している場合は
TortoiseGit をアンインストールすると Unity エディタの動作が軽くなることがある

Editor Iteration Profiler でボトルネックを調査

Editor Iteration Profiler を使うとコンパイル時間の内訳や
Unity 再生時のリロード時間の内訳を確認できるので
たとえば Asset Store で購入したアセットの処理時間が
ボトルネックになっていた、といったことが見つかるようになる

基本的な使い方は↑

Profiler を Editor モードにして調査

Unity メニューの「Window > Analytics > Profiler」を選択して
「Playmode」から「Editor」に変更して「Deep Profile」をオンにする

これでエディタのどの処理で時間がかかっているのか原因を調査できる

タスクマネージャからインポートワーカープロセスを終了

この「Hold on...」という特定のケースについては、
タスクマネージャからインポートワーカープロセスを終了させることで回避できるはずです。
インポートワーカーは「Unity」とも呼ばれるので、エディターと区別するために、
Windowsタスクマネージャでコマンドライン欄を追加し、
インポートワーカーであるUnityプロセスをkillします (これらは-batch cmdlineフラグとワーカー名cmdlineオプションが設定されています)。

タスクマネージャからインポートワーカーと呼ばれるプロセスを終了すると
Hold on を回避できる?

Unity プロジェクトが SSD に格納されているか確認

Unity プロジェクトを HDD に格納している場合は
SSD に移動することで動作が軽くなる

PC を再起動

PC を再起動してから Unity エディタを起動すると動作が軽くなることがある