示例#1
0
    private void Update()
    {
        //Calculate movement velocity as a 3d vector
        float _xMov = Input.GetAxisRaw("Horizontal Player " + player1Or2);

        //Apply movement
        motor.Move(_xMov * speed);

        if (!Input.GetButton("Jump Player " + player1Or2))
        {
            jumpLock = false;
        }

        //calculate jumpforce based on player input
        Vector3 _jumpForce = Vector3.zero;

        if (Input.GetButton("Jump Player " + player1Or2) && onGround && jumpAllowed && (Mathf.Abs(rb.velocity.y) < 0.1f) && !jumpLock)
        {
            _jumpForce = Vector3.up * jumpForce;
            jumpLock   = true;
        }

        //apply jumpforce
        motor.ApplyJumpForce(_jumpForce);


        float _dashForce = 0f;

        if (dashStaminaTemp > 0)
        {
            dashAllowed = true;
        }
        else
        {
            dashAllowed = false;
            dashLock    = true;
        }

        if (!Input.GetButton("Dash Player " + player1Or2))
        {
            dashLock = false;
        }

        if (Input.GetButton("Dash Player " + player1Or2) && dashAllowed && !dashLock)
        {
            _dashForce = dashForce;
            dash       = true;
            particles.Play();
        }
        else
        {
            dash = false;
            particles.Stop();
        }

        motor.ApplyDashForce(_dashForce);
    }
