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

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

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

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

流れとしては、
Asset Storeで剣の3Dオブジェクトを探してインポートし、主人公に持たせます。
剣にはコライダを設定し、敵キャラとの当たり判定が出来るようにします。

まずはUnityのAsset Storeから剣をインポートします。
検索でswordというキーワードを入れて無料のBroadSwordを探し、インポートします。

スポンサーリンク

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

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


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

懐中電灯の記事は

ライトを使って、懐中電灯を作り、キャラクターに持たせてみる
スポットライトを懐中電灯の3Dオブジェクトの子要素に配置し、懐中電灯のライトを表現してキャラクターがそれを手に持つようにします
こちらになります。

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

剣にコライダを設定する

剣にAdd ComponentからCapsuleColliderを追加し、パラメータを剣の周りに大きめに設定します。
剣の大きさと同じくらいや少し大きめに作っても当たり判定が非常にシビア、というか当たっても当たっている判定がされていない感じがするので、大きめに設定しました。

剣のコライダを大きめに設定する

上のようにかなり大きめに設定しました。
個人の好みで調整してみてください。

接触判定スクリプト

MyAttackスクリプトはこのCapsuleColliderの接触判定をするスクリプトで、

接触した相手がEnemyタグを持つインスタンスだった場合、そのインスタンスにNockBack関数の実行をさせます。

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

アニメーターに攻撃状態と遷移を作成

主人公の攻撃状態と遷移を作成する

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

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

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

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

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

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

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

Unityで敵キャラが主人公に近づいた時に攻撃をしてくる機能
Unityで主人公が敵に近づいた時に敵が主人公を攻撃してくる機能を作成します
の記事内で触れているので参照してみてください。

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

最後に主人公キャラにProcessMyAttackというスクリプトを新しく作り設定します。
中身はアニメーションイベントを受け取る処理になります。

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

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

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

Input.GetButtonDown(“Fire1”)で攻撃ボタンが押されたかどうか判定しています。
Fire1にはデフォルトでマウスの左クリックが設定されています。

Fire1のボタンを連打するとフリーズする不具合があったので条件を追加しました。
animator.GetCurrentAnimatorStateInfo(0).IsName(“Attack”)で現在Attackのアニメーションであるかどうか?を判定しています。攻撃中であれば連続でボタンを押しても反応しないようにします。
自前の状態保持変数でアニメーションを制御していたんですが・・・どこか抜けがあるみたいで直にアニメーターの状態を見に行かざるを得なくなりました・・・・(^_^;)

押されたら攻撃関数Attackの処理、それ以外でダメージを受けている状態でなければWalk関数を実行します。

Attackでは状態をState.attackに変更し、アニメーションパラメータのBoolean値をOnにします。

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

これで攻撃が出来るようになりました。
敵キャラと主人公の攻撃とダメージ部分の作成が完了しました。

終わりに

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