Unityで衝撃波を飛ばして敵を倒す

記事内に広告が含まれています。

アクションゲームで剣を振った時や魔法を使った時等にパーティクルを飛ばして敵に当たった時にダメージを与えたい事があります。

そこで今回はUnityのパーティクルにコライダを設定し主人公が剣を振った時に衝撃波を前に飛ばし敵との当たり判定が出来るようにしていきます。

パーティクル粒子の1つ1つの衝突を検知したい場合は

Unityのパーティクルの粒子1つ1つの衝突をスクリプトで検知する
Unityのパーティクルの粒子1つ1つの衝突をスクリプトで検知する事が出来るようにします。

↑の記事を参照してください。

ファンタジーの世界ならば魔法を唱えた後に炎や氷、風のパーティクルを飛ばして敵に攻撃をする時にも同じように使えます。

魔法によって前方に飛ばすだけでなく前後左右に同じパーティクルを飛ばすといった事も可能になります。

スポンサーリンク

パーティクルの設定

まずは剣を振った時に飛ばす衝撃波のパーティクルを用意しましょう。

UnityのParticleSystemを使って自前のパーティクルを作成してもいいのですが、難しいのと時間がかかるので、

AssetStoreでダウンロードしたものを使用します。

わたくしはFX EXplosion Packをインポートさせて頂きました。

パーティクルをインポートしたらヒエラルキー上にドラッグ&ドロップしてください。

パーティクルをヒエラルキーに配置

今回使用するパーティクルは↑のような階層になっています。

Exposion-[Explosion10]がParticleSystemになっているのでここのLoopingにチェックを入れSceneタブでパーティクルを連続して再生させ確認します。

衝撃波に使うパーティクル

今回使用する衝撃波のパーティクルは↑のような感じです。

衝撃波なのに爆発パーティクルを使用してますが・・・・まぁ気にしないでください。(^_^;)

パーティクルにコライダを設定する

大元のExplosion10のインスペクタからAdd Component→Physics→Box Colliderを取りつけます。

パーティクルに合わせてコライダのサイズ調整

コライダのサイズをSceneタブのパーティクルのサイズを見ながら調整します。

このコライダは単純な当たり判定部分なのでパーティクルと完全に一致せず当たり判定として使いたいサイズに調整します。

調整が終わったらさきほどチェックしたParticleSystemのLoopingのチェックを外します。

ここまでで当たり判定を付けたパーティクルが作成出来ました。

まだパーティクルを飛ばすスクリプトの作成はしてませんが、その前に主人公キャラの作成をしていきましょう。

その後にパーティクルにスクリプトを設定していきます。

主人公キャラの設定

主人公キャラクターにはStandardAssetsに入っているEthanを使います。

キャラクターの移動、アニメーション、装備した剣を振る機能を取りつけてください。

キャラクターの移動に関しては

Unityでキャラクターの移動をプログラミングしてみる
Unityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。

アニメーションに関しては

Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。

攻撃機能やアニメーションイベントについては

Unityのアニメーションイベントを使う
Unityのアニメーションイベントを使い、歩くアニメーションで地面に足を着いた時に足音を鳴らしたり剣を振っている途中で剣を振った時の音を鳴らしたりしたいと思います。

を参照して機能を取りつけてみてください。

アニメーションイベントでAttackStart、AttackEndというイベントを発生させる必要があります。

衝撃波を飛ばす確認だけして面倒な設定はしたくないという方は主人公に

というスクリプトを取りつけマウスの左ボタンを押した時に衝撃波を発生させるようにします。

さきほどの記事で主人公の動きやアニメーション、アニメーションイベントを作成した方はEthanにはProcessAttackShockwaveという新しいスクリプトを取りつけます。

アニメーションイベントでAttackStartが呼び出されたら衝撃波のプレハブをインスタンス化します。

衝撃波のプレハブはさきほど作ったExplosion10を設定します。

登場させる位置はProcessAttackが取り付けてあるEthanの位置(transform.position)+Ethanの1m前方(transform.forward)で、角度はEthanと同じにします。

衝撃波の発生位置をEthanの位置ではなく剣を振った時の位置や角度にすると発生場所や向きが変わってアニメーションによって変化を加える事が出来ます。

インスタンス化したパーティクルにはShockwaveMoveという移動させるスクリプトを取りつける予定でその中にあるSetDirectionメソッドを呼び出してパーティクルの飛ばす方向を設定しています。

これで剣を振った時にパーティクルを主人公の前方に飛ばす事が出来るようになります。

パーティクルにスクリプトを取りつける

パーティクルを移動させたり、当たり判定をするスクリプトを作成し取りつけましょう。

