質問: Unityで作成中のゲームアプリにおいて、 スクリプトからプレハブ化したオブジェクトをインスタンス化する際の シーン構成についてA案とB案があり、 アプリサイズ縮小、シーン管理のシンプル化、動作負荷の低減について知見を頂けませんでしょうか。 <前提条件> 10個のゲームステージがあり、ステージ背景は全て同一です。 各ステージにおいて30種類ずつのオブジェクトが登場します。 10ステージ合計で300種類のオブジェクトになります。 <検討案> A案: 10個のステージごとに異なるシーンを用意し、それぞれで30種類のオブジェクトをインスタンス化。 B:案 シーンは一つだけで、フラグでステージを切り替え、300種類のオブジェクトからそのステージ用の30種を選択してインスタンス化。 <知りたい点> ゲームのサイズ縮小とシーン管理をシンプル化するため、Bの方法を取りたいのですが、 一つの生成用スクリプトに300種類のオブジェクトを設定することで動作が重くなる恐れはあるのでしょうか。 それとも、実際にインスタンス化されるのは30種類のため、シーン分割した場合と比較して動作が重くなることはないのでしょうか。 曖昧な表現で申し訳ございませんが、動作が重くなるというのは、 スマホ実機で操作していて、明らかに重くなったなと感じるレベルです。
回答: 最初にまとめ。 * 動作負荷:どれもそんなに変わらない * ロード:シーン分割した場合はシーン遷移毎に発生。B案の場合は後述 * アプリサイズ:シーン分割した方が大きくなる(どれぐらい増えるかは内容による) * 管理の楽さ:オブジェクトの内容による ケースバイケースなのでお好きな方法でどうぞ。 #### A案の場合 同じ機能が各シーンに点在することになるので開発時に少々面倒です。 プレハブ化してしまえばよいのですが、その場合入れ子構造等で問題が起きる可能性があります。 #### B案の場合 方法により負荷とロード時間が変わります。 ・最初からシーンにオブジェクトを乗せておいて表示非表示切り替え→最初のロードが長くなる、シーン切り替えは高速 ・Instantiateでオブジェクト生成→最初のロードは普通、シーン切り替え時にロード時間発生 例えば単純にプレハブの配列を持つだけなら300個あってもそれほどゲーム動作に影響は出ないとは思います。 ただ経験則上、数が多いとヒエラルキーで表示させた時に重くてデバッグが困難になります。 対策として、親子関係を持つプレハブ使うとかScriptableObject使うとか色々やり方は考えられます。 上手くやると&用途によってはシーン分割時より楽になるかもしれません。 あとB案で出来ないのは「ライトのベイク」「Navmesh」などシーンに紐付く機能です。 これらを使いたいならシーン分割を考えた方がいいです。 (やろうと思えば動的ロードも出来るのかもしれませんが) #### C案 折衷案が「基本シーン1つとステージ用オブジェクトの配置だけしたシーンを10個作ってAditiveで読み込み」です。 この場合、最初は「基本シーンとステージ1シーン」ロード、以後ステージが変わる毎にロードが発生します。 Unity5 マルチシーン編集によるUI開発事例 | enish engineering blog (上記はUIでの事例ですが3Dオブジェクトも同じ要領でいけます) ただこれもシーンをまたぐ処理は発生するので適切な処理が必要になります。 参考:【Unity】俺はまだSceneManagerを全力で使っていない! - うら干物書き #### おまけ 可能なら実際に動かして計測して比較するのがベストです。 シーン遷移ではマテリアルのキャッシュが効くので、30個のオブジェクトが「位置だけバラバラ、マテリアル的には5個のみ」みたいな場合はスクリプトでのInstantiateよりシーン遷移の方が早いかもしれません。