Пример #1
0
    void ShootAnyway(Vector2 lastCorrectPoint)
    {
        float   distance     = Vector2.Distance(ball.transform.position, lastCorrectPoint);
        Vector2 q            = new Vector2(lastCorrectPoint.x - ball.transform.position.x, lastCorrectPoint.y - ball.transform.position.y).normalized;
        float   skaleOfFails = 0.001f;
        float   random       = Random.Range(1, 100) * skaleOfFails;

        if (q.x > 0)
        {
            q.x += random;
        }
        else
        {
            q.x += -random;
        }
        if (q.y > 0)
        {
            q.y += random;
        }
        else
        {
            q.y += -random;
        }
        float velocity = Vector2.Distance(ball.transform.position, lastCorrectPoint) * Random.Range(2.4f, 5f);

        SwitchColider.Invoke();
        RaycastHit2D hit = Physics2D.Raycast(new Vector2(ball.transform.position.x, ball.transform.position.y), q, distance);

        if (hit.collider != null && (hit.collider.tag == "Sand" || hit.collider.tag == "Ramp"))
        {
            velocity = maxVelocity;
        }
        if (velocity > maxVelocity)
        {
            velocity = maxVelocity;
        }
        ball.Shoot(velocity, q);
        ball.ballColider.enabled = true;
        return;
    }
Пример #2
0
    public void OnPathComplete(Path p)
    {
        if (p.error)
        {
            Debug.Log("No path: " + p.errorLog);
        }
        else
        {
            Path    path             = ball.seeker.GetCurrentPath();
            Vector3 lastCorrectPoint = new Vector3(1, 1, 0);
            if (path.vectorPath.Count <= 2)
            {
                Vector2 vec = new Vector2(path.vectorPath[1].x - ball.transform.position.x, path.vectorPath[1].y - ball.transform.position.y).normalized;
                ball.Shoot(Vector2.Distance(ball.transform.position, path.vectorPath[3]) * Random.Range(1.8f, 3f), vec);
            }
            else
            {
                SwitchColider.Invoke();
                ball.ballColider.enabled = false;
                foreach (var item in path.vectorPath)
                {
                    // dla kazdego punku na trasie do dolka szuka najodleglejszej mozliwej kolizji
                    Vector2      q        = new Vector2(item.x - ball.transform.position.x, item.y - ball.transform.position.y).normalized;
                    float        distance = Vector2.Distance(ball.transform.position, item);
                    RaycastHit2D hit      = Physics2D.Raycast(new Vector2(ball.transform.position.x, ball.transform.position.y), q, distance);

                    if (hit.collider != null)
                    {
                        Debug.Log("Ball angle: " + Vector2.Angle(new Vector2(ball.transform.position.x, ball.transform.position.y), hit.point));
                        Debug.DrawLine(new Vector2(ball.transform.position.x, ball.transform.position.y), hit.point, Color.white, 10f);
                        Vector2 bounceDir = bounceDirection(q);
                        Debug.DrawLine(hit.point, bounceDir, Color.red, 10f);
                        // Debug.DrawLine(hit.point, bounceDir, Color.red, 10f);
                        // Debug.DrawLine(hit.point, bounceDir, Color.red, 10f);

                        // Vector2.Angle()
                        // Vector3 rayPosition = new Vector3(transform.position.x, headHeight, transform.position.z);
                        // Vector2 leftRayRotation = Vector2.AngleAxis(10, hit.point);
                        // Vector3 rightRayRotation = Quaternion.AngleAxis(fovAngle, transform.up) * transform.forward;

                        // //Constructing rays
                        // Ray rayCenter = new Ray(rayPosition, transform.forward);
                        // Ray rayLeft = new Ray(hit.point, leftRayRotation);
                        // Ray rayRight = new Ray(rayPosition, rightRayRotation);

                        // ustawia kierunek uderzenia, uwzgledaniajac losowy blad celuje w punkt ostatniego "widzianego przez pilke" miejsca bez kolizji
                        q = new Vector2(lastCorrectPoint.x - ball.transform.position.x, lastCorrectPoint.y - ball.transform.position.y).normalized;
                        float skaleOfFails = 0.001f;
                        float random       = Random.Range(1, 100) * skaleOfFails;
                        if (q.x > 0)
                        {
                            q.x += random;
                        }
                        else
                        {
                            q.x += -random;
                        }
                        if (q.y > 0)
                        {
                            q.y += random;
                        }
                        else
                        {
                            q.y += -random;
                        }

                        // ustawia sile uderzenia, uwzgledaniajac losowy blad
                        float velocity = Vector2.Distance(ball.transform.position, lastCorrectPoint) * Random.Range(2.4f, 5f);

                        // jesli pilka znajduje sie na piasku, ustaw sile udezenia na maksymalna
                        SwitchColider.Invoke();
                        hit = Physics2D.Raycast(new Vector2(ball.transform.position.x, ball.transform.position.y), q, distance);
                        if (hit.collider != null && (hit.collider.tag == "Sand" || hit.collider.tag == "Ramp"))
                        {
                            velocity = maxVelocity;
                        }

                        // jesli wartosc predkosci przekroczy wartosc max dla gracza, ustaw maksymalna wartosc na sztywno
                        if (velocity > maxVelocity)
                        {
                            velocity = maxVelocity;
                        }

                        ball.Shoot(velocity, q);
                        ball.ballColider.enabled = true;
                        return;
                    }
                    lastCorrectPoint = item;
                }
                ShootAnyway(lastCorrectPoint);
            }
        }
    }