Unityのパーティクルシステムを使ってサークル状の衝撃波を作成する

今回は前回ProBuilderで作った物理的に当たるサークル状の衝撃波をパーティクルシステムを使って作成してみようと思います。

前回作成した記事の姉妹記事です。

前回作成した物理的に当たるサークル状の衝撃波の作り方は

Unityで巨人がジャンプして地面に着地した時等に発生するサークル状の衝撃波の作成をしていきたいと思います。

を参照してください。

今回作成するパーティクルシステムの衝撃波は物理的に当たらず、キャラクターに当たったとトリガーをするようにしています。

2パターンの作り方で衝撃波を作成したので、好みの方法を選択してください。(._.)

1パターン目は前回と同様にTransformのScaleを大きくして衝撃波を表現するもので、2パターン目は個々のパーティクルを移動させて衝撃波を表現します。

1パターン目は詳細を解説していますが、2パターン目は1パターン目とほとんど同じなので設定のみで詳細は省略しています。

スポンサーリンク

Scaleを大きくして作る衝撃波

まずはScaleを大きくするパターンの衝撃波を作っていきます。

ヒエラルキー上で右クリック→Effects→Particle Systemを選択し、名前をCircleShockwave1とします。

この時点でTransformのRotationのXが-90になっていない場合は-90にしておきます。

Shapeモジュールの設定

今回作成するパーティクルはサークル状にしたいので、まずはサークル状にパーティクルを放出するようにShape項目でShapeをCircleにします。

するとサークル上からパーティクルが放出されるようになります。

このままだとCircleの中からもパーティクルが放出されるので、Radius Thicknessを0にしてサークル上で放出されるようにします。

またパーティクルが放出される場所をCircle上でループして放出させる為にArcのModeをLoopにします。

パーティクル衝撃波のShapeの設定

ここまでで、サークル上をループしてパーティクルが放出されるようになります。

パーティクルがCircle上に放出される

Mainモジュールの設定

次にMainモジュールの設定を行っていきます。

衝撃波を構成する個々のパーティクルは衝撃波が発生した時に一気に表示したいのでLoopingにチェックを入れてパーティクルを繰り返し放出するようにし、Prewarmにチェックを入れて最初から全てのパーティクルを表示するようにします。

次に、このままだとパーティクルが放出されると同時に勝手に移動してしまってサークル状の衝撃波になりません。

なので、Start Speedを0にします。

Start Speedが0なのでパーティクルは放出された位置から動きません。

Start Sizeを0.3にしてパーティクルのサイズを少し小さくします。

Max Particlesを1000から100に変更します。

ここまでのMainモジュールの設定は、

CircleShockwave1のMainモジュールの設定

上のようになります。

ここまでで以下のようなパーティクルになっているはずです。

CircleShockwave1でサークル上にパーティクルを放出したサンプル

Emissionモジュールの設定

次はパーティクルの放出をEmissionモジュールで設定します。

Rate Over Lifetimeが10となっているので、100にします。

CircleShockwave1のEmissionの設定

パーティクルの生存期間中の放出数を上げたことでサークル上に表示されるパーティクルが増えました。

CircleShockwave1のEmissionを設定した後のパーティクル

上のように繋がっている一つのオブジェクトのように見えますが、実際は100個のパーティクルが重なって表示されています。

Rendererモジュールの設定

次はRendererモジュールの設定をして見た目を変更します。

Materialにパーティクルに設定したいマテリアルを設定します。

今回はスタンダードアセットのParticleFireworkを設定しました。

CircleShockwave1のRendererモジュールの設定

Render ModeはBillboardのままで平面でカメラの方向を向くモードにしていますが、ここをMeshにしてメッシュにSphere等を割り当てると見た目が立体になります(実際の当たり判定部分とはなりませんが)。

Triggersモジュールの設定

最後にパーティクルがキャラクターと接触した時にトリガー(引き金)を発動しなくてはいけません。

そこでTriggersモジュールのInsideとEnterでCallbackを設定しスクリプトで接触した事を判別できるようにします。

CircleShockwave1のTriggersの設定

