初心者向けの本などで学習していると、何かをSceneに配置するときにはPrefabをあらかじめ用意してからInstantiate
を用いることが多いですが、それは要らないときもある、という話です。
#コンストラクタから作るGameObject
GameObject
型はコンストラクタが在り、それを実行することで動的に生成することが可能です。
GameObject hogeGameObject = new GameObject("Hoge");
新たにGameObject
をSceneに配置可能です。必要に応じてAddComponent
すればほしい機能を持ったGameObject
も簡単にメモリ上に展開できます。
無駄を減らせる?注意してみよう
- これを利用することで予めPrefabで用意しInstantiateが要らなくなる
- 無駄に常駐させるGameObjectを減らせる可能性がある
こうした利点があるので、「これは一時的に存在すれば済む」というものには積極的に利用する検討をしてみましょう。頻繁に生成や削除をする場合は、コストがかさむのでお勧めしません、適宜、パフォーマンスをどうしたらよくなるか、考えながら作りましょう。
Sceneに在るGameObjectをコピーする方法
prefabを用いない方法には他に、Scene内のGameObject
を参照してInstantiate
で複製するという方法もあります。
GameObject origin = GameObject.Find("Hoge"); //元になるHogeを探す
GameObject hogeGameObject = new GameObject(origin); //Hogeを複製
この場合は予めSceneに存在しないと出来ないので、何か在るものを増やしたいときには有効です。あまり頻繁にやると、newと同じくらいのコストがかさむので注意は必要です。
Prefabが要るかの使い分け
Prefabを用いた場合、以下の特徴があります。
- ファイルが分れるので別の人に作業分担してもらいマージしやすい
-
AddComponent
で追加がたくさんある場合コストが下がる - エディタでコンポーネントの操作をするのでゲームデザイナーにもいじるのが優しい
- Scene内の何かの参照は持てないので動的にやりくりする仕組みは必要(GameObjectのコンストラクタを用いた後の処理と似たものが要る)
こうしたことを踏まえて、考えていきましょう。データの分け方にはScene
で分ける方法もあるので、チームでどうしたいのか、更新するとしたらどのAssetの単位でやったらいいのか、なども考えると良いですね。
参照などの話はこちらも参考になります。
【Unity】動的に増やすGameObjectは別にPrefabでなくとも良い
http://tsubakit1.hateblo.jp/entry/2018/03/01/005236