Unityちゃんに剣を振らせるように出来たので、フィールド上にいる敵を倒せるようにしたいと思います。という訳で、これまで作成してきたアニメーターやスクリプトを修正していきます。
【Unity3D】フィールド上の敵を倒せるようにする
Unityちゃんのアニメーターを修正する
プレイヤーと敵それぞれにHPを持たせるようにしますが、敵のHPが0になったらDestroyを使ってその場で消すようにします。
一方Unityちゃんが倒された場合は、対応するアニメーションを再生したいと思います。
Dieアニメーションを作成してAny Stateから繋ぐようにします。パラメーターはTrigger型ですね。
Motionは、Unityちゃんがダウンしているようなアニメーションを設定するようにしてください。
Statusmanagerスクリプトの修正
先ほど作成したアニメーションに対応するステートを増やし、ダメージ処理を実装しました。
EnemyStatusスクリプトの修正
敵が倒された際の処理を実装しています。
Attackスクリプトの修正
このスクリプト内に、OnTriggerEnterメソッドを作ってダメージ計算を行おうとしましたが、敵オブジェクトには、サーチ用と当たり判定用のコライダを両方アタッチしているため、プレイヤーが敵の追跡範囲内に入った時点でダメージを受けてしまいます。
また、ゲーム開始時に当たり判定用のコライダを無効にしておきます。
そこで、UnityEventを使って指定したタイミングで、HitObjectメソッドを実行するようにします。
SlimeControllerスクリプトの修正
敵を倒した際に「”Stop” can only be called on an active agent that has been placed on a NavMesh.」というエラーが表示されるのでスクリプトを修正しました。
恐らく、agentに関する処理を無効にすることで良いのかなと思います。敵が倒されていないならという条件を付与することでこのエラーは解消されました。
HitAttackDirectorスクリプトを作成する
OnTriggerEnterで実行されるメソッドを設定するためのスクリプトですね。
保存したらこのスクリプトを、敵の子オブジェクトである「AttackCollider」とUnityちゃんの子オブジェクト「PlayerAttackCollider」にそれぞれアタッチします。
これは敵の例ですが、On Trigger Enter(Collider)の下にある「+」ボタンをクリックして敵オブジェクトを左下の枠にドラッグ&ドロップします。
続いて、実行したいメソッドを指定します。今回の場合はAttackスクリプトのHitObjectを実行したいので「Attack」→「HitObject」を選択します。同様にUnityちゃん側も設定します。
レイヤーの設定
プレイヤーは敵のみを攻撃出来るように、また敵もプレイヤーのみを攻撃できるようにするためレイヤーの設定を行います。
インスペクターの右上にある「Layer」→「Add Layer」をクリックします。
画像のようにレイヤーを4つ作成します。
SDUnitychan → 「Player」
PlayerAttackCollider → 「PlayerCollider」
敵オブジェクト → 「Enemy」
AttackCollider → 「EnemyCollider」
となるようにに各オブジェクトに対してレイヤーを設定します。
続いて「Edit」→「Project Settings…」→「Physics」を開きます。
下にたくさんのチェックボックスが表示されると思うので、衝突させたいレイヤー同士にチェックを入れるようにします。
PlayerColliderはEnemyのみとして、EnemyColliderはPlayerとのみ衝突するようにします。
プレイヤーと敵のインスペクターからMaxlifeに適当に数字を入力してゲームを実行してみましょう。
相手のlifeが0になったらこのように消えるはずです。
インスペクタから攻撃時のlifeの減り方をチェックしてみると良いと思います。
※追記
このままだと、敵のサーチ用コライダ内でUnityちゃんが振った場合にも敵のHPが削られてしまいます。ということで、敵にアタッチしているサーチ用コライダを子オブジェクトを作成してそちらにアタッチさせたいと思います。
敵の子オブジェクトとして空のオブジェクト「Search」を作成します。後はその中にSphere Colliderを作ればOKですね。これで敵のサーチ内で剣を振ってもダメージを与えることはなくなります。