Collidersには本来接触相手であるキャラクターのコライダを設定しますが、衝撃波はプレハブにしてインスタンス化して発生させる為、最初からコライダを設定する事は出来ません。

コライダは衝撃波に取り付けるスクリプトから設定する事にします。

パーティクルに関する処理を行うParticleScriptの作成

作成した衝撃波のパーティクルは段々と広がっていく必要があります。

その為新しくParticleScriptスクリプトを作成し、CircleShockwave1に取り付けます。

Startメソッドでキャラクターの名前でゲームオブジェクトを検索し、そこからParticleShockwaveCharaスクリプトを取得します。

その後、パーティクルシステムのTriggerのCollidersの0番目にキャラクターのコライダを設定します。

Updateメソッドでは時間を計測してパーティクルのゲームオブジェクトのTransformのScaleを大きくしたり、指定した時間が経過したらゲームオブジェクト自体を削除する処理をしています。

OnTriggerParticleメソッドはParticleSystemのTriggersモジュールでCallbackを選択していた時に呼ばれるメソッドです。

この中でパーティクルのInside、Enterのパーティクルを全部取得し、キャラクターと接触しているもの(Collidersにキャラクターのコライダだけを設定したのでキャラクターのみが接触対象)のパーティクルの色を赤色にします。

numInsideとnumEnterの数がどちらかでも0出なければ接触したということなのでキャラクター操作スクリプトParticleShockwaveCharaのDamageメソッドを呼び出しています。

パーティクルを段々と見えなくする処理

パーティクルは今のところ最初に登場した時から消えるまで段々と見えなくなるようにはなっていません。

この処理を作るにはColor over Lifetimeを使うと簡単に出来そうですが、パーティクル個々の生成時間によって透明になっていく度合いが変わるため、全体を一緒に透明にしていく処理が難しいです。

そこでTriggersのOutsideをCallbackにして、スクリプトでパーティクル個々のStartColorのアルファ値を下げていくようにしてみます。

ParticleScriptに処理を追加します。

フィールドにalphaValueを追加します。

OnParticleTriggerメソッド内に上の方にいくつかの処理を追記します。

パーティクルがOutsideの状態の時に時間経過と共にalphaValueの値を下げていきます。

0以下になったら0にします。

これで処理が完成しました。

完全に綺麗に消えていくわけではなく、最後にいくつかのパーティクルが残る場合があります。

なのでDeleteTimeが5の場合はそれよりも長い間パーティクル生存時間を設定しておきます。

MainモジュールのLifetimeを6にしてパーティクルのゲームオブジェクトが消えるよりも長いパーティクル生存時間にします。

Scaleを大きくしていく衝撃波の確認

Scaleを大きくしていく衝撃波が出来上がったので、試してみましょう。

CircleShockwave1をAssetsエリアにドラッグ&ドロップにしてプレハブにします。

ヒエラルキー上のCircleShockwave1はいらないので削除します。

前回の記事

Unityで巨人がジャンプして地面に着地した時等に発生するサークル状の衝撃波の作成をしていきたいと思います。

のInstantiateParticleスクリプトをMain Cameraに取り付け、ParticlePrefabにCircleShockwave1のプレハブを設定します。

上のようになりました。

Scaleを大きくしていく衝撃波の問題点

Scaleを大きくしていく衝撃波は出来上がりましたが、いくつか問題点があります。

それはサークル上にパーティクルが満遍なく放出されているように見えますが、一部かけている部分があります。

ここら辺はMainモジュールやEmission、Shape辺りをいじってうまくやるしかなさそうです。

先ほど書きましたが、MainモジュールでLoopingにチェックを入れている為、パーティクルの生存期間が過ぎると新しいパーティクルを生成します。

その為、ParticleScriptのdeleteTimeとパーティクルのLifetimeは相互に調整する必要があります。

パーティクルを移動させて作る衝撃波

次はScaleを大きくして衝撃波にするのではなく、発生させたパーティクルを移動させる衝撃波を作ってみます。

ヒエラルキー上で右クリック→Effects→Particle Systemを選択し、名前をCircleShockwave2とします。

Shapeモジュールの設定

ShapeモジュールはScaleを大きくしていく衝撃波と同じ設定です。

