void Search() { // ターゲット消失時 if (target == null) { if (DrowningPersonList.Count == 0) { torpedoState = TorpedoState.FAILED; return; } else { for (int i = 0; i < DrowningPersonList.Count; i++) { if (DrowningPersonList[i] == null) { continue; } target = DrowningPersonList[i]; return; } torpedoState = TorpedoState.FAILED; return; } } if (SuccessFlg) { if ((target.transform.position - (transform.position + transform.up)).magnitude < 1f) { if (target.tag == "DrowingPerson") { torpedoState = TorpedoState.RESCUE; target.GetComponent <DrowningPersonBehavior>().Rescued(); StageData.IncreaseRescuePersonCnt(); } else { torpedoState = TorpedoState.FAILED; } } else if ((target.transform.position - (transform.position + transform.up)).magnitude < 10f && timeElapsed >= timeOut2) { if (TorpedoSpeed > TorpedoMinSpeed) { decel(); } timeElapsed = 0.0f; } else if ((target.transform.position - (transform.position + transform.up)).magnitude < 30f && timeElapsed >= timeOut) { if (TorpedoSpeed > TorpedoMaxSpeed / 2f) { decel(); } else if (TorpedoSpeed < TorpedoMaxSpeed / 2f) { accel(); } timeElapsed = 0.0f; // ボート出現 GetComponent <boatmove>().StartAnimation(); } else if ((target.transform.position - (transform.position + transform.up)).magnitude > 30f) { accel(); } } else { if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 1f) { if (target.tag == "DrowingPerson") { torpedoState = TorpedoState.RESCUE; target.GetComponent <DrowningPersonBehavior>().Rescued(); StageData.IncreaseRescuePersonCnt(); } else { torpedoState = TorpedoState.FAILED; } } else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 10f && timeElapsed >= timeOut2) { if (TorpedoSpeed > TorpedoMinSpeed) { decel(); } timeElapsed = 0.0f; } else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 30f && timeElapsed >= timeOut) { if (TorpedoSpeed > TorpedoMaxSpeed / 2f) { decel(); } else if (TorpedoSpeed < TorpedoMaxSpeed / 2f) { accel(); } timeElapsed = 0.0f; } else if ((new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude > 30f) { accel(); } } if (transform.position.y > -4.5f || transform.position.x > 100f || transform.position.x < -100f || transform.position.z > 50f || transform.position.z < -50f) { torpedoState = TorpedoState.FAILED; } // --------------- 移動 ----------------- transform.position += transform.forward * TorpedoSpeed * Time.deltaTime; // --------- 障害物感知 --------- HitCheck(); // 障害物なし if (!hitplace[(int)CheckPlace.Down] && !hitplace[(int)CheckPlace.Left] && !hitplace[(int)CheckPlace.UP] && !hitplace[(int)CheckPlace.Right]) { Vector3 vec; if (SuccessFlg) { vec = (target.transform.position - (transform.position + transform.up)).normalized; } else { vec = (new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).normalized; } // 救出者が右にいる if (Vector3.Dot(vec, transform.right) <= 1f && Vector3.Dot(vec, transform.right) > 0.1f) { MoveRight(); } // 救出者が左にいる else if (Vector3.Dot(vec, transform.right) >= -1f && Vector3.Dot(vec, transform.right) < -0.1f) { MoveLeft(); } // 救出者が上にいる if (Vector3.Dot(vec, transform.up) <= 1f && Vector3.Dot(vec, transform.up) > 0.1f /* && (new Vector3(target.transform.position.x, target.transform.position.y - 5f, target.transform.position.z) - (transform.position + transform.up)).magnitude < 10f*/) { MoveUp(); } // 救出者が下にいる else if (Vector3.Dot(vec, transform.up) >= -1f && Vector3.Dot(vec, transform.up) < -0.1f) { MoveDown(); } } // 障害物あり else { // --------- 回避 --------- Avoidance(); } // --------- 前進速度制限 ----------- // 最大 if (TorpedoSpeed > TorpedoMaxSpeed) { TorpedoSpeed = TorpedoMaxSpeed; } // 最小 if (TorpedoSpeed < TorpedoMinSpeed) { TorpedoSpeed = TorpedoMinSpeed; } }
// ===================== Update ======================= void Update() { if (stageState.GetComponent <StageState>().GetStageState() == StageState.STAGE_STATE.SHOOT) { return; } if (stageState.GetComponent <StageState>().GetStageState() == StageState.STAGE_STATE.PRODUCTION) { if (ProductionDist >= 0f) { transform.position -= new Vector3(0f, Time.deltaTime * 2f, 0f); ProductionDist -= Time.deltaTime * 2f; } return; } // 加速・減速間隔計算用 timeElapsed += Time.deltaTime; switch (torpedoState) { case TorpedoState.SEARCH: Search(); break; case TorpedoState.RESCUE: Rescue(); break; case TorpedoState.FAILED: Failed(); break; case TorpedoState.EMERGENCY: decel(); if (!SearchDirection[(int)CheckPlace.UP]) { turn(CheckPlace.UP); } else if (!SearchDirection[(int)CheckPlace.Left]) { turn(CheckPlace.Left); } else if (!SearchDirection[(int)CheckPlace.Down]) { turn(CheckPlace.Down); } else if (!SearchDirection[(int)CheckPlace.Right]) { turn(CheckPlace.Right); } if (TorpedoSpeed < TorpedoMinSpeed && timeElapsed >= timeOut2) { torpedoState = TorpedoState.SEARCH; if (TorpedoRotUD >= TorpedoMaxRot) { SearchDirection[(int)CheckPlace.UP] = true; } else if (TorpedoRotLR <= -TorpedoMaxRot) { SearchDirection[(int)CheckPlace.Left] = true; } else if (TorpedoRotUD <= -TorpedoMaxRot) { SearchDirection[(int)CheckPlace.Down] = true; } else if (TorpedoRotLR >= TorpedoMaxRot) { SearchDirection[(int)CheckPlace.Right] = true; } timeElapsed += Time.deltaTime; } break; case TorpedoState.RETURN: break; default: break; } if (destflg) { Destroy(this.gameObject); } }
// 回避 void Avoidance() { bool up, left, down, right; up = hitplace[(int)CheckPlace.UP]; left = hitplace[(int)CheckPlace.Left]; down = hitplace[(int)CheckPlace.Down]; right = hitplace[(int)CheckPlace.Right]; if ((!up && !left && down && right) || (!up && !left && !down && right) || (up && !left && !down && right) || (up && !left && down && !right) || (up && !left && down && right)) { // 左に回避 MoveLeft(); } else if ((!up && left && down && !right) || (!up && left && !down && !right) || (up && left && !down && !right) || (up && left && down && !right)) { // 右に回避 MoveRight(); } else if ((!up && left && down && right) || (!up && !left && down && !right) || (!up && left && !down && right)) { // 上に回避 MoveUp(); } else if ((up && !left && !down && !right) || (up && left && !down && right)) { // 下に回避 MoveDown(); } // 全部当たっている else if (up && left && down && right) { // 左チェック Vector3 vec = (transform.forward + -transform.right).normalized; vec = (transform.forward + vec).normalized; vec = (transform.forward + vec).normalized; ray = new Ray(transform.position + transform.up * 0.5f + transform.right * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green); Vector3 vec1 = (transform.up + transform.right).normalized; ray1 = new Ray(transform.position + transform.up * 0.5f + vec1 * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray1.origin, ray1.origin + ray1.direction * distance, Color.green); Vector3 vec2 = (-transform.up + transform.right).normalized; ray2 = new Ray(transform.position + transform.up * 0.5f + vec2 * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray2.origin, ray2.origin + ray2.direction * distance, Color.green); if ((Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray1, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray2, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island"))) { // 右チェック vec = (transform.forward + transform.right).normalized; vec = (transform.forward + vec).normalized; vec = (transform.forward + vec).normalized; ray = new Ray(transform.position + transform.up * 0.5f - transform.right * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green); vec1 = (transform.up + -transform.right).normalized; ray1 = new Ray(transform.position + transform.up * 0.5f + vec1 * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray1.origin, ray1.origin + ray1.direction * distance, Color.green); vec2 = (-transform.up + -transform.right).normalized; ray2 = new Ray(transform.position + transform.up * 0.5f + vec2 * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray2.origin, ray2.origin + ray2.direction * distance, Color.green); if ((Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray1, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) || (Physics.Raycast(ray2, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island"))) { // 上チェック vec = (transform.forward + transform.up).normalized; vec = (transform.forward + vec).normalized; vec = (transform.forward + vec).normalized; ray = new Ray(transform.position + transform.up * 0.5f - transform.up * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green); if (Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) { // 下チェック vec = (transform.forward - transform.up).normalized; vec = (transform.forward + vec).normalized; vec = (transform.forward + vec).normalized; ray = new Ray(transform.position + transform.up * 0.5f + transform.up * range, vec); //Rayの可視化 ↓Rayの原点 ↓Rayの方向 ↓Rayの色 Debug.DrawLine(ray.origin, ray.origin + ray.direction * distance, Color.green); if (Physics.Raycast(ray, out hit, distance) && (hit.collider.tag == "Obstacle" || hit.collider.tag == "Island")) { torpedoState = TorpedoState.EMERGENCY; } else { MoveDown(); } } else { MoveUp(); } } else { MoveRight(); } } else { MoveLeft(); } } }