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

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

そこで今回は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で3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。

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

Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

今回の場合はパーティクルの再生終了と共にゲームオブジェクトを削除してますが、主人公に設定したProcessAttackスクリプトでパーティクルをインスタンス化している所で

Destory(obj, 5);

としてインスタンス化した後に5秒後にゲームオブジェクトを削除するようにしてもいいと思います。

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

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

パーティクルの当たり判定を行うShockwaveCheckスクリプトの作成

パーティクル自身で移動を行う事が出来ましたので、何らかの物体に当たった時の処理をパーティクルのゲームオブジェクトに設定します。

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

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

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

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

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

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

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

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

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

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

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

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

    Explosionパーティクルの設定

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

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

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

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

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

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

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

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

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

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

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

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

    敵に当たった時はパーティクルを消して敵にダメージを与えています。

    敵にはZombieDamageスクリプトを取りつけておきます。

    ShockwaveCheckスクリプトから呼ばれたDamage関数では自身のゲームオブジェクトを消しています。

    つまり衝撃波が当たると敵が消えるようにしています。

    衝撃波の機能を確認する

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

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

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

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

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

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

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

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

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

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

    スポンサーリンク

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

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