using System.Collections; using UnityEngine; using TMPro; public class Coin : MonoBehaviour { public CoinFlipUI flipUI; public TextMeshProUGUI coinText; [Header("Flying Coins")] public CoinFlipUI smallCoinPrefab; // Префаб маленькой монетки (CoinFlipUI) public int spawnCount = 10; // Количество монеток public float spawnRadius = 30f; // Радиус разброса public float fallDistance = 100f; // Расстояние падения public float duration = 0.8f; // Длительность анимации private bool isAnimationPlaying = false; // Флаг для предотвращения одновременных анимаций public void FreezeCoin() { if (flipUI != null) flipUI.FreezeCoin(); } public void UnfreezeCoin() { if (flipUI != null) flipUI.UnfreezeCoin(); } // Изменение текста public void ChangeCoinText(string text) { if (coinText != null) coinText.text = text; } // -------------------- Анимация появления -------------------- public void PlayAddCoinsAnimation() { if (smallCoinPrefab == null || flipUI == null) return; // Если анимация уже играет, то пропускаем вызов if (isAnimationPlaying) return; StartCoroutine(SpawnCoinsRoutine()); } private IEnumerator SpawnCoinsRoutine() { isAnimationPlaying = true; RectTransform parentRt = flipUI.GetComponent(); for (int i = 0; i < spawnCount; i++) { CoinFlipUI coin = Instantiate(smallCoinPrefab, parentRt.parent); // Создаем в том же контейнере, что и flipUI RectTransform rt = coin.GetComponent(); // Начальная позиция = позиция главной монеты rt.position = parentRt.position; // Уменьшаем размером в 3 раза rt.localScale = smallCoinPrefab.transform.localScale * 0.33f; // Добавляем случайное смещение вокруг главной монеты Vector2 randomOffset = Random.insideUnitCircle * spawnRadius; rt.anchoredPosition += randomOffset; // Настраиваем случайное вращение монетки coin.autoSpin = true; coin.spinSpeed = Random.Range(300f, 800f); // Случайная скорость от 300 до 800 градусов в секунду // Запускаем анимацию со случайным направлением Vector2 randomDirection = Random.insideUnitCircle.normalized; // Случайное направление float randomDistance = Random.Range(fallDistance * 0.5f, fallDistance * 1.5f); // Случайная дистанция StartCoroutine(FlyAndShrinkRoutine(rt, randomDirection, randomDistance)); } // Ждем окончания анимации перед сбрасыванием флага yield return new WaitForSeconds(duration); isAnimationPlaying = false; } private IEnumerator FlyAndShrinkRoutine(RectTransform rt, Vector2 direction, float distance) { if (rt == null) yield break; Vector2 startPos = rt.anchoredPosition; Vector2 endPos = startPos + direction * distance; // Летим в случайном направлении Vector3 startScale = rt.localScale; Vector3 endScale = Vector3.zero; float elapsed = 0f; while (elapsed < duration) { // Проверяем, что объект не был удален if (rt == null) yield break; elapsed += Time.deltaTime; float t = elapsed / duration; rt.anchoredPosition = Vector2.Lerp(startPos, endPos, t); rt.localScale = Vector3.Lerp(startScale, endScale, t); // Плавно уменьшаем прозрачность var img = rt.GetComponent(); if (img != null) { var c = img.color; c.a = Mathf.Lerp(1f, 0f, t); img.color = c; } yield return null; } // Удаляем объект по завершении if (rt != null && rt.gameObject != null) { Destroy(rt.gameObject); } } }