LoginSignup
0
2

More than 3 years have passed since last update.

[Unity初心者Tips]Prefabなしもアリ!GameObjectを動的に生成する

Last updated at Posted at 2020-01-25

初心者向けの本などで学習していると、何かをSceneに配置するときにはPrefabをあらかじめ用意してからInstantiateを用いることが多いですが、それは要らないときもある、という話です。

コンストラクタから作るGameObject

GameObject型はコンストラクタが在り、それを実行することで動的に生成することが可能です。

GameObject hogeGameObject = new GameObject("Hoge");

参考:GameObject-GameObject - Unity スクリプトリファレンス
https://docs.unity3d.com/ja/2017.4/ScriptReference/GameObject-ctor.html

新たに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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2