Exemplo n.º 1
0
    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);
        }
    }