using UnityEngine; using TMPro; using UnityEngine.UI; public class DestructibleBrick : Brick { public int hitPoints = 1; // Определяем цвета для разных уровней прочности protected static readonly Color[] defaultColors = new Color[] { new Color(1.0f, 0.2f, 0.2f), // Красный (1 жизнь) new Color(0.933f, 0.933f, 0.933f), // Почти белый new Color(0.867f, 0.867f, 0.867f), new Color(0.800f, 0.800f, 0.800f), new Color(0.733f, 0.733f, 0.733f), new Color(0.667f, 0.667f, 0.667f), new Color(0.600f, 0.600f, 0.600f), new Color(0.533f, 0.533f, 0.533f), new Color(0.467f, 0.467f, 0.467f), new Color(0.400f, 0.400f, 0.400f), new Color(0.333f, 0.333f, 0.333f), new Color(0.267f, 0.267f, 0.267f), new Color(0.200f, 0.200f, 0.200f), new Color(0.133f, 0.133f, 0.133f), new Color(0.067f, 0.067f, 0.067f) // Почти черный }; protected TextMeshProUGUI hitPointsText; protected override void Start() { base.Start(); // Проверяем наличие шрифта для WebGL if (TMP_Settings.defaultFontAsset == null) { Debug.LogError("Default TMP font asset is missing! Text may not be visible in WebGL build."); return; } // Инициализируем spriteRenderer if (spriteRenderer == null) { spriteRenderer = GetComponent(); } // Создаем объект для текста, если его еще нет if (hitPointsText == null) { // Создаем канвас для текста GameObject canvasObj = new GameObject("BrickCanvas"); canvasObj.transform.SetParent(transform); canvasObj.transform.localPosition = Vector3.zero; canvasObj.transform.localRotation = Quaternion.identity; canvasObj.transform.localScale = Vector3.one; // Добавляем компоненты канваса Canvas canvas = canvasObj.AddComponent(); canvas.renderMode = RenderMode.WorldSpace; canvasObj.AddComponent(); // Настраиваем размер канваса RectTransform canvasRect = canvasObj.GetComponent(); canvasRect.sizeDelta = new Vector2(1, 1); // Размер блока // Создаем объект для текста GameObject textObj = new GameObject("HitPointsText"); textObj.transform.SetParent(canvasObj.transform); textObj.transform.localPosition = Vector3.zero; textObj.transform.localRotation = Quaternion.identity; textObj.transform.localScale = Vector3.one; hitPointsText = textObj.AddComponent(); // Настраиваем RectTransform для текста RectTransform textRect = textObj.GetComponent(); textRect.anchorMin = Vector2.zero; textRect.anchorMax = Vector2.one; textRect.sizeDelta = Vector2.zero; textRect.anchoredPosition = Vector2.zero; // Базовые настройки текста hitPointsText.fontSize = 0.4f; hitPointsText.alignment = TextAlignmentOptions.Center; hitPointsText.fontStyle = FontStyles.Bold; // Устанавливаем цвет текста и обводку hitPointsText.color = Color.white; hitPointsText.outlineWidth = 0.2f; hitPointsText.outlineColor = Color.black; // Важные настройки для видимости hitPointsText.enableWordWrapping = false; hitPointsText.overflowMode = TextOverflowModes.Overflow; // Установка шрифта hitPointsText.font = TMP_Settings.defaultFontAsset; } // Обновляем визуальное отображение блока UpdateVisuals(); } protected override void OnCollisionEffect(Collision2D collision) { base.OnCollisionEffect(collision); UpdateVisuals(); } protected override void TakeHit() { hitPoints--; if (hitPoints <= 0) { // Запускаем эффект уничтожения PlayDestroyEffect(); // Сильная вибрация при уничтожении if (HapticManager.Instance != null) { HapticManager.Instance.HeavyTap(); } // Add points to score GameManager.Instance.AddScore(points); // Notify GameManager about brick destruction GameManager.Instance.BrickDestroyed(); // Check if this was the last brick GameManager.Instance.CheckWinCondition(); // Destroy the brick Destroy(gameObject); } else { // Запускаем эффект удара PlayHitEffect(); // Средняя вибрация при ударе if (HapticManager.Instance != null) { HapticManager.Instance.MediumTap(); } UpdateVisuals(); } } protected virtual void UpdateVisuals() { // Обновляем текст с количеством жизней if (hitPointsText != null) { hitPointsText.text = hitPoints.ToString(); } // Обновляем цвет блока в зависимости от оставшихся жизней if (spriteRenderer != null) { int colorIndex = Mathf.Clamp(hitPoints - 1, 0, defaultColors.Length - 1); spriteRenderer.color = defaultColors[colorIndex]; } } }