公開日:2023/07/08  更新日:2023/07/08

Unityのビーム攻撃の作り方

 前回までの記事で剣で振った際にメッシュ変形により範囲攻撃が出るようにした。


 前回までの記事↓
TPSのキャラ移動
ジャンプ
ダッシュ実装
自作キャラを動き回らせる
剣を振る方法
剣コンボ
足が浮く対策
剣の軌跡の作り方
燃える剣の必殺技
ステータス管理
ダメージ判定・処理
HPゲージ
敵の攻撃
メッシュ変形での範囲攻撃

 敵の攻撃が剣で斬る攻撃だけでは面白くない。そこで今回はパーティクルを使ったビーム攻撃の作り方を紹介していく。
 以前の記事から使っている敵のスケルトンがビームを撃てるようにしていく(遠距離では連続ヒットするビーム、近距離では剣振り攻撃と使い分ける)。スケルトン素材は以下(2023年3月現在はフリー)


Unityのビーム攻撃の作り方

パーティクルの基礎
ビーム攻撃パーティクル
Animatorcontrollerの作成
Scriptableobjectの作成
スクリプト記述
目次にもどる

パーティクルの基礎

 パーティクルの基礎については以下の記事で紹介しているので確認してほしい。
パーティクルの基礎

目次にもどる

ビーム攻撃パーティクルの準備

 今回の以下のフリー素材(2023年3月現在はフリー)を使っていこうと思う。


 ParticleProFX→Resources→Library→BeamsにあるppfxBeamElectricを使っていく。まずはヒエラルキー欄にドラッグ&ドロップしよう。名前がわかりづらいのでDarkBeamに変更する。
 今回はビームは敵であるスケルトンの口から放つようにしたい。よってスケルトンの子要素の顎となっている「jar_01」の子としてAttackenkyoriを作成(パーティクルをまとめるだけの役割なので何でもいいが今回はCubeで作成しコライダーとMesh Rendererのチェックを外し、当たり判定をなくし見えなくする)。
 その、Attackenkyoriの子要素としてDarkBeamをドラッグ&ドロップ。

 今回も前回と同様にDarkBeamのインスペクター欄のScaling ModeをLocalかHierarchyに変更しよう(後で子要素にするので、大きさが変更されないようLocalにしておくのが無難)。これでScaleの値を調整することでパーティクルの大きさを変えることができるようになる。
 前回と同じくパーティクルがデカすぎるので、ScaleのX、Y、Zを0.1まで小さくしてみる。だがこれでもビームが大きいまま。このままではビームの射程が長すぎる。
 ヒエラルキー欄でDarkBeamを選択すると、Ring、Sparkles、Flare、Beamの子がついているのがわかる。これがビームが長いままの原因である。
 RingとSparklesについてもパーティクルが使われている。こちらもScaling ModeをLocalに変更しよう。
 場合によってはHierarchyに変更してもいい。だがHierarchyの場合は親の大きさが変化しても自身の大きさが変更されてしまう。今回は子ごとに個別に大きさを調整したいので、Localを選んだ。

 後は個人的な好みだが、今回はRingをDarkBeamの子要素から外し、Attackenkyoriの子とした(DarkBeamと同格とした)。Flareは削除した。
 今回はビームの射程を10mにしようと思う。
 射程の目安として10m離れた場所にCubeを配置し、親であるDarkBeamと子のRing、Sparkles、Beamの大きさを調整した。

 DarkBeamとSparklesについてはパーティクルがだんだんと進んでいきビームの形をつくる。ただ今回は攻撃を開始したら即ビームの形ができているようにしたい。そこでPrewarmにチェックをつけた。

 Prewarmにチェックをつけると、Loopingにチェックが入っているならすでにサイクルを1回完了したかのように初期化される。つまり最初からビームが完成した状態になる。
 後は各ゲームオブジェクトに色のついたマテリアルをアタッチして色を変更した(ここは自分のお好みで)。
 今回はスケルトンの攻撃なので、闇のビーム攻撃をイメージして色を設定してみた。
 DarkBeamやRingについてはマテリアルのRenderingをFadeにした。その上で色のアルファ値(透過情報)を下げて、ある程度透けて見えるようにした。

 Cylinder(円柱)のゲームオブジェクトを作成しKougekihaniと名付け、ビームの大きさに合わせてサイズと位置を調整する。  コンポーネントにRigidbodyを追加し、Freeze PositionとFreeze RotationのX、Y、Z全てにチェックをつけ重力の影響を受けなくする。
 Capsule ColliderのIs Triggerのチェックを外してトリガー判定とする。

目次にもどる

Animatorcontrollerの作成

 スケルトン用のAnimatorcontrollerを以下のように作成する

 Attackについては以前の記事で作成した近接攻撃である。
