Unityで主人公が敵から隠れた時は追いかけないようにする

Unityで敵キャラクターが持っている検知エリアに主人公キャラが入った時に、敵キャラが主人公キャラを追いかけるようにしていた場合、間に障害物があっても主人公は見つかって追いかけられていました。

そこで検知エリア内に主人公が入った場合でも間に障害物があった場合は追いかけないようにします。

また、一度追いかけられたら検知エリアを出るまではずっと追いかけられるようにもします。

ではスクリプトを作っていきましょう。

スポンサーリンク

主人公を検知するスクリプトSearchAreaの修正

主人公が検知エリアに入った時に追いかけさせていたスクリプトSearchAreaを修正します。

主人公を追いかける機能に関しては

Unityで主人公キャラが近づいてきたら追いかける敵キャラを作る
Unityで主人公キャラクターが敵キャラクターに近づいたら敵が主人公に近づいてくるようにしたいと思います。

を参照してください。

moveEは敵キャラの動作スクリプトで、敵キャラの状態によって追いかけるかどうかを判断しています。

次に検知エリア(コライダの範囲内)に入ったコライダが主人公のものであった場合は、SearchAreaの位置(transform.position)から接触したコライダのゲームオブジェクトの位置(主人公の位置)までレイを飛ばし、Fieldレイヤーに設定したゲームオブジェクトに接触した場合は何もしません。

それ以外、つまり主人公が検知エリアに入っていて、間に障害物がなければ敵キャラに追いかける動作をさせます。

一度追いかける状態になった場合はOnTriggerExit、つまり検知エリアから出ないor攻撃動作をしない限りはずっと追いかけます。
これで障害物があった時は主人公キャラを追いかけないようになりました。

敵キャラ操作スクリプトMoveEnemyの修正

ついでに敵キャラの動作スクリプトMoveEnemyも修正してしまいます。

まずはUpdate関数内で追いかける状態State.chaseだった時の処理の修正です。

敵キャラが主人公キャラに到着した時にarrivedという到着判定フラグを使用していましたが、それをやめてAttack関数内でagent.Stopでエージェントの動きを止めるようにします。

また追いかけている時にキャラクターの方向に敵キャラを向けさせていましたが、これだと障害物が間にある場合も不自然にキャラクターの方を向きながら歩いてしまいますので、削除します。

敵キャラが歩く時はエージェントを再開する必要がありますので、状態設定関数SetStateの中のwalkとchaseの時にagent.Resumeを使ってエージェントの動きを再開させます。

これで無駄な個所の削除とより自然な動きになるかと思います。

サーチ1

上のように検知エリアに主人公キャラがいても追いかける動作はしないようになりました。
と言ってもこれだけじゃ本当に追いかけていないのかどうかわかりませんね・・・・(^。^)