private IEnumerator UpdateAI() { GameManager gm = GameManager.Instance; Chara opponent = gm.charas[1 - PlayerID]; Vector2 move_target = transform.position; float change_target_time = 0; while (true) { while (Time.timeScale == 0) { yield return(null); } Vector2 pos = transform.position; Vector2 opos = opponent.transform.position; Vector2 opos_pred = opos + opponent.rb.velocity * 0.5f; // Chaser if (IsChaser()) { if (waypoints.HasLOS(pos, opos)) { move_target = opos_pred; } else if (Time.time - change_target_time > 0.1f) { move_target = waypoints.FindPathNextWP(pos, opos_pred); change_target_time = Time.time; } } // Runner else { if (Time.time - change_target_time > 0.1f) { // Choose waypoint furthest from opp with direct path as move target float dist_to_opp = 0; foreach (Vector2 wp in waypoints.Points) { if (!waypoints.HasLOS(pos, wp)) { continue; } Vector2 wp_dir = (wp - pos).normalized; Vector2 opp_dir = (opos_pred - pos).normalized; if (Vector2.Angle(wp_dir, opp_dir) < 45f) { continue; } float dist = Vector2.Distance(wp, opos_pred); if (dist > dist_to_opp) { move_target = wp; dist_to_opp = dist; } } change_target_time = Time.time; } } // Set move dir des_move_dir = (move_target - pos).normalized; Debug.DrawLine(pos, move_target, Color.red); // Power if (power != Power.None) { if (UnityEngine.Random.value < 0.01f) { UsePower(); } } yield return(null); } }