using UnityEngine; public class BasicBall : BallBase { private Bounds boardBounds; private Collider2D selfCollider; private bool hasBoardBounds = false; // Faster pull keeps the ball on its current board half while magnet is active. private float magnetBounceDuration = 0.35f; // Prevents magnet bounces from reaching the board center line. 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(Random.Range(-0.05f, 0.05f), Random.Range(-0.05f, 0.05f)); hasBoardBounds = TryCacheGameBoardBounds(out boardBounds); audioSource.PlayOneShot(spawnSound); } // Update is called once per frame void FixedUpdate() { AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0); if (stateInfo.IsName("BasicBallMove")) { transform.Translate(speed); 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; } } } 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); } } }