circleshockwave2のShapeの設定

Mainモジュールの設定

MainモジュールもScaleを大きくしていく衝撃波とほぼ同じ設定です。

ただ、今回は全てのパーティクルが終了した時の処理をStop ActionでDestroyに指定し、ゲームオブジェクトを削除する事にします。

circleshockwave2のメインモジュールの設定

Emissionモジュールの設定

EmissionモジュールもScaleを大きくしていく衝撃波と同じ設定です。

CircleShockwave2のEmissionの設定

Velocity over Lifetimeモジュールの設定

Velocity over Lifetimeにチェックを入れます。

Velocity over Lifetimeはパーティクルの生存期間中の速度の設定が出来ますが、今回はMainモジュールでLoopingとPrewarmにチェックを入れない為、パーティクルはMaxParticlesの数になるまで順に生成されます。

その為、パーティクル数がMaxParticlesの数を超えるまでは動かない設定にしておきます。

CircleShockwave2のVelocity over Lifetimeの設定

Velocity over Lifetimeはスクリプトから操作する事にします。

Color over Lifetime

次にパーティクルの生存期間中にパーティクルの色を変化させる為、Color over Lifetimeにチェックを入れ、Colorをクリックします。

CircleShockwave2のColor over Lifetimeモジュールの設定

上のようにAlphaの右の矢印部分をクリックし、Alphaの値を0にします。

こうすることで、パーティクル個々が生存期間中に段々と透明になっていき、消滅する時には完全に透明になります。

ここのパーティクルの生存期間はMainモジュールで設定したLifetimeになります。

Lifetimeは5に設定したのでパーティクルが放出されてから5秒後にパーティクルは透明になり、MainモジュールのStop ActionでDestroyを指定した為、ゲームオブジェクトが削除されます。

Triggersモジュールの設定

次にパーティクルがキャラクターと接触した時にスクリプトで判定出来るようにする為、Triggersモジュールの設定をします。

InsideとEnterでCallbackを設定し、スクリプトで判定出来るようにします。

CircleShockwave2のTriggersモジュールの設定

Rendererモジュールの設定

次にRendererモジュールの設定をします。

こちらは適当にマテリアルを設定します。

CircleShockwave2のRendererモジュールの設定

パーティクルの移動処理スクリプト

CircleShockwave2に新しくParticleScript2スクリプトを作成し取り付けます。

今回作成したパーティクルはMaxParticlesの値である100まで順番にパーティクルを生成します。

その為、パーティクルを100個生成し、サークル上に配置するまでに少し時間がかかります。

なので、パーティクルのシミュレーションスピードを一時的に上げて、100個生成するまでの時間を早めます。

また100個になるまでパーティクルのRendererを無効化して表示をしないようにします。

Updateメソッド内で現在のパーティクル数がMaxParticlesの数を超えた時にシミュレーションスピードを1と最初の値に戻し、Rendererを有効にし、Velocity over Lifetimeのradialを2にしてパーティクルが移動するようにします。

OnParticleTriggerメソッド内の処理はScaleを大きくしていく衝撃波と同じ処理になります。

これで機能が出来上がりました!

CircleShockwave2をAssetsエリアにドラッグ&ドロップしてプレハブにし、Main CameraのInstantiateParticleにCircleShockwave2プレハブを設定します。

ヒエラルキー上のCircleShockwave2は削除します。

パーティクルを移動させて作る衝撃波の確認

パーティクルを移動させて作る衝撃波は、

上のようになりました。

パーティクルを移動させて作る衝撃波の問題点

パーティクルを移動させて作る衝撃波もいくつか問題点があります。

Scaleを大きくしていく衝撃波と同じようにサークル上のパーティクルが一部かけてしまいます。

また先ほど書きましたが、MainモジュールでLoopingとPrewarmにチェックを入れていない為、最初からパーティクルが表示されません。

その為スクリプトで面倒くさい処理をしています。

終わりに

今回2パターンのパーティクルの衝撃波を作成しましたが、どちらも完全にうまくいったという感じには出来ませんでした。

何かうまい方法もあるかもしれませんが、ある程度は出来たので今回はこれで終わります・・・・(._.)

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます