
【Unity】AddressablesにおけるUI参照破損の解決策

IT技術

はじめに
Unity開発でプロジェクトが大規模になると、アセット管理は複雑化する。特にモバイルゲームや大規模アプリケーションでは、ビルドサイズの最適化や動的なアセットロードが必須要件となる。ここで強力なツールとなるのが、UnityのAddressable Asset System(Addressables)だ。
Addressablesはアセットをアドレス指定可能にすることで、必要な時に必要なアセットをロードする柔軟性を提供し、開発効率とパフォーマンスの両面で大きなメリットをもたらす。
しかし、この強力なシステム導入時に、特定のシナリオで予期せぬ問題に直面することがある。その一つが、「PrefabにアタッチされたUIコンポーネントへの参照が破損してしまう」現象だ。
「Editor上では問題なく機能していたが、ビルド後にImage, TextなどのUIが表示されない」「特定のアセットをアンロードしたところ、別のUI要素が機能しなくなった」といった経験はないか。これは、AddressablesがUIコンポーネントの型情報(クラス)が格納されたアセンブリ(DLL)への依存関係を、正しくトラッキングできていないために発生する。
結果として、ランタイムでPrefabをロードした際に、コンポーネントの参照が失われ、Inspector上では以下のように「Script」欄がMissing (Missing Monobehaviour) と表示される状態となる。
本記事では、この深刻なUI参照破損の問題に焦点を当て、その原因と、実際の開発現場で効果的だった実践的な解決策をいくつか紹介する。Addressablesを最大限に活用するための具体的なアプローチを探る。
解決策
- 「Non-Recursive Dependency Calculation」のチェックを外す。
まずAddressablesのSettingsファイルからアクセスする。
Settingsファイルを開くと、「Build」セクションに「Non-Recursive Dependency Calculation」の項目がある。
この「Non-Recursive Dependency Calculation」のチェックを外すことで、Addressablesはアセットの依存関係をより深く、再帰的に解決する。
この変更は、バンドルサイズがわずかに増加する可能性はあるが、UIの参照破損という深刻な問題を回避できる大きなメリットがある。
- Prefabをシーンに配置する:(非推奨)
特定のUI Prefabをあらかじめシーンに配置しておくことで、Unityのビルドシステムがその依存アセットを確実に含めるため、参照破損を回避できる場合がある。
しかし、これはAddressablesの動的ロードによるビルドサイズ最適化やメモリ管理のメリットを損なうため、基本的に推奨しない。緊急時やごく小規模なケースでの一時的な回避策と捉えるべきだ。
「Non-Recursive Dependency Calculation」とは?
まず、この設定がAddressablesのアセットロード挙動にどう影響するのかを理解する必要がある。
通常、Addressablesはアセットをビルドする際、そのアセットが依存する他のアセット(テクスチャ、マテリアル、スクリプトなど)を自動的に検出し、必要なものをバンドルに含める。これが「依存関係の解決」だ。
「Non-Recursive Dependency Calculation」のチェックが入っている状態(デフォルトでオンの場合が多い)では、Addressablesは特定の条件下で依存関係の解決を「非再帰的」に行う。これは、アセットAがアセットBに依存しているとき、アセットAはアセットBをロードするが、アセットBがさらにアセットCに依存している場合、AddressablesはアセットBからアセットCへの依存を深く追跡しない挙動を示す。
特に、PrefabにアタッチされたUIコンポーネント(例: UnityEngine.UI.Image、TextMeshProUGUIなど)の場合、問題となるのは、Prefab自体がAddressableとして管理されていても、それが依存するコンポーネントの型情報(クラス)が格納されたアセンブリ(DLL)への依存が Addressablesのシステムによって適切に認識されないことがある点だ。
その結果、以下の状況が発生する。
- Editor上では問題ない: Editor環境では、すべてのDLLとアセットがプロジェクト内に存在するため、参照が切れることなく正しく表示・動作する。
- ビルド後、実行時に問題発生: ビルドされたアプリケーションでは、AddressablesがロードしたPrefabの中に、必要なUIコンポーネントの型情報が格納されたアセンブリが含まれていない、あるいはロードされていない状態となる。
これにより、UnityはPrefabをインスタンス化しようとした際に、そのPrefabに含まれるコンポーネントの型を特定できず、参照が破損する。
この現象は、UI要素が複雑にネストされていたり、Unity標準のUIシステム(UGUI)やTextMeshProなど、多様なアセットに依存するコンポーネントを使用する場合に顕著になる。
まとめ
UnityのAddressable Asset Systemは強力なアセット管理ツールだが、UI関連の参照破損という問題に直面することがある。
これは、UIコンポーネントの型情報が格納されたアセンブリへの依存関係が適切に解決されないために発生する。主要な解決策は、Addressables設定の「Non-Recursive Dependency Calculation」のチェックを外すことだ。これにより、アセットの依存関係が再帰的に解決され、UIコンポーネントが参照する下層アセットの欠落を防ぐ。
バンドルサイズはわずかに増えるが、深刻な問題を回避できる大きなメリットがある。
この記事が、UIの参照破損に悩む開発者の一助となれば幸いだ。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