Unityで主人公キャラが敵を攻撃出来るようにする機能

前回敵キャラが主人公を攻撃してくるようになりました。

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

主人公としても攻撃する手段がほしいところです。
というわけで、剣を振って敵キャラを攻撃出来るようにしてみます。

主人公が敵を攻撃するサンプル

↑のような感じになります。

今回の機能の作成の流れとしては、

Asset Storeで剣の3Dオブジェクトを探してインポートし、主人公に持たせます。

剣にはコライダを設定し、敵キャラとの当たり判定が出来るようにします。

前回までに作っていた主人公キャラ操作スクリプトのMoveと敵キャラのEnemyスクリプト、それぞれのAnimatorControllerを修正していきます。

スポンサーリンク

剣をキャラクターの手に持たせる

UnityのAsset Storeから剣をインポートします。

検索でswordというキーワードを入れて無料のBroadSwordを探し、インポートします。

キャラクターの右手の子要素に剣を持たせる

インポートしたら主人公キャラボーンの右手の部分にちょうど持つ感じで位置と角度を合わせます。
前回までの記事で懐中電灯を持たせている方はOffにしておきます。

懐中電灯の記事は

スポットライトを懐中電灯の3Dオブジェクトの子要素に配置し、懐中電灯のライトを表現してキャラクターがそれを手に持つようにします

こちらになります。

剣に当たり判定(コライダ)を設定する

剣にコライダを設定する

剣にAdd ComponentからCapsuleColliderを追加し、パラメータを剣の周りをカバーするぐらいの大きさにします。

主人公の剣にコライダを設定する

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

接触判定をするAttackSwordスクリプト

AttackSwordスクリプトはこのCapsuleColliderの接触判定をするスクリプトになります。

接触した相手がEnemyタグを持つインスタンスだった場合、そのインスタンスにSetStateメソッドの実行をさせます。

この辺りは前回の敵キャラの攻撃の判定と同じになります。

敵キャラクターにはEnemyタグを設定しておきます。

アニメーターコントローラーに攻撃状態と遷移を作成

主人公キャラクターのAnimatorControllerにAttack状態を追加

主人公の攻撃アニメーションはAsset Storeでwarriorで検索し出てくるWarrior Pack Bundle 2 Freeをインポートしその中で使用されているアニメーションを使用しました。

アニメーションパラメータにTrigger型のAttackを作成し、

アニメーションの遷移はそれぞれの状態からAttackがtrueになった時にAttackへと遷移するように作ります。

遷移はHas Exit Timeのチェックを全部外してください。出ないと攻撃ボタンを押してもなかなか攻撃しません。

Attack→Idleへの遷移は

主人公のAttack→Idleの遷移条件の設定

↑のようにHas Exit Timeにチェックを入れ、SettingsのInterruption SourceをNext Stateにして他の条件が成立したらすぐに遷移するようにします。

すべての状態からAttackへと遷移させてるので、Any Stateを使おうと思ったんですが、思うような処理が出来なかった為やめました・・・・(-.-)

Attackにいる状態でもAttackがtrueになった時にAttack状態に遷移する為かもしれません。


--Any Stateを使う方法がわかりましたので追記します(2017/04/08)--

Any StateからAttackへの遷移部分を選択し、インスペクタを表示します。

自分自身からは遷移させないようにする

↑のようにCan Transition To Selfのチェックを外せばAny StateからAttackへと遷移する際にAttackへの遷移途中は無視されるようになります。

しかしスクリプトで条件なしで攻撃の状態へとさせた場合は遷移途中にAttackがtrueになるので攻撃が終わった後に再度攻撃アニメーションへと遷移します。

ここら辺はやっぱり条件を付けないといけません。

遷移途中やある状態にいる時に遷移させたくない場合は

UnityのAnimatorの状態をスクリプトで取得し攻撃ボタンを連続で反応させないようにします。

を参照してください。

-- 追記終了 --

アニメーションイベントを作成する

主人公の攻撃用のアニメーションイベントを作成する

アニメーションのイベントも敵キャラの時と同じようにAttackStart、AttackEnd、StateEndの3つを作りました。
アニメーションイベントは

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

の記事内で触れているので参照してみてください。

アニメーションイベントの受け取りスクリプト

最後に主人公キャラにProcessMyAttackというスクリプトを新しく作り設定します。

中身はアニメーションイベントを受け取る処理になります。

アニメーションの再生位置によって当たり判定に使うコライダのOn・Offをしています。
これも敵キャラの攻撃時と同じ処理になります。

Moveスクリプトに作成していたEndDamageメソッドを削除し、ProcessMyAttackに移動させました。

敵のEnemyスクリプトのSetStateでは文字列を渡していましたが、主人公キャラのMoveスクリプトでは状態をそのまま渡すことにしました。

アニメーションイベントの問題?

このアニメーションイベントですが、場合によっては呼ばれない事があります。

例えば主人公が攻撃中に敵の攻撃を受けてしまい、主人公の攻撃アニメーションのアニメーションイベント部分までの再生がされず、ダメージアニメーションへ遷移してしまう時です。

AttackEndが呼ばれないとすると敵の手のコライダがオフにならないままになってしまいます。

そんな時はビヘイビアを使用するとうまくいきます。

Unityでアニメーションを即時遷移させているとアニメーションイベントが実行されない時があります。そんな時にビヘイビアを設定しておくと確実に処理を実行する事が出来ます。

主人公キャラ操作スクリプトの修正

次に主人公キャラの処理をしているMoveスクリプトを修正します。

まずは主人公の状態を表す列挙型にAttackを追記します。

次に攻撃ボタンを押した時の処理をUpdateメソッドに追記します。

Input.GetButtonDown(“Fire1”)で攻撃ボタンが押されたかどうか判定しています。

Fire1にはデフォルトでマウスの左クリックが設定されています。

SetStateメソッドは

のように作成しました。

攻撃状態になったらvelocityを0にし、状態変数の更新をした後、アニメーションパラメータのAttackをトリガーして攻撃に遷移させます。

敵キャラクターの修正

敵キャラクターのスクリプトへの追加とAnimatorControllerの追加を行います。

Enemyスクリプトの修正

敵が攻撃を受けた時の処理をEnemyスクリプトに追加します。

まずは敵の状態の列挙型にDamage状態を追記します。

次にSetStateメソッド内に攻撃を受けた状態を追記します。

ダメージを受けたら状態フィールドを変更し、velocityを0にし移動値を初期化します。

その後SetTriggerでDamageをトリガーします。

敵のAnimatorControllerに追加

次に敵がダメージを受けた時の状態を追加します。

敵にダメージを受けた時の状態を作成する

Damage状態には主人公のDamageアニメーションと同じものをつかいました。

Any State→Damageに遷移を繋げ、それぞれの条件はDamageのトリガーがされた時にします。

Damage→Idleの条件では、

敵のAnimatorControllerでDamageからIdleへの遷移条件

↑のようにHas Exit timeにチェックを入れアニメーションが最後まで再生されてからIdleへと遷移させますが、Interruption SourceでNext Stateを設定しているので、他の条件が成立したら遷移するようにしています。

主人公キャラの攻撃が完成

これで攻撃が出来るようになりました。

終わりに

これで主人公キャラの攻撃が出来るようになりました。
次回は武器と懐中電灯等の装備を切り替えられるようにしてみます。

スポンサーリンク

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

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