渋谷ほととぎす通信

エンジニア社長によるUnityとAIのブログ & エンジニアの生存戦略

【Unityリーク警告】Cleaning up leaked objects in scene since no game objectを直す6つのステップ

【Unityリーク警告】Cleaning up leaked objects in scene since no game objectを直す6つのステップ

こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Cleaning up leaked objects in scene since no game objectって何?
  • 警告が出ないようにしたい
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityで開発しているときどき表示される以下の警告文。シーンを保存するときに出力されます。

    Cleaning up leaked objects in scene since no game object, component or manager is referencing them Texture2D has been leaked 16 times.

    上記の警告文は 画像が16回リークしている という意味です。

    リークとは本来削除されるべきファイルが削除されずに残り続けていることです。つまりゴミが残っているということ。本記事ではUnityエディタで作業中、ファイルがリークした場合に修復する6つのステップを紹介していきます。

    一度リークが起きると、警告文に気になってしまい開発効率を下げてしまいかねません。ぜひ本記事で紹介するテクニックを使って直してもらえればと思います。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    ステップ①HideFlagsのつけ忘れを確認

    リークの直し方1つ目は HideFlagsの確認 です。

    ExecuteInEditModeを使用していて、エディット中にオブジェクトを生成している箇所にHideFlagsがセットしてあるか確認しましょう。

    _texture = new Texture(256, 128);  
    // hideFlagsを設定する  
    _texture.hideFlags = HideFlags.DontSave;  
    

    👆上のような感じ修正します。

    Cleaning up leaked objects in scene since no game object

    この警告文が表示されるときは ExecuteInEditMode を使っている可能性が高いです。

    ExecuteInEditMode とは、Unityエディタ停止中でも再生状態とすることができる便利機能。専用のエディタ機能を作るときに使うことが多いです。しかし使い方も要注意。

    HideFlags を適切に設定しないと先の警告文が頻発します。

    ステップ②全てのExecuteInEditModeを外してみる

    ExecuteInEditMode 全文検索で探して全てコメントアウトします。

    Cleaning up leaked objects in scene since no game object

    この警告文は ExecuteInEditMode を使用しているときに起きます。 「直し方① HideFlagsのつけ忘れを確認」で解説したとおり、HideFlagsの設定で直る可能性は高いのですが、直らない場合もあります。

    不具合の修正全般で言えることですが、原因を絞り込むことが非常に重要です。今回は ExecuteInEditMode が怪しいということで、試しに全ての ExecuteInEditMode を外してみます。その後Unityエディタの再起動もお忘れなく。

    これで直る場合は ExecuteInEditMode が原因である可能性が高いということです。だいぶ絞り込めたはずなので修復まであと少しです。

    しかし全てのExecuteInEditModeをOFFにしても直らない場合があります。

    ステップ③新しいシーンを作成してHierarchyウィンドウを空にする

    ExecuteInEditModeをオフにしても原因が特定できない場合、手がかりがほぼなくなりました。

    そこで新しいシーンファイルを作成し、Hierarchyウィンドウを空にして確認してみましょう。

    【Unityリーク警告】Cleaning up leaked objects in scene since no game objectを直す6つのステップ_0

    この状態で直った場合は、少しずつHierarchy上のオブジェクトを戻していきましょう。

    どこかで原因となるオブジェクトが見つかるはずです。

    しかし、これでも直らないときがあるため、次のステップに進みます。

    👉 今さら聞けないUnityのヒエラルキー(Hierarchy)とは?

    ステップ④アセットを再インポートする

    Hierarchyに何も配置していないのに警告が表示されたら、既存のアセットを疑っていきます。もしかするとファイルが破損しているということも考えられるからです。

    そこで全ファイルをインポートし直します。

    メニュー Assets -> Reimport All をクリックすると全アセットを再びインポートしてくれます。
    【Unityリーク警告】Cleaning up leaked objects in scene since no game objectを直す6つのステップ_1

    ファイル数が多いと時間がかかるため気長に待ちましょう。

    Reimport Allで直った場合はアセットが破損していたのかもしれません。

    しかし治らない場合は次のステップに進んでみましょう。

    ステップ⑤Library、Tempフォルダを消す

    Unityエディタでの作業はキャッシュされています。そのキャッシュファイルが破損しているためリークしている可能性を潰していきましょう。

    Unityプロジェクト直下にLibrary、Tempフォルダがあると思います。

    Unityをシャットダウンしたことを確認して、LibraryとTempフォルダを削除してください。

    リーク以外のトラブルも最悪Library、Tempフォルダの削除で解決することが多いです。

    それでも治らない場合は、最後のステップに進みます。

    ステップ⑥ Unityプロジェクトをダウンロードし直して開き直す

    最終ステップはUnityプロジェクトの再ダウンロードです。

    開発中はGitHubかどこかにUnityプロジェクトをバックアップして保存していると思います。そのデータを ダウンロードし直して開きます。

    つまり 「直し方④ アセットを再インポートする」 とほぼ同じ対応です。この方法で直らなかったことはありません。

    確実な方法ですが、時間がかかる ため時間がある時に試してみてください。

    新たなUnityプロジェクトを開くときはコツがありますのでこちらの記事を参考にしてみてください。

    まとめ

    本記事では Cleaning up leaked objects in scene since no game object の直し方を解説してきました。
    最後に記事の内容を簡単にまとめます。

    Cleaning up leaked objectsを直す6ステップ

    ①HideFlagsを見直し

    ②全ExecuteInEditModeの削除

    ③シーンの作り直し

    ④アセットを再インポート

    ⑤Library、Tempフォルダの削除

    ⑥Unityプロジェクトの再ダウンロード

    こんな感じです。

    リークしてても開発は進められますし、作業自体に支障は出ません。しかしいつかは修正しないといけない案件です。

    しかもリーク警告文を見かけるたびに気持ちが萎えますよね。気持ちがなえると作業効率も下がりますし、ミスも多くなります。

    リークした際は本記事を参考に直してもらえたらなと思います。

    この記事が Cleaning up leaked objects に悩まれている方の助けになれば幸いです。

    Unityオブジェクトの描画順の制御って難しいですよね。
    この度、Unityの描画順を体系的に学べる「Unity描画順の教科書」を執筆しました。

    Unityの描画順を基礎から学びたい方はぜひ確認してみてください!
    Unity描画順の教科書

    最後まで読んでいただきありがとうございました!
    すばらしいUnityライフをお過ごしください。

    オススメ記事