リヨスケのチラシ裏

学んだことを書き留めていく自分のための技術メモです。

【Unity】パーティクルだけ残して親オブジェクトを消す

パーティクルだけ残して親オブジェクトを消そうとしてハマったのでメモ。

 

結論から言うと、以下のように対処しました。

  1. 親オブジェクトを消したいタイミングで透明化
  2. パーティクルの再生が終わったらパーティクルシステムの"Stop Action"でDestroyする。

経緯としては、「爆弾」を投げて「ターゲット」に当たったら爆発エフェクトを残して爆弾とターゲットを消すということをやろうとしてました。

はじめはパーティクルシステムの"Stop Action"でDestroyするだけで済むと思っていたのですが、これだとパーティクルの再生が終わるまで爆弾が出っぱなしになってしまいます。

そこでいくつか試してみました。

 

親オブジェクトである爆弾を破棄

無理だろうなと思いましたが一応やってみました。

無理でした。

当然ながら親オブジェクトが破棄された時点で子オブジェクトであるパーティクルも破棄されます。

破棄ではなく無効でも同じことでした。

 

パーティクルのプロパティーでなんとかする

パーティクルの生存時間を極端に短くし、"Start Speed"を早めに設定して短い時間で展開するように設定しました。

さらに"Simulation Speed"を3にしてWorldの時間よりも高速で再生するように。

パーティクルの再生が終わるまでオブジェクトが消えないのは変わりませんが、一瞬の出来事なので気にならないといえば気になりません。

ただこれだと爆発などの速いエフェクトならまだしも、ゆっくりのエフェクトだけ残すということができないのでボツ。

 

親オブジェクトを透明化

ようは削除したように見えさえすればいいので、破棄するのではなくパーティクルの再生が終わるまで親オブジェクトを一旦透明にすることに。

オブジェクトを透明化するにはそのオブジェクトが持つ"Mesh Renderer"をスクリプト内から操作します。

MeshRenderer meshRenderer = sphere.GetComponent<MeshRenderer>();

meshRenderer.material.color = new Color(0, 0, 0, 0.0f);

 Color()の4つ目の引数のAlpha値であり、これを0にすると透明にな・・・らない。

オブジェクトが黒くなるだけで透明になりません。なぜ。

調べてみると"Rendering Mode"がデフォルトの"Opaque"は透明部分を持つことのない設定のようです。

なのでこれを"Fade"に変えてやると無事透明にすることができました。

ちなみに"Fade"の場合はAlphaを0に近づけていくと名前の通りフェードアウトしていくように透明になります。

一方で"Transparent"は完全な透明ではなく、ガラスのような質感の透明なオブジェクトになります。

"Cutout"の場合は半透明という状態が存在せず、100%不透明か完全な透明かしかありません。

デフォルトの"Opaque"は0に近づけていくとオブジェクトが黒くなっていきます。

 

さて、これで親オブジェクトを見え無くすることができましたが破棄されたわけではないのでパーティクルはしっかり再生されます。

そして再生後に"Stop Action"で今度こそ親オブジェクトを消してしまえば目的達成です。

 

おまけでつまづいたこと

爆弾を連続で同じ場所に投げたとき、1つ目の「見えないけど存在している」爆弾に2つ目の爆弾が当たってしまう現象が起きました。

先と同様にDestoryすることはできないので、爆弾が何かにぶつかったときに爆弾の持っているコライダーを無効化することで対処しました。

これで同じ場所になげても爆弾同士がぶつからずに済みます。

 

あるいはタグでぶつかる対象を制御する方が早いかもしれませんね。