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); }
// 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); }
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); }