長時間ゲームをプレイしていて、突然アプリが強制終了した経験はありませんか?
その原因の一つとして、「メモリ不足」が考えられます。よく聞きますよね?
Unityでは、使用されなくなったアセットをメモリから解放するために、Resources.UnloadUnusedAssets()
というメソッドが用意されています。本記事では、このメソッドの概要と使用時の注意点について解説します。
Resources.UnloadUnusedAssets()とは?
Unityの公式スクリプトリファレンスによると、Resources.UnloadUnusedAssets()
は「現在使用されていないアセットをアンロードする」メソッドです。これは、ヒエラルキー上のゲームオブジェクトやスクリプトコンポーネント、静的変数などを調査し、参照されていないアセットをメモリから解放します。ただし、スクリプトの実行スタックは探索されないため、スタック内のみで参照されているアセットは解放される可能性があります。このような場合、アセットのガベージコレクションがトリガーされる前にEditorUtility.SetDirty
を呼び出すことが推奨されています。
メモリ解放の効果
実際に、メモリ解放の効果を示す実験があります。
4096×4096ピクセルの巨大なPNGファイルを100枚読み込み、UI.RawImage
に表示する処理を繰り返すと、メモリ使用量が5GBを超え、最終的には110GB以上に達し、OSから警告が出る事態となりました。
しかし、Resources.UnloadUnusedAssets()
を実行すると、メモリ使用量が1GB程度にまで減少しました。
このように、メモリを大量に消費する処理を行う場合、適切なタイミングでResources.UnloadUnusedAssets()
を呼び出すことで、メモリ使用量を抑えることができます。
使い方
private void ZettaiUnloadSuruMan()
{
Resources.UnloadUnusedAssets();
}
メ ソ ッ ド を 呼 ぶ だ け !
使用時の注意点
- 非同期処理:
Resources.UnloadUnusedAssets()
は非同期で実行されるため、頻繁に呼び出すと予期しない挙動を引き起こす可能性があります。毎フレーム呼び出すなどの狂気じみた事はしないほうがよいでしょう。 - Prefabの参照:インスタンス化したGameObjectを破棄しても、元のPrefabが参照されている場合、関連するアセットは解放されません。不要なPrefabの参照も適切に管理する必要があります。
- 古い情報の更新:以前は、参照されていないはずのTextureがメモリから解放されないことがあるとされていましたが、これはUnity 5時代の情報です。最新のUnityバージョンでは改善されている可能性があります。
まとめ
Resources.UnloadUnusedAssets()
は、使用されなくなったアセットをメモリから解放するための有効な手段です。特に、大量のアセットを扱うゲームや長時間プレイされるゲームでは、ホーム画面に戻ったタイミングや、インゲームからアウトゲームに戻ったタイミングなどでこのメソッドを呼び出すことで、メモリ使用量を抑え、アプリの安定性を向上させることができます。
旧ブログでも同じテーマでエントリーを投稿していました。2025年5月時点の情報を加味したりしなかったりしています。