メインコンテンツまでスキップ
非公開のページ
このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。

2026-07-13 なぜ Unity の Export .unitypackage 機能はこれほど多くのアセットを含んでしまうのか?

Unity デフォルトの Export .unitypackage 機能を使用して、プロジェクト間でアセットを転送するためにカスタムアバターをエクスポートする場合、 カスタムアバターではよくあることですが、アセットは複数のフォルダに散らばっていることがよくあります。

しかし、エクスポートの内容には、カスタムアバターには特に必要のない余計なアセットが含まれてしまうことがよくあります。

これらの理由はすべて下の画像にまとめられていますが、最初に挙げる理由は非常に意外なものかもしれません。 最初の理由は詳しく読み、それ以外については、仕組みがわかれば予想がつくものも多いため、ざっと目を通すことをお勧めします。

before.png

プレハブインスタンスがフィールドをオーバーライドしつつ、そのフィールドを含むコンポーネントを削除している

プレハブインスタンスがコンポーネント上のアセット参照をオーバーライドしており、かつそのプレハブインスタンスがプレハブ内に存在する同じコンポーネントまたは GameObject を削除している場合、 アセットを参照しているオーバーライドは存在し続けます。

さらに、Unity エディターのプレハブオーバーライド UI は正しくなく、削除されたコンポーネント内のオーバーライドされた参照を表示しません。 コンポーネントの削除を取り消すと、そこに含まれていた隠れた参照が露出します。

外部ツールなしでこの問題を検出することはほぼ不可能です。

アクティブなヒエラルキー内の参照が、使用していないプレハブソース内の Transform を指している

コンポーネントには、アバターでそのプレハブソースを使用していない場合でも、モデルのサブアセットやプレハブ内のトランスフォームへの迷い込んだ参照が含まれていることがあります。

これが問題なのは、そのプレハブソースで使用されているすべての参照と、それらによって参照される他のアセットが必要になってしまうからです。

私のプロジェクトでは、SkinnedMeshRenderer の anchor override がプレハブソース内のトランスフォームを指していることが時々ありました。

参照がプレハブモデルのサブアセットを指している

プレハブソースやモデルのサブアセット(Mesh など)が必要な場合、プレハブソース全体が必要になります。

これは予想される動作ですが、次の理由により問題になる可能性があります。

プレハブモデル (FBX) に、使用していないテクスチャへの参照が含まれている

プロジェクト内のテクスチャが、プレハブモデル (FBX) によって直接参照されていることがあります。

アクティブなマテリアルのいずれでもそのテクスチャを使用していない場合でも、含まれてしまう可能性があります。

プレハブソースが、オーバーライドしたアセットを必要としている

プレハブソースは、プレハブインスタンスまたはプレハブバリアントによってオーバーライドされているため使用していないアセットを、デフォルトで指すようにセットアップされている場合があります。

これは通常、購入したアバターを使用しているが、一部のマテリアルをオーバーライドしている場合に当てはまります。

結果として、これらのアセットが、同様に使用していない可能性のあるテクスチャなどの他のアセットを参照している場合があります。

プレハブソースが、削除したコンポーネントや GameObject 内のアセットを必要としている

前の理由と非常に似ていますが、アセットを別のアセットでオーバーライドする代わりに、コンポーネントまたは GameObject を完全に削除した場合です。

プレハブインスタンスまたはプレハブソースが EditorOnly の GameObject 内のアセットを必要としている

コンポーネントや GameObject を削除する代わりの方法として、後で再導入できるようにオブジェクトを保持するために EditorOnly に設定するのが一般的です。

プレハブソースが使用していないアセットを参照している可能性があるだけでなく、自分自身でプレハブインスタンス上のアセットを使用して一部のフィールドをオーバーライドしており、 それが結局使用されないということもあり得ます。

これが未使用アセットとしてカウントされるかどうかは、ワークフローにおいて EditorOnly をどのように使うかは人によって異なるため曖昧ですが、言及しておく価値はあります。

コンポーネントやマテリアルがスクリプトやそのスクリプト内の参照を必要としている

コードを含む一部のファイルは、エクスポート時に必ずしも必要ではないかもしれませんが、これらのスクリプトが他のオブジェクトを参照していることもあります。

  • マテリアルはシェーダーを必要とします。シェーダーは通常、別途インストールされます。
    • シェーダーには、デフォルトのテクスチャへの参照が含まれていることがあります。それらのテクスチャは通常、シェーダー自体と一緒にインストールされます。
  • GameObject が MonoBehaviour を参照している場合、スクリプトや DLL が必要になることがあります。これらは通常、別途インストールされます。
    • MonoBehaviour がアイコンを使用している場合、そのアイコンが含まれてしまうことがあります。

別のゲームにエクスポートする場合、コンポーネント内の一部の参照が望ましくない場合がある

あるゲームから別のゲームにエクスポートする場合、コンポーネント内の一部の参照が無関係になることがあります。

  • 一部のコンポーネント(例:Modular Avatar Menu Item)は別のプロジェクトでは無関係な場合があり、アイコンテクスチャなどのアセットへの参照を含んでいます。
  • 一部の独自アセット(例:Expression Menu)は別のプロジェクトで互換性がない場合があり、それらのアセット自体が他のアセットへの参照を含んでいることがあります。
  • 一部の Unity アセット(例:Animator ControllerAnimation Clip)は別のプロジェクトでは無関係な場合があります。

ビフォーアフター

以前の様子(この記事の冒頭にある画像と同じものです):

before.png

その後:

after.png