ダメージ判定・処理
 今回作るのはAttack11→Attack12の流れである。Attackパラメータが11になるとAttack11ステートに遷移する。ここで行うのは攻撃予備動作である。お好みでいいが今回Animationclipとして以下のフリー素材を使用した(2023年3月現在はフリー)。

 Blink→Art→Animations→Animation_Starter_Pack→CombatのBuffを使用する。BuffのFBXファイルをコピーし貼り付けてBuffAttackと名付けた。FBXファイルの中のBuffをAttack11のステートで使うAnimationclipとして指定する。

 Attackパラメータが12になるとAttack12のステートで攻撃に入る(そしてAttackが0になるとIdleステートに戻る)。ここのAnimationclipは何でもいいが停止系アニメーションにしておくのが無難。今回はBlink→Art→Animations→Animation_Starter_Pack→MovermentのIdleにした(コピーを作って使用)。

 今回のフリー素材の注意点として、なぜかFBXファイルの全てがtposeを再生するようになっている。Clipの以下の部分をDeleteするといい。

 どちらのFBXファイルもLoopTimeにチェックを入れよう。

 BuffAttackについてはBuffAttackStartとBiffAttackEndのメソッドを呼び出すイベントを作成する(イベントを呼び出す位置は最初と最後)。
 BuffAttackについてはLongAttackStartとLongHitとLongAttackEndのメソッドを呼び出すイベントを作成する(イベントを呼び出す位置は最初、中間(ビーム終了)、最後。中間のLongHitの位置によりビームを撃つ長さを調整できる)。

目次にもどる

Scriptableobjectの作成

 Scriptableobjectを使ってスケルトンのステータスを指定している。
 Scriptableobjectがわからない場合は以下の記事で確認してほしい。
ステータス管理
 今回はステータスにLong Attack Rangeを加え、4とした(ビームを撃つ距離)。


目次にもどる

スクリプト記述

 スケルトンに以下のスクリプトをアタッチ。


 Kougekihaniゲームオブジェクトに以下のスクリプトをアタッチ。


 Playerに以下のスクリプトをアタッチ。


 Enemystate1スクリプトを作成し、以下のように記述する。
 このスクリプトについては以前の記事で作ったものとだいたい同じ。State = Enemykoudou.EnemyAIkoudou();としており、EnemykoudouのスクリプトのEnemyAIkoudouメソッドを呼び出す。Enemykoudouの内容は以下の通り。
 これも以前の記事からあまり変化はない。
 異なるのはPlayerとの距離がShortAttackRange以下(つまり2以下)なら1、LongAttackRange(つまり4以下)なら2を返すようにしている点。Enemystate1を再び見てみよう。
 返った値によって、Attackパラメータの値が変化する。Stateが2なら、今回作ったAttack11のステートに遷移する。
 AnimationClipがイベントで呼び出すメソッドは以下のEnemyenkyori1のスクリプトに書いている。
 StartメソッドではDarkBeam関連のパーティクルとKougekihaniを無効化している(チェックを外すのをスクリプトでおこなっている)。

 Attack11のステートのAnimationClipが再生することで、BuffAttackStartが呼び出される。
 DarkBeam関連のうちRingのみをアクティブ化している。
 FullAttacktimeのパラメータもtrueにしている(予備動作を含めた攻撃の開始→終了までを指定する)。

 BuffAttackEndではAttackパラメータを12にして、Attack12ステートへ遷移する。

 Attack12ステートのAnimationClipにより、LongAttackStartがまず呼ばれる。ここでビームを構成するパーティクルやKougekihaniのアクティブ化を行っている。

 LongHitではビームを構成するパーティクルやKougekihaniの非アクティブ化を行っている。

 LongAttackEndでは硬直時間を指定を行い、FullAttacktimeをfalseにして攻撃の完全終了を指定。Attackパラメータを0にして停止ステートへの遷移を行っている。

 ビームが出ている間、攻撃範囲コライダーがPlayerに侵入すると、以下のCharaAttackのスクリプトの処理が行われる。
 以前の記事で作成したものと基本は同じ。
 異なるのはOnTriggerStayを使用している点(今までは侵入した瞬間だけ処理を行うOnTriggerEnterを使用)。
 OnTriggerStayは侵入している間処理が行われ続けるのでビームに当たり続けることによる連続ヒット処理を可能としている。
 今回はAnimationClipでLongAttackStartを呼び出した際にパラメータでHcount(ビームヒット可能数)とHitinterval(ビームヒットまでの間隔)を指定しており、この2つとコルーチンを利用して連続ヒット調整を行っている。

 Enemyenkyori1スクリプトのLongAttackStartで攻撃の種類(物理、魔法、物理+魔法)をAttacksyuruiで指定している。その値をとってきて、攻撃の種類によって。スイッチ文でダメージ処理メソッドに送る値(火力)を変えている。

 PlayerのCharadamageスクリプトのダメージ処理メソッドが処理される。Charadamageの記述は以下の通り。
 今までの記事で紹介したものとほとんど変わらない。送られた値によって物理攻撃ならDEF、魔法攻撃ならRES、物理+魔法ならDEFとRESを防御値に使ってダメージを決めるようにした。

 長くなったが、以上のようにすればPlayerとの距離が2~4ならビーム攻撃、2以下なら剣を振って攻撃するようになる(近接攻撃のほうも以前記事から修正は必要だが)。


 続きの記事は以下。
NavMeshの使い方
Unityのゲーム制作まとめへ戻る

page top