using UnityEngine; public class SplitBall : Ball { public void Initialize(Vector2 velocity, float scale) { // Получаем компоненты rb = GetComponent(); // Устанавливаем случайный цвет SpriteRenderer spriteRenderer = GetComponent(); if (spriteRenderer != null) { // Генерируем случайный цвет с прозрачностью Color randomColor = Random.ColorHSV(0f, 1f, 0.7f, 1f, 0.7f, 1f); randomColor.a = Random.Range(0.3f, 0.5f); // Устанавливаем случайную прозрачность spriteRenderer.color = randomColor; } // Устанавливаем физические свойства rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous; rb.angularVelocity = 0f; rb.gravityScale = 0f; rb.interpolation = RigidbodyInterpolation2D.Interpolate; rb.constraints = RigidbodyConstraints2D.FreezeRotation; rb.sharedMaterial = new PhysicsMaterial2D { bounciness = 1f, friction = 0f }; // Устанавливаем масштаб transform.localScale *= scale; // Запрещаем создавать новые мячи canSpawnBalls = false; // Сразу запускаем мяч с заданной скоростью isPlaying = true; rb.velocity = velocity; lastFrameVelocity = velocity; } protected override void Start() { // Не выполняем стандартную инициализацию Ball, // так как дочерний мяч не должен следовать за платформой } protected override void Update() { // Поддерживаем постоянную скорость без изменения направления if (rb != null && rb.velocity.magnitude != speed) { rb.velocity = rb.velocity.normalized * speed; lastFrameVelocity = rb.velocity; } } protected override void OnCollisionEnter2D(Collision2D collision) { // Вызываем базовую реализацию для обработки отскоков base.OnCollisionEnter2D(collision); } private Vector2 AddRandomness(Vector2 direction, float intensity) { float randomAngle = Random.Range(-intensity, intensity) * 90f; float rad = randomAngle * Mathf.Deg2Rad; float cos = Mathf.Cos(rad); float sin = Mathf.Sin(rad); return new Vector2( direction.x * cos - direction.y * sin, direction.x * sin + direction.y * cos ).normalized; } }