Unityのアクションゲームで連続攻撃を実現する方法

今回はUnityでアクションゲームを作った時に主人公が連続攻撃を出来るようにします。

例えばマウスの左クリックをすると上から剣を振りおろす攻撃をします(そうプログラミングした場合)が、剣を振りおろしている最中にもう一度マウスの左クリックをすると剣を振りおろした後に左横から右横へと剣を振る別のアニメーションの攻撃を行います。

連続攻撃にする為には現在の攻撃が行われている最中にマウスの左クリックを押す必要があり、最初の振りおろす攻撃が終わった後にマウスの左クリックを押した場合は振りおろす攻撃になります。

この連続攻撃の機能を作るには2つの方法があります。

  1. アニメーターのBehaviourスクリプトで制御
  2. 通常のスクリプトで再生アニメーションを調べ制御

の方法になります。

通常のスクリプトで制御すると結構面倒臭い事になるので、Behaviourスクリプトで制御します。
まずは機能を作成する前に攻撃のアニメーションと装備する武器を用意します。

スポンサーリンク

剣とアニメーションをAssetStoreで探す

AssetsStoreで無料のものを使わせて頂きましょう。

Warrior Pack Bundle 2 FREE
1H_Swing_Low_Left

上の2つが攻撃用のアニメーション。

Simple Medieval Sword

上が武器の3Dオブジェクトになります。
まったく同じものを使用する必要はなくご自分で用意したものをお使いください。

武器をキャラクターに装備させる

まずはキャラクターに武器を装備させます。

連続攻撃1

EthanRightArmの子要素に武器をドラッグ&ドロップし位置を調整します。
武器の合わせ方は

Unityでキャラクターに正確に武器を持たせる
Unityでキャラクターの手の位置に正確に武器を持たせるように調整します。なんとなく持たせる位置を設定していた人には朗報かも!?

を参照してください。

アニメーターコントローラを作成する

次にキャラクターのアニメーターコントローラを開きアニメーションパラメータにAttackをBool型で作成しておきます。
マウスの左クリックを押した時にこのAttackをOnにします。

連続攻撃2

上のようにアニメーターの遷移を繋ぎます。
Attack1からAttack2、Attack3と攻撃が遷移します。

IdleとRunからAttack1 HasExitTimeのチェックを外し、Attackがtrueという条件
Attack1→Idle HasExitTimeにチェックを入れ、Attackがfalseという条件
Attack1→Attack2 HasExitTimeにチェックを入れ、Attackがtrueという条件
Attack2→Idle HasExitTimeにチェックを入れ、Attackがfalseという条件
Attack2→Attack3 HasExitTimeにチェックを入れ、Attackがtrueという条件
Attack3→Idle HasExitTimeにチェックを入れ、条件はなし

という流れを作成します。

Animatorについては

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

を参照してください。

Attack1~Attack3までそれぞれの攻撃アニメーションをセットしてください。
わたくしは

Attack1にKnight@Attack1.FBX
Attack2に51_1H_Hero@1H_sword_swing_low_left_humanoid.FBX
Attack3にMage@Attack1.FBX

を設定してみました。

これでアニメーターで攻撃の遷移が作成出来ました。

アニメーターコントローラの遷移方法を考える

次にAttack1のアニメーション再生中にマウスの左クリックを押した時にAttack2に遷移させる方法を考えます。

遷移するには現在Attack1のアニメーションが再生中である事を検出する事、アニメーションパラメータのAttackがOnである事がわからなければなりません。

またアニメーションパラメータのAttackはIdleやRunからAttack1に遷移した時にOnにしたまま(攻撃に遷移する際に必ずOnにしているはず、その機能はまだ作っていませんが)Offにしていないので、Attack1に遷移したらOffにする必要もあります。

これらの処理をまとめて行います。

アニメーターコントローラのBehaviourスクリプトを作成

アニメーターコントローラのBehaviourスクリプトを使います。

連続攻撃3

Attack1を選択すると上のようにインスペクタが表示されます。
Add BehaviourボタンをクリックしBehaviourスクリプトのAttackTestを作成します。

Behaviourスクリプトを作成するとデフォルトでコメント化されている関数が記述されています。
BehaviourはC#でしか作れないみたい?です。

Behaviourに関しては

UnityアニメーターコントローラのBehaviourでアニメを制御する
Unityアニメーターコントローラを通常のスクリプトで制御するのではなくBehaviourを使って制御するようにします

を参照してください。

連続攻撃用BehaviourのAttackTestを記述する

コメント化されている

OnStateEnter(この状態に入ったら)
OnStateUpdate(この状態である場合)
OnStateExit(この状態を抜ける時)

のコメントを外します。

それぞれの関数(C#なのでメソッドですかね?)はカッコ内で記述したタイミングで呼ばれます。
さきほどの処理をタイミングに応じて変更していきます。

この状態に入ったらアニメーションパラメータAttackをfalseにする
この状態である場合、マウスの左クリックを押したらAttackをtrueにする
この状態を抜ける時、Attackをfalseにする

Attackの値の取り扱いで注意すべき事

状態を抜ける時にAttackをfalseにしていますが、この状態に入った時にfalseにしてるので
要らないと思うかもしれません。

しかし、この条件がないとAttack3からIdleへと遷移する時に、アニメーションパラメータのAttackがOnの時、つまりAttack3のアニメーション再生中にマウスの左クリックを押していた時は、Idleに遷移した後すぐにAttack1へと移行してしまいます。

通常のスクリプトから制御する事も可能だと思いますが、複雑化していくのでBehaviourで制御した方がいいかもしれません。

もちろんAttack3→Idle→Attack1と連続して遷移させたい場合はこの条件は要りません。

これでBehaviourスクリプトが完成したのでAttack2、Attack3の状態にもこのAttackTestを追加してください。

キャラクター操作スクリプトでマウスの左クリックをした時に攻撃させる処理を追加する

最後にキャラクター操作スクリプトMoveTestを修正し、マウスの左クリックを押した時にアニメーションパラメータのAttackをOnにする処理を加えます。
MoveTestなんて知らない!という方はキャラクターを操作しているスクリプトに攻撃の処理を追加してください。

移動値を計算している個所に攻撃中は移動をさせたくない為、条件を追加します。

またマウスの左クリックが押されたらアニメーションパラメータのAttackをOnにします。
条件には他の状態にいない、や遷移途中でない事を条件に加えます。

IsInTransition(レイヤー番号)

で遷移途中かどうかを判断出来ます。

Unityの実行ボタンを押して確認してみましょう。

連続攻撃4

攻撃のアニメーションがバラバラなのであれですが、
流れるようなアニメーションを用意すれば綺麗に出来ると思います。

連続攻撃のアニメーション遷移が出来たので他に必要な処理も追加しよう

これでUnityのアクションゲームで連続攻撃を実現する方法が完成しました。
今回は連続攻撃のアニメーション遷移を作成しましたが、武器のコライダの設定、コライダのOn・Off、当たり判定のスクリプトは設定されていません。

その辺りは、

Unityで敵キャラが主人公に近づいた時に攻撃をしてくる機能
Unityで主人公が敵に近づいた時に敵が主人公を攻撃してくる機能を作成します

を参考にして作成してみてください。

アニメーターコントローラの遷移を分け、Behaviourで押したキーによって違う状態に遷移させると、違う攻撃の繋げ方を作成する事も出来ます。

多少処理が難しくなりそうですが、攻撃ボタンを押した時のアニメーションの再生位置によって次の攻撃を変更する。
といった事も出来そうですね。

格闘ゲームとかで使えそう(^_^)v