示例#2
0
    // Update is called once per frame
    void Update()
    {
        movementPriorities.Clear();

        _jumpForce = Vector3.zero;
        _xMov      = 0f;
        _dashForce = 0f;

        if (!thisIsLeftPlayer)
        {
            if (rbBall.transform.position.x > 8 &&
                rbBall.transform.position.y > 3)
            {
                counterBallOnGoal += Time.deltaTime;
            }
            else
            {
                counterBallOnGoal = 0;
            }
        }
        if (thisIsLeftPlayer)
        {
            if (rbBall.transform.position.x < -8 &&
                rbBall.transform.position.y > 3)
            {
                counterBallOnGoal += Time.deltaTime;
            }
            else
            {
                counterBallOnGoal = 0;
            }
        }
        //calculate distances
        distanceEnemyBall   = (rbEnemy.transform.position - rbBall.transform.position).magnitude;
        distancePlayerBall  = (rb.transform.position - rbBall.transform.position).magnitude;
        distancePlayerEnemy = (rb.transform.position - rbEnemy.transform.position).magnitude;

        if (rbBall.position.x >= 0)
        {
            ballIsRight = true;
        }
        else
        {
            ballIsRight = false;
        }

        if (rb.transform.position.x >= 0)
        {
            playerIsRight = true;
        }
        else
        {
            playerIsRight = false;
        }

        if (rbEnemy.transform.position.x >= 0)
        {
            enemyIsRight = true;
        }
        else
        {
            enemyIsRight = false;
        }


        if (Mathf.Abs(distanceEnemyBall) > ballIsFarFromEnemyDistance)
        {
            ballIsFarFromEnemy = true;
        }
        else
        {
            ballIsFarFromEnemy = false;
        }

        if (Mathf.Abs(distancePlayerBall) > ballIsFarFromPlayerDistance)
        {
            ballIsFarFromPlayer = true;
        }
        else
        {
            ballIsFarFromPlayer = false;
        }

        if (Mathf.Abs(distancePlayerEnemy) > playerIsFarFromEnemyDistance)
        {
            playerIsFarFromEnemy = true;
        }
        else
        {
            playerIsFarFromEnemy = false;
        }


        hit = Physics2D.Raycast(rbBall.transform.position, rbBall.velocity.normalized, 100, mask);

        if (hit.collider != null)
        {
            //Debug.DrawRay(rbBall.transform.position, new Vector3(hit.point.x, hit.point.y, 0) - rbBall.transform.position, Color.red, 1);

            if ((hit.transform.tag == "Player2" && !thisIsLeftPlayer) || (hit.transform.tag == "Player1" && thisIsLeftPlayer))
            {
                if (distancePlayerBall < 3 &&
                    rbBall.transform.position.y > 1 &&
                    rbBall.transform.position.y < 4)
                {
                    Jump();
                }
            }

            if (Mathf.Abs(rbBall.transform.position.x) < Mathf.Abs(rb.transform.position.x) + 1.5f &&
                Mathf.Abs(rbBall.transform.position.x) > Mathf.Abs(rb.transform.position.x) - 1.5f &&
                rbBall.transform.position.y > 1.25f &&
                rbBall.transform.position.y < 4 &&
                (!(Mathf.Abs(hit.point.x) > 3) && playerIsFarFromEnemy) &&
                (!(Mathf.Abs(hit.point.x) < 7) && playerIsFarFromEnemy) &&
                ((playerIsRight && ballIsRight) || (!playerIsRight && !ballIsRight)))
            {
                Jump();
            }


            //wenn der Ball richtung boden fliegt Priorität 0
            if (hit.transform.tag == "Ground" || hit.transform.tag == "CrossbarLeft" || hit.transform.tag == "CrossbarRight")
            {
                MoveTowards(hit.point, offset);
            }

            //wenn der Ball die Boundaries trifft Priorität 1
            else
            {
                if (hit.transform.tag == "Boundary")
                {
                    reflectionHit = Physics2D.Raycast(hit.point, new Vector2(rbBall.velocity.x * -1, rbBall.velocity.y), 100, maskRebound);
                }

                if (hit.transform.tag == "BoundaryTop")
                {
                    reflectionHit = Physics2D.Raycast(hit.point, new Vector2(rbBall.velocity.x, rbBall.velocity.y * -1).normalized, 100, maskRebound);
                }

                if (reflectionHit.collider != null)
                {
                    //Debug.DrawRay(hit.point, reflectionHit.point - hit.point, Color.blue, 1);
                    //wenn 2. Ray Boden oder Latte trifft
                    if (reflectionHit.transform.tag == "Ground" || reflectionHit.transform.tag == "CrossbarLeft" || reflectionHit.transform.tag == "CrossbarRight")
                    {
                        MoveTowards(reflectionHit.point, offset);
                    }
                }
            }

            ////wenn der Ball zum einem Tor fliegt
            //if ((Mathf.Abs(hit.point.x) > 6 && hit.point.y > 0 && hit.point.y < 8))
            //{
            //    GoToGoal();
            //}
        }
        else
        {
            GoToGoal();
        }

        //check if movement is safe
        if (!thisIsLeftPlayer)
        {
            if (playerIsRight && rbBall.velocity.x < -3f && !enemyIsRight)
            {
                GoToGoal();
            }
        }
        if (thisIsLeftPlayer)
        {
            if (!playerIsRight && rbBall.velocity.x > 3f && enemyIsRight)
            {
                GoToGoal();
            }
        }

        //wenn der Ball über dem Tor ist, werden die vorherigen Befehle überschrieben
        if (counterBallOnGoal > 1.5f)
        {
            GoOnTopOfGoal();
        }

        //wenn der spieler lange im tor steht
        if (zoneDetector.timer < 2.3f)
        {
            GoToGoal();
        }

        //dash
        if (dashStaminaTemp > 0)
        {
            dashAllowed = true;
        }
        else
        {
            dashAllowed = false;
        }

        //dasht wenn der Ball nah an dem Spieler ist und der Ball zum eigenen Tor fliegt
        if (distancePlayerBall < 1.5f && ((rbBall.velocity.x > 0 && !thisIsLeftPlayer) || (rbBall.velocity.x < 0 && thisIsLeftPlayer)))
        {
            if (dashAllowed)
            {
                _dashForce = dashForce;
                dash       = true;
                particles.Play();
            }
            else
            {
                dash = false;
                particles.Stop();
            }
        }
        else
        {
            dash = false;
            particles.Stop();
        }

        if (_jumpForce != Vector3.zero)
        {
        }

        if (movementPriorities.Count == 0)
        {
            movementPriorities.Add(0);
        }
        Debug.Log("Last movement: " + movementPriorities[movementPriorities.Count - 1]);
        motor.Move(movementPriorities[movementPriorities.Count - 1] * speed);
        motor.ApplyJumpForce(_jumpForce);
        motor.ApplyDashForce(_dashForce);
    }
