/// <summary> /// プレイヤーを発見した時の処理 /// プレイヤーを可能な限り追います /// </summary> /// <exception cref="Exception">プレイヤーが設定されていない時</exception> private void foundFunc() { //プレイヤーが発見されていない時の例外 if (stateMan.Player == null) { throw new Exception("this enemy hasn't found player yet."); } if (!nav.pathPending) { //プレイヤー方向にレイを飛ばす var ray = new Ray(transform.position + new Vector3(0, 1, 0), stateMan.Player.transform.position - transform.position); RaycastHit hit; //プレイヤーを見つけたかどうか bool foundPlayer = false; //プレイヤーを発見できた方向に向かう if (Physics.Raycast(ray, out hit, searchRange)) { if (hit.collider.CompareTag("Player")) { //プレイヤーが視界内にいるなら武器射程までで止まる nav.stoppingDistance = equipMan.getWeaponRange(searchNear); //目標地点を決定 nav.destination = stateMan.Player.transform.position; foundPlayer = true; } //攻撃中でないなら if (stateMan.State != EnemyState.ATTACKING) { //射程内に入った時点で攻撃中にステート変更 if (nav.remainingDistance <= equipMan.getWeaponRange(searchNear)) { stateMan.State = EnemyState.ATTACKING; } } else { //攻撃中なら、射程外に行くと攻撃中ステートを解除 if (nav.remainingDistance >= equipMan.getWeaponRange(searchNear)) { stateMan.State = EnemyState.FOUND; } } } //プレイヤーが見つからなかったら if (!foundPlayer) { if (nav.remainingDistance >= 0.15f) { if (nav.stoppingDistance >= equipMan.getWeaponRange(searchNear)) { //まだ最後に見かけた地点まで到達しておらず、stopDistanceが再設定されていなかったら0.15fまで //射程を踏み越えて見かけた地点まで行く nav.stoppingDistance = searchNear; } } else { //万策尽きたら見失う stateMan.State = EnemyState.FINDING; } } } }