Unityでのコンボ攻撃
前回までの記事で以下のように剣を振ることが可能となった。前回までの記事↓
TPSのキャラ移動
ジャンプ
ダッシュ実装
自作キャラを動き回らせる
剣を振る方法
今回はUnityの3Dゲームでコンボ攻撃ができるようにしていこうと思う。
具体的には左クリックを連続で行うことで4回まで連続攻撃が行えるようにしていく。
Unityでのコンボ攻撃目次
素材選び・アニメーションスクリプト記述
目次にもどる
素材選び・アニメーション
まずは使う素材を選んでいく。前の記事から引き続き以下のフリー素材を使っていく(2023年3月現在はフリー)。
・剣素材
・剣を振るアニメーション
今回はプロジェクトビューのExplosiveLLC/RPG Character Mecanim Animation Pack FREE/Animations/2-Hand-Swordフォルダの以下のアニメーションを使ってコンボを作っていく。
攻撃1回目…2 Hand-Sword-Attack 2
攻撃2回目…2 Hand-Sword-Attack 8
攻撃3回目…2 Hand-Sword-Attack 1
攻撃4回目…2 Hand-Sword-Attack 4
各アニメーションのFBXファイルを選択してインスペクター欄を見てほしい。
Animationタブを選択しEventsの矢印を選択して開いて欲しい。
メソッド「Hit」を呼び出すイベントが剣の振り終わりに設定されている。これは使えるのでそのまま使わせてもらうことにする。
それに加えて、アニメーションの終わりに「AttackEnd」を呼び出すイベントを作成しよう。
PlayerController(前記事で作ったAnimatorcontroller)に以下のようにAttack1~4のステートと遷移を作成する。
Attack1~4のステートでは以下のアニメーションを呼び出すように設定しよう。
Attack1…2 Hand-Sword-Attack 2
Attack2…2 Hand-Sword-Attack 8
Attack3…2 Hand-Sword-Attack 1
Attack4…2 Hand-Sword-Attack 4
また、個人的にはアニメーション速度が遅く感じたので、各ステートのインスペクター欄でSpeedを1→1.2に変え、アニメーション再生速度を上げた。
以前作ったfloat型パラメータのAttackを使っていく。1回左クリックするたびにAttackに1加算して、連続でコンボ攻撃できるようにしていく。
各遷移のインスペクター欄は以下のように記述。
Attack1→Attack2
Attack2→Attack3
Attack3→Attack4
各Attack→Idle
全ての遷移のHas Exit Timeのチェックを外そう(アニメーションの再生終了を待たずに切り替え可能となる)。
目次にもどる
スクリプト記述
以下のようにスクリプトを記述してPlayerにアタッチした。まずはスクリプト最後尾に追加したメソッドの記述から見ていこう(これらはアニメーションのイベントによって呼び出される)。
「Hit」(剣の振り終わり)から「AttackEnd」(アニメーションの終了)までを、「左クリックすることで次の技を行うことができる受付期間」とする。
「Hit」でbool型変数Comboをtrueにして、「AttackEnd」でComboをfalseとする。Comboがtrueの間が受付期間である。
そしてUpdateメソッド内の攻撃アニメーション処理として以下のように記述している。
最初のif (Attackdekiru == true)の条件分岐は後で解説する。
その中身ではまずanim = GetComponent
Attack = anim.GetFloat("Attack");としてAttackのパラメータをAttackに代入。
そして次のf (Combo == true)でComboの条件分岐の登場。
まずはComboがfalseだった場合だが、その場合はelseの処理が行われる。
if (Attack == 0)つまり攻撃を何もしていない状態の時に、if (Input.GetMouseButtonDown(0))つまり左クリックされればAttackのパラメータに1が代入され、Attack1のアニメーションが再生される。
Attack1のアニメーションで剣の振り終わりに「Hit」のイベントが起き、ComboがTrueとなる。ComboがTrueの場合の処理は以下である。
Comboがfalseとなる「AttackEnd」のイベントが起こる前に左クリックが押されれば、if (Input.GetMouseButtonDown(0))の処理が行われる。
Comboをfalseとしつつ、Attack += 1f;で1加算した(よってAttackは2となった)。その数値をAttackパラメータに入れている。よってAttack2のアニメーションがはじまる。
左クリックが押されないまま「AttackEnd」のイベントが起こると以下の処理が行われる。
Combo = false;に加えAttackのパラメータを0にする。これで次に左クリックをしてもAttack1からのスタートとなる。
次はUpdateメソッドのif (Attack == 4)の条件分岐を見ていこう。
この条件に当てはまったということはAttack4(つまり最後の攻撃)を出したことを意味する。
よって、nim.SetFloat("Attack", 0f);でAttackのパラメータを0にしている。
加えてAttackdekiru = false;と記述している。攻撃アニメーションの最初の条件分岐でif (Attackdekiru == true)としているので、Attackdekiruがfalseの間は剣を振って攻撃できなくなる。
更にStartCoroutine(ComboEnd())としてコルーチンを使っている。ComboEndのメソッドが呼び出される。処理は以下の通り。
ComboEndtimeにはあらかじめ1を代入してある。よってyield return new WaitForSeconds(ComboEndtime);と記述することで1秒待機する。その後にAttackdekiru = true;と記述しており再度攻撃ができるようになる。
これで最大で4回連続で攻撃し、4回連続攻撃後は1秒間攻撃できないようにすることができた。コンボ実装完了だ。
続きの記事は以下。
足が浮く対策