示例#3
0
    private void Update()
    {
        if (Mathf.Abs(rbBall.transform.position.x) > Mathf.Abs(goalPosition))
        {
            counterBallOnGoal += Time.deltaTime;
        }
        else
        {
            counterBallOnGoal = 0;
        }

        Vector3 _jumpForce = Vector3.zero;

        _xMov = 0f;
        float _dashForce = 0f;


        //calculate distances
        distanceEnemyBall   = (rbEnemy.transform.position - rbBall.transform.position).magnitude;
        distancePlayerBall  = (rb.transform.position - rbBall.transform.position).magnitude;
        distancePlayerEnemy = (rb.transform.position - rbEnemy.transform.position).magnitude;

        if (rbBall.position.x >= 0)
        {
            ballIsRight = true;
        }
        else
        {
            ballIsRight = false;
        }

        if (rb.transform.position.x >= 0)
        {
            playerIsRight = true;
        }
        else
        {
            playerIsRight = false;
        }

        if (rbEnemy.transform.position.x >= 0)
        {
            enemyIsRight = true;
        }
        else
        {
            enemyIsRight = false;
        }


        if (Mathf.Abs(distanceEnemyBall) > ballIsFarFromEnemyDistance)
        {
            ballIsFarFromEnemy = true;
        }
        else
        {
            ballIsFarFromEnemy = false;
        }

        if (Mathf.Abs(distancePlayerBall) > ballIsFarFromPlayerDistance)
        {
            ballIsFarFromPlayer = true;
        }
        else
        {
            ballIsFarFromPlayer = false;
        }

        if (Mathf.Abs(distancePlayerEnemy) > playerIsFarFromEnemyDistance)
        {
            playerIsFarFromEnemy = true;
        }
        else
        {
            playerIsFarFromEnemy = false;
        }


        //calculate target position
        //RaycastHit2D hit = Physics2D.Raycast(rbBall.transform.position, rbBall.velocity.normalized, 100, 1 << 10);
        hit = Physics2D.Raycast(rbBall.transform.position, rbBall.velocity.normalized, 100, mask);
        Debug.DrawRay(rbBall.transform.position, new Vector3(hit.point.x, hit.point.y, 0) - rbBall.transform.position, Color.red, 2);

        if (hit.collider != null && thisIsLeftPlayer)
        {
            Debug.Log("Should move on x");
            if (hit.transform.tag == "Ground" || hit.transform.tag == "CrossbarLeft" || hit.transform.tag == "CrossbarRight")
            {
                //Debug.DrawRay(rbBall.transform.position, new Vector3(hit.point.x, hit.point.y, 0) - rbBall.transform.position, Color.red, 2);

                if (rb.transform.position.x > hit.point.x - 0.6f)
                {
                    _xMov = -1f;
                }

                if ((rb.transform.position.x < hit.point.x - 0.6f)) // && rb.transform.position.x >= 0f
                {
                    if (distanceEnemyBall > distancePlayerBall - (distancePlayerBall * 0.25f))
                    {
                        _xMov = 1f;
                    }
                }

                if (rb.transform.position.x > hit.point.x - 0.63f && (rb.transform.position.x < hit.point.x - 0.67f))
                {
                    _xMov = 0f;
                }
            }
            else
            {
                //wenn 1. Ray boundary links oder rechts trifft
                if (hit.transform.tag == "Boundary")
                {
                    reflectionHit = Physics2D.Raycast(hit.point,
                                                      new Vector2(rbBall.velocity.x * -1, rbBall.velocity.y),
                                                      100, mask);
                }

                //wenn 1. Ray boundary oben trifft
                if (hit.transform.tag == "BoundaryTop")
                {
                    reflectionHit = Physics2D.Raycast(hit.point,
                                                      new Vector2(rbBall.velocity.x, rbBall.velocity.y * -1).normalized,
                                                      100, maskRebound);
                    Debug.DrawRay(hit.point, reflectionHit.point - hit.point, Color.blue, 2);
                }

                //wenn 2. Ray Boden oder Latte trifft
                if (reflectionHit.transform.tag == "Ground" ||
                    reflectionHit.transform.tag == "CrossbarLeft" ||
                    reflectionHit.transform.tag == "CrossbarRight")
                {
                    if (rb.transform.position.x > reflectionHit.point.x - 0.6f)
                    {
                        _xMov = -1f;
                    }

                    if ((rb.transform.position.x < reflectionHit.point.x - 0.6f))                  //&& rb.transform.position.x >= 0f && reflectionHit.point.x > -1f
                    {
                        if (distanceEnemyBall > distancePlayerBall - (distancePlayerBall * 0.25f)) // höherer Wert => aggressiver

                        {
                            _xMov = 1f;
                        }
                    }
                }

                //höchste priorität: wenn Ball Richtung Tor fliegt oder ball + spieler auf der linken seite +
                if ((hit.point.x < -6 && hit.point.y > 1 && hit.point.y < 4) || (rbBall.velocity.x >= 0.1f && ballIsRight && enemyIsRight))
                {
                    _xMov = -1f;
                }
            }
        }
        else
        {
            GoToGoal();
        }


        if (hit.collider != null && !thisIsLeftPlayer)
        {
            Debug.Log(hit.collider.gameObject.name);
            Debug.Log(hit.transform.tag);
            if (hit.transform.tag == "Ground" || hit.transform.tag == "CrossbarLeft" || hit.transform.tag == "CrossbarRight")
            {
                Debug.Log("Should move on x");

                //Debug.DrawRay(rbBall.transform.position, new Vector3(hit.point.x, hit.point.y, 0) - rbBall.transform.position, Color.red, 2);

                if (rb.transform.position.x < hit.point.x + 0.6f)
                {
                    _xMov = 1f;
                }

                if ((rb.transform.position.x > hit.point.x + 0.6f)) // && rb.transform.position.x >= 0f
                {
                    if (distanceEnemyBall > distancePlayerBall - (distancePlayerBall * 0.25f))
                    {
                        _xMov = -1f;
                    }
                }

                if (rb.transform.position.x < hit.point.x + 0.63f && (rb.transform.position.x > hit.point.x + 0.67f))
                {
                    _xMov = 0f;
                }
            }
            else
            {
                //wenn 1. Ray boundary links oder rechts trifft
                if (hit.transform.tag == "Boundary")
                {
                    reflectionHit = Physics2D.Raycast(hit.point,
                                                      new Vector2(rbBall.velocity.x * -1, rbBall.velocity.y),
                                                      100, mask);
                }

                //wenn 1. Ray boundary oben trifft
                if (hit.transform.tag == "BoundaryTop")
                {
                    reflectionHit = Physics2D.Raycast(hit.point,
                                                      new Vector2(rbBall.velocity.x, rbBall.velocity.y * -1).normalized,
                                                      100, maskRebound);
                    Debug.DrawRay(hit.point, reflectionHit.point - hit.point, Color.blue, 2);
                }

                //wenn 2. Ray Boden oder Latte trifft
                if (reflectionHit.transform.tag == "Ground" ||
                    reflectionHit.transform.tag == "CrossbarLeft" ||
                    reflectionHit.transform.tag == "CrossbarRight")
                {
                    if (rb.transform.position.x < reflectionHit.point.x + 0.6f)
                    {
                        _xMov = 1f;
                    }

                    if ((rb.transform.position.x > reflectionHit.point.x + 0.6f))                  //&& rb.transform.position.x >= 0f && reflectionHit.point.x > -1f
                    {
                        if (distanceEnemyBall > distancePlayerBall - (distancePlayerBall * 0.25f)) // höherer Wert => aggressiver

                        {
                            _xMov = -1f;
                        }
                    }
                }

                //höchste priorität: wenn Ball Richtung Tor fliegt oder ball + spieler auf der linken seite +
                if ((hit.point.x > 6 && hit.point.y > 1 && hit.point.y < 4) || (rbBall.velocity.x <= -0.1f && !ballIsRight && !enemyIsRight))
                {
                    _xMov = 1f;
                }
            }
        }
        else
        {
            GoToGoal();
        }

        //wenn der Ball über dem Tor ist, werden die vorherigen Befehle überschrieben
        if (counterBallOnGoal > 1.5f && thisIsLeftPlayer)
        {
            _xMov = 1;
            if (counterBallOnGoal > 3)
            {
                if (rb.transform.position.x < -7.87)
                {
                    _xMov = 1;
                }
                if (rb.transform.position.x > -7.5)
                {
                    _xMov = -1;
                }
            }
        }

        if (counterBallOnGoal > 1.5f && !thisIsLeftPlayer)
        {
            _xMov = 1;
            if (counterBallOnGoal > 3)
            {
                if (rb.transform.position.x > 7.87)
                {
                    _xMov = -1;
                }
                if (rb.transform.position.x < 7.5)
                {
                    _xMov = 1;
                }
            }
        }

        //wenn der Ball mittig über dem Spieler ist, noch ein Stückchen nach rechts
        if ((rbBall.transform.position.x > rb.transform.position.x - 0.25f &&
             rbBall.transform.position.x < rb.transform.position.x + 0.25f) &&
            (rbBall.transform.position.y - rb.transform.position.y) < 1.25f &&
            !thisIsLeftPlayer)
        {
            _xMov = 1;
        }

        if ((rbBall.transform.position.x < rb.transform.position.x + 0.25f &&
             rbBall.transform.position.x > rb.transform.position.x - 0.25f) &&
            (rbBall.transform.position.y - rb.transform.position.y) < 1.25f &&
            thisIsLeftPlayer)
        {
            _xMov = -1;
        }

        //wenn er auf dem Tor stehen geblieben ist
        if (rb.transform.position.x > 6.28 && rb.transform.position.y > 4 && zoneDetector.timer > 2.95f && counterBallOnGoal == 0 && !thisIsLeftPlayer)
        {
            _xMov = -1;
        }

        if (rb.transform.position.x < -6.28 && rb.transform.position.y > 4 && zoneDetector.timer > 2.95f && counterBallOnGoal == 0 && thisIsLeftPlayer)
        {
            _xMov = 1;
        }

        //wenn er den sprung nicht geschafft hat und im tor steht
        if (zoneDetector.timer < 2.3f && !thisIsLeftPlayer)
        {
            _xMov = -1;
        }

        if (zoneDetector.timer < 2.3f && thisIsLeftPlayer)
        {
            _xMov = 1;
        }

        motor.Move(_xMov * speed);

        //wenn der Ball bei dem Spieler ist und 4 > y > 2 süpringt er
        if ((Mathf.Abs(rb.position.x - rbBall.transform.position.x) < 1f) &&
            (rbBall.transform.position.y < 4f) &&
            (rbBall.transform.position.y > 2) &&
            onGround)
        {
            //22.5 is Ball max speed
            if (rbBall.velocity.magnitude > 20)
            {
                if (Random.Range(0, 100) > 80)
                {
                    return;
                }
                else
                {
                    _jumpForce = Vector3.up * jumpForce;
                    jumpSound.Play();
                }
            }
            else
            {
                _jumpForce = Vector3.up * jumpForce;
                jumpSound.Play();
            }
        }

        //wenn der Ball über dem Tor ist, werden die vorherigen Befehle überschrieben
        if (counterBallOnGoal > 1.5f && onGround)
        {
            _jumpForce = Vector3.up * jumpForce;
            jumpSound.Play();
        }

        //apply jumpforce
        motor.ApplyJumpForce(_jumpForce);

        if (dashStaminaTemp > 0)
        {
            dashAllowed = true;
        }
        else
        {
            dashAllowed = false;
        }

        if (distancePlayerBall < 1.5f && rbBall.velocity.x > 0)
        {
            if (dashAllowed)
            {
                _dashForce = dashForce;
                dash       = true;
                particles.Play();
            }
            else
            {
                dash = false;
                particles.Stop();
            }
        }
        else
        {
            dash = false;
            particles.Stop();
        }
        motor.ApplyDashForce(_dashForce);
    }