Unityで敵キャラクターが持っている検知エリアに主人公キャラが入った時に、敵キャラが主人公キャラを追いかけるようにしていた場合、間に障害物があっても主人公は見つかって追いかけられていました。
そこで検知エリア内に主人公が入った場合でも間に障害物があった場合は追いかけないようにします。
↑のように一旦敵に追いかけられた場合は敵が攻撃するか、主人公が検知エリア外に出ない限りはずっと追いかけられます。
追いかけられていない状態の時に壁に隠れた状態で敵の検知エリアに入っても追いかけられないようになっています。
ではスクリプトを作っていきましょう。
主人公を検知するスクリプトSearchCharacterの修正
敵の主人公を追いかけさせるスクリプトSearchCharacterを修正します。
主人公を追いかける機能に関しては
を参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using UnityEngine; using System.Collections; public class SearchCharacter : MonoBehaviour { private Enemy moveEnemy; [SerializeField] private LayerMask obstacleLayer; void Start() { moveEnemy = GetComponentInParent<Enemy>(); } void OnTriggerStay(Collider col) { // プレイヤーキャラクターを発見 if (col.tag == "Player") { // 敵キャラクターの状態を取得 Enemy.EnemyState state = moveEnemy.GetState(); Debug.DrawLine(transform.position + Vector3.up, col.transform.position + Vector3.up, Color.blue); // 敵キャラクターが追いかける状態でなければ追いかける設定に変更 if ((state == Enemy.EnemyState.Wait || state == Enemy.EnemyState.Walk) && !Physics.Linecast(transform.position + Vector3.up, col.transform.position + Vector3.up, obstacleLayer) ) { moveEnemy.SetState(Enemy.EnemyState.Chase, col.transform); } } } void OnTriggerExit(Collider col) { if (col.tag == "Player") { moveEnemy.SetState(Enemy.EnemyState.Wait); } } } |
検知エリア(コライダの範囲内)に入ったコライダが主人公のものであった場合は、SearchCharacter(transform.position)にVector3.upを足した位置から接触したコライダのゲームオブジェクトの位置(主人公の位置)までレイを飛ばし、インスペクタで設定した障害物のレイヤーに接触していなければキャラクターを追いかけさせます。
それ以外、つまり主人公が検知エリアに入っていて、間に障害物がなければ敵キャラに追いかける動作をさせます。
一度追いかける状態になった場合はOnTriggerExit、つまり検知エリアから出ないor攻撃動作をしない限りはずっと追いかけます。
これで障害物があった時は主人公キャラを追いかけないようになりました。
上のように検知エリアに主人公キャラがいても追いかける動作はしないようになりました。
と言ってもこれだけじゃ本当に追いかけていないのかどうかわかりませんね・・・・(^。^)
敵キャラクターの視界に入った時だけ追いかけさせるようにすればよりリアルになりますね。