パーティクルを移動させるShockwaveMoveスクリプトの作成

主人公側でパーティクルを出現させる事が出来たのでパーティクルにShockwaveMoveという新しいスクリプトを取りつけ、

自身で勝手に動くようにしてみましょう。

パーティクルはRigidbodyに力を加えて動かします。

Updateメソッドではパーティクルの再生が終わったらパーティクルゲームオブジェクト自体を削除してしまいます。

今回の場合はパーティクルの再生終了と共にゲームオブジェクトを削除してますが、Startメソッドで

としてインスタンス化されたパーティクルが登場した5秒後にゲームオブジェクトを削除するようにしてもいいと思います。

SetDirectionメソッドはProcessAttackShockwaveスクリプトから呼び出され、パーティクルの進む方向を設定しています。

Rigidbodyに力を加えてパーティクルを移動させるので、FixedUpdateメソッド内で進む方向に力を加えています。

コライダのIs Triggerのチェックのオンオフによってやり方がかわるのでOnTriggerEnterとOnCollisionEnterの両方を記載しました。

  • Is Triggerのチェックが入っている場合は侵入を検知するOnTriggerEnter
  • Is Triggerのチェックが入っていない場合は衝突を検知するOnCollisionEnter
  • を使います。

    Is Triggerにチェックが入っていないとパーティクルをインスタンス化した時に主人公自身と衝突判定がされるので、そこら辺の対処も必要になります。

    UnityのEditメニュー→Project Settings→PhysicsでPhysicsManagerでレイヤーのマトリックスを表示させ、主人公、剣、パーティクルにそれぞれのレイヤーを設定し、

    お互いの接触をしないようにしておくといいかもしれません。

    主人公にHuman、剣にSword、パーティクルにShockwaveという名前のレイヤーを設定していたら、

    PhysicsManagerで衝撃波が当たらないようにする

    ↑のようにShockwaveとHuman、Swordの当たり判定が行われないようにしておきます。

    パーティクルゲームオブジェクトの設定

    パーティクルの当たり判定、動きのスクリプトが完成したのでパーティクルゲームオブジェクトにスクリプトを取りつけ設定をしましょう。

    今回の衝撃波の当たり判定は衝突ではなく空間の接触で判定するよう設定しますので、コライダのIs Triggerにチェックを入れます。

    またRigidbodyを使ってパーティクルを移動させるのでAdd Component→Physics→Rigidbodyを取りつけます。

    Explosionパーティクルの設定

    ↑のように設定しました。

    RigidobodyのUse Gravityにチェックを入れればパーティクルゲームオブジェクトに重力を働かせる事も出来ますが、飛ばした衝撃波に重力が働くとおかしくなるので

    今回はチェックを入れません。

    物理的なものを投げる場合は重力を働かせるほうがリアルな感じになりますね。

    設定が終わったらパーティクルゲームオブジェクトであるExplosion10をAssetsフォルダにドラッグ&ドロップしプレハブ化します。

    プレハブ化したらEthanに取り付けたProcessAttackShockwaveのshockwaveにこのExplosion10プレハブを設定しておきます。

    これで衝撃波を飛ばす機能が完成しました。

    サンプル用に壁と敵の設定をする

    衝撃波を飛ばす事が出来るようになりましたので、ぶつける対象である壁と敵とを設置してみます。

    壁は3D ObjectのCubeを使って作成し、TagにBlockを設定します。

    敵はモデルを配置しCharacterControllerを取りつけコライダのサイズを調整し、TagにEnemyを設定します。

    さきほど作成したShockwaveCheckスクリプトの処理から考えると壁にぶつかった時はパーティクルが消滅し、

    敵に当たった時はパーティクルを消して敵のゲームオブジェクトを消しています。

    衝撃波の機能を確認する

    それでは全ての機能が出来たので主人公に剣を振らせ衝撃波を飛ばして確認してみましょう。

    衝撃波が壁に当たると消え、敵に当たったら敵が消えていますね。

    四方に衝撃波を飛ばしてみる

    最後に衝撃波を前方だけでなく四方に飛ばせるようにしてみましょう。

    ProcessAttackShockwaveの衝撃波プレハブをインスタンス化している部分を改造します。

    4方向分の衝撃波を作成し発生する位置をキャラクターの中心から計算します。

    飛ばす方向も前後左右に設定するだけです。

    それでは確認してみましょう。

    ちゃんと四方に衝撃波が飛んでいますね!

    もう少し改造すれば斜め前や後ろにも飛ばす事が出来るので試してみてください。

    タイトルとURLをコピーしました