79 lines
2.8 KiB
C#
79 lines
2.8 KiB
C#
|
using UnityEngine;
|
|||
|
|
|||
|
public class SplitBall : Ball
|
|||
|
{
|
|||
|
public void Initialize(Vector2 velocity, float scale)
|
|||
|
{
|
|||
|
// Получаем компоненты
|
|||
|
rb = GetComponent<Rigidbody2D>();
|
|||
|
|
|||
|
// Устанавливаем случайный цвет
|
|||
|
SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
|
|||
|
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;
|
|||
|
}
|
|||
|
}
|