【Unity】子オブジェクトとしてプレハブを生成する方法

f:id:clrmemory:20171116194403p:plain

 こんにちはクリアメモリです!

Unityの機能として「プレハブ」というものがあります。

プレハブを使うことは、Unityを使う中で最も便利ともいえる機能です。

 

Unityでプレハブを使うことは簡単なのですが、あるオブジェクトの子オブジェクトとして生成したいという時があります。そういった時の生成方法がわからなかったので備忘録を兼ねて記載します。

 

 

はじめに

 

今回紹介する方法は子オブジェクトとしてインスタンスするというものなのですが、今回私がぶつかったのは以下のような形でした。

まず「Player」というオブジェクトが「Enemy」というオブジェクトにぶつかったらGameOverになるという処理を作成しました。

 

その時にParticleSystemを用いて、Playerが燃えるように炎を発生させながらダメージを受けるようにしてあります。

ですが、ただインスタンスするだけではPlayerがEnemyにぶつかった位置に生成されます。

 

これをPlayerが移動したら、同じように炎も移動するというような状態にしたいんです。

Player内に生成すればPlayerと同じ動きをするようになるので、今回にぴったりの動作をしてくれるはずです。

 

つまりPlayerの子オブジェクトとしてプレハブを生成したいということです。

では、プレハブをインスタンスする時に使うコード「Instantiate」の紹介に入ります。

 

Instantiateの処理

 

プレハブをコードからインスタンス生成する時には、以下のようなコードを使うかと思います。

 

 

このDead()を呼び出すことでプレハブを生成することができます。

ですが、このコードだと親オブジェクトとして生成されてしまうので、オブジェクト内に作成することはできませんでした。

 

そこで、子オブジェクトとして生成するためには、以下のようにコードを書き換えればよいようです。

 

子オブジェクトとして生成

 

先ほどのコードを、以下を参考にして書き換えましょう。

 

 

このようにするだけで、Playerというオブジェクトの子オブジェクトとしてプレハブを生成することができるようになります。

 

Playを押してプレハブを生成した後、以下のようにPlayerというオブジェクトの中に生成されたプレハブが追加されていたら成功です。

 

   

ちなみに、今回使ったゲームを再生してみるとこのように火がつくようになりました。

(まだ開発段階なので見た目が良くありませんが、ロケットのようなものが「Player」で黄色い棒のようなものを「Enemy」としています)

  

 

ObjというGameObjectが増えただけのように見えます。

  

ですが、もしこのようにコードを書かなかった場合、以下のようなエラーが発生してプレハブを生成できないことがありました。

 

Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption. UnityEngine.Transform:xx(Transform)

 

これを回避するために、Instantiate文が多少変わっています。

 

まとめ

 

プレハブを使うことはGameを作る上で、管理が楽になったり、まとめて編集できたりといった利点がとても多いです。

ですが、逆に間違った編集をした状態ですべてのオブジェクトに適用させてしまうと大変なことになるので注意しましょう。

 

今回のような子オブジェクトとしてではなく、無限にプレハブとしてオブジェクトをインスタンスしたいというような時は以下のリンクを参考にしてみてください。

 

www.clrmemory.com

  

ではまた。

新着記事