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

記事内に広告が含まれています。

今回は主人公キャラクターが剣を振って敵を攻撃する事が出来るようにしていきます。

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

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

今回の機能を作成すると、

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

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

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

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

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

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

CharacterScriptスクリプトやEnemyスクリプト等は以前の記事で作成したものに追加の処理を加えています。

なので今までの記事の流れを知りたい方は

Unityを使った3Dゲームの作り方(かめくめ)の歩き方
Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?

を参照してみてください。

スポンサーリンク

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

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

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

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

インポートしたら主人公キャラボーンの右手の部分にちょうど持つ感じで位置と角度を合わせます。

前回までの記事で懐中電灯を持たせている方はOffにしておきます。

懐中電灯の記事は

Unityで懐中電灯を作り、キャラクターに持たせてみる
Unityのライトを使って懐中電灯を作り、キャラクターに持たせてアニメーションの動きに合わせて懐中電灯が動くようにしていきます。

こちらになります。

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

主人公に持たせた剣にAdd ComponentからCapsuleColliderを追加し、AttackSwordスクリプトを新しく作り取り付けます。

剣の当たり判定用コライダとスクリプト

コライダを剣の周りをカバーするぐらいの大きさにします。

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

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

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

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

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

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

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

現時点ではEnemyスクリプトのEnemyStateにDamageを作っていないのでエラーが出ますが、後で作りますので置いておいてください。

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

主人公キャラクターの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の遷移状態をスクリプトで取得し遷移させるかどうかを決める
UnityのAnimatorの状態をスクリプトで取得し攻撃ボタンを連続で反応させないようにします。

を参照してください。

-- 追記終了 --

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

主人公の攻撃アニメーションにアニメーションイベントを加えます。

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

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

アニメーションイベントは

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

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

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

前回主人公キャラクターのアニメーションイベントの受け取りスクリプトをProcessCharaAnimEventという名前で作成しました。

そこに処理を追加します。

アニメーションの再生位置によって当たり判定に使うコライダのOn・Offをしています。

これも敵キャラの攻撃時と同じ処理になります。

主人公のゲームオブジェクトに設定したProcessCharaAnimEventのインスペクタでCapsule Colliderに右手に持たせた剣をドラッグ&ドロップし、剣のコライダを設定します。

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

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

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

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

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

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

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

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

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

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

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

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

SetStateメソッドは

のように作成しました。

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

敵キャラクターの修正

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

Enemyスクリプトの修正

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

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

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

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

アニメーションパラメータのAttackがトリガーされていた場合はResetTriggerでリセットします。

(敵が攻撃中に主人公の攻撃が敵に当たったら敵の攻撃をキャンセルします)

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

敵のAnimatorControllerに追加

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

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

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

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

Damage→Idleの条件では、

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

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

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

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

終わりに

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

タイトルとURLをコピーしました