質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1051閲覧

UnityのAssetBundle対象についての考え方

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/06/29 08:25

UnityでAssetBundle対象にするリソースを決める際なのですが、下記のような場合はどのような方針にしますでしょうか。

下記のようなエフェクトのPrefabとそのエフェクトOrefabを子に持つカットインのPrefabがあったとします
・Effect1.prefab(Sprite1を参照)
・Effect2.prefab(Sprite2を参照)
・Effect3.prefab(Sprite3を参照)

・CutIn1.prefab(子に「Effect1」「Effect2」「Effect3」をもつ)
・CutIn2.prefab(子に「Effect2」をもつ)

======
AddressableAssetSystemを使用し、「cutin」というGroupにカットインのPrefabを追加します。
ゲーム内ではカットイン演出の時のみ「CutIn1.prefab」または「CutIn2.prefab」をロードして複製して表示させます。
逆を言えば「Effect」系Prefabはそれ単体ではロードすることはなく「CutIn」系のPrefab内部で使用されるのみとなります。

この時、「CutIn」関連のPrefab2つのみGroupに追加(AssetBundle対象)にした場合、「Effect」系のPrefabを子に持っているため
・CutIn1.prefabには「Effect1」「Effect2」「Effect3」がついてきて更にEffectが参照しているSpriteもついてきます。
・CutIn2.prefabには「Effect2」がついてきて更にEffectが参照しているSpriteもついてきます。
こちら「それ単体でロードすることはない」場合でも「Effect」系のPrefab、SpriteもAssetBundle対象(Groupに追加)にした方が良いのでしょうか?

ご教授いただければと思います。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

めんどくさい話をするので、先に結論から言っておくと、Address登録はした方がいいです。


で、これからめんどくさい話をするのですが…。

BundleMode

まず最初に知っておかなければならないのは、アセットがどのAssetBundleにまとめられるか、です。
これは、AddressGroupのBundleModeの設定によって決まります。

  • Pack Together - 一つのグループで一つのAssetBundleを作ります。
  • Pack Separately - 一つのアセットで一つのAssetBundleを作ります。
  • Pack Together By Label - 同じラベルのアセットで一つのAssetBundleを作る。…らしい(使ったことがない)

AssetBundleの依存関係

で、厄介なのは「AssetBundleの依存関係」です。

質問にあるものを例に挙げると、「CutIn1.prefab」と「CutIn2.prefab」は、いずれも「Effect2.prefab」を含んでいます。
ということは、どちらのプレハブを使用するには、「Effect2.prefab」が必要になる、というわけです。

例えば、「CutIn1.prefab」と「CutIn2.prefab」がそれぞれ別のAssetBundleに分けられたとします。
Effect2.prefab」がAddress登録されていないと、それぞれに「Effect2.prefab」が必要なので、それぞれのAssetBundleに「Effect2.prefab」が暗黙的に含まれてしまいます。
つまり、重複したアセットができてしまうのです。
当然、データ容量も(同時に読み込んだ場合に)メモリ使用量も「Effect2.prefab」が2つ分確保されることになります。

これを回避するには、

  1. CutIn1.prefab」と「CutIn2.prefab」を同じAssetBundleになるようにする。
  2. Effect2.prefab」をアドレス登録する。

という手段があります。

前者はわかりやすいかと思いますが、後者の場合、「CutIn1.prefab」をロードしても「CutIn2.prefab」をロードしても、「Effect2.prefab」を含むAssetBundleをロードするようになりますし、両者を同時にロードしても同じ「Effect2.prefab」を参照することになります。

Analyzeツール

というわけでAddress登録することをおすすめしましたが、AddressableのAnalyzeツールを使うと、このような依存関係の問題を見つけ出したり、自動で解決したりしてくれます。(といいつつ、自分はあまり使ったことがないのですが)

AssetBundleのレイアウト

ついでに、どのアセットがどのAssetBundleに含まれるか、もよく検討されたほうがいいです。
あまりに細かくAssetBundleで分割すると読み込む効率が悪くなりますし、逆に一つにまとめすぎてしまうと、使用しないアセットまで読み込むことになります。

同時に使用するアセットは一つのAssetBundleにまとめる、共通して使うものは個別にAssetBundleに分ける、と言った方針で、うまい感じにAddressGroupやBundleModeを設定するといいでしょう。

投稿2022/06/29 11:50

編集2022/06/29 11:55
katsuko

総合スコア3471

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuko

2022/06/29 12:02

あ、最後の「一つにまとめすぎてしまうと、使用しないアセットまで読み込む」というのは、ちょっと間違っているかもしれません。
退会済みユーザー

退会済みユーザー

2022/06/29 22:12

丁寧な回答ありがとうございます。大変助かります。 しかし自分の理解が追いついていないため追加で質問をしたいです。   今回の場合、「CutIn1」「CutIn2」で共通で使用する「Effect2」Prefabにアドレスを登録(アセットバンドル対象)することで重複を避けるとのことですが、「Effect1」「Effect3」については「CutIn」設定時に暗黙的についてきて重複しないためアドレス登録しないという感じでしょうか?   また、基本的には今回のように重複してしまうアセットを抽出してアドレス登録していく感じの作業になるのでしょうか? 例えば、アドレス登録した2つのPrefabで同じSpriteやマテリアル(.mat)、AnimatorController(.controller)が参照されていた場合は先の通りそれぞれのPrefabに参照しているアセットが暗黙的に入ってしまい重複が生まれるため単体ではロードしないがアドレスを割り当てるという感じでしょうか?   >同時に使用するアセットは一つのAssetBundleにまとめる、共通して使うものは個別にAssetBundleに分ける、と言った方針 とありますが、今回の場合だと、CutIn系Prefab、CutIn系Prefabでしか使用しない重複の可能性があるアセット(Effect2など)は同じグループにして、ほかの場面でも使用するアセット(自作シェーダーや汎用的に使用できるSpriteなど)は別のグループ(Common的な感じ)のグループに入れるという感じでしょうか? 長くなり申し訳ありません。
katsuko

2022/06/29 23:48

だいたいあっていますが、これらをきっちり管理するのは手間だと思います。 もうちょっと曖昧に共通で使いそうなものはアドレス登録する、ぐらいに考えるのもありだと思いますし、回答にも書きましたが、いいタイミングでAnalyzeツールを使って整理する、などするのもありではないでしょうか。
退会済みユーザー

退会済みユーザー

2022/06/30 04:10

ご回答ありがとうございます。   >これらをきっちり管理するのは手間だと思います。 確かにAnimatorControllerファイルやかなり小さいSpriteは重複してでも入れてよさそうな感じがしますね。 これから依存関係が複雑になっていろいろなPrefabなどから参照されているファイルが増えるとなると更新ごとに管理に膨大なコストがかかりそうな感じがします。 どこまで妥協できるかも考えてバランスのいいところを探すのがよさそうだと思いました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問