using UnityEngine; public class FruitBall : BallBase { private float speedMultiplier = 1.0f; private float speedIncreaseTimer = 0.0f; private Bounds boardBounds; private Collider2D selfCollider; private bool hasBoardBounds = false; private float magnetBounceDuration = 0.35f; private float magnetCenterLeeway = 0.12f; private MagnetBounceAxisState xMagnetBounceState; private MagnetBounceAxisState yMagnetBounceState; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { audioSource = GetComponent(); animator = GetComponent(); selfCollider = GetComponent(); speed = new Vector2(Mathf.Sign(Random.Range(-1f, 1f)) * 0.005f, Mathf.Sign(Random.Range(-1f, 1f)) * 0.005f); hasBoardBounds = TryCacheGameBoardBounds(out boardBounds); audioSource.PlayOneShot(spawnSound); } // Update is called once per frame void FixedUpdate() { AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0); if (stateInfo.IsName("FruitBallMove")) { transform.Translate(speed * speedMultiplier); if (affectedByMagnet && hasBoardBounds) { Vector3 currentPosition = transform.position; currentPosition.x = ApplyMagnetBounceAxis( currentPosition.x, boardBounds.min.x, boardBounds.max.x, magnetActiveLeftRight, ref xMagnetBounceState, selfCollider != null ? selfCollider.bounds.extents.x : 0.0f, magnetBounceDuration, magnetCenterLeeway ); currentPosition.y = ApplyMagnetBounceAxis( currentPosition.y, boardBounds.min.y, boardBounds.max.y, magnetActiveTopBottom, ref yMagnetBounceState, selfCollider != null ? selfCollider.bounds.extents.y : 0.0f, magnetBounceDuration, magnetCenterLeeway ); transform.position = currentPosition; } } if (speedIncreaseTimer > 0.0f) { speedIncreaseTimer -= Time.deltaTime; if (speedIncreaseTimer <= 0.0f) { speedMultiplier = 1.0f; // Reset the speed multiplier to 1x } } } void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.CompareTag("Wall") || collision.gameObject.CompareTag("BasicBall") || collision.gameObject.CompareTag("FruitBall")) { ContactPoint2D contact = collision.GetContact(0); speed = Vector2.Reflect(speed, contact.normal); if (collision.gameObject.CompareTag("BasicBall") || collision.gameObject.CompareTag("FruitBall")) { speedIncreaseTimer = 2.0f; // Reset the timer to 2 seconds speedMultiplier = 20.0f; // Set the speed multiplier to 7x } } } }