ArkanoidTG/Assets/Scripts/DestructibleBrick.cs

168 lines
6.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SpriteRenderer>();
}
// Создаем объект для текста, если его еще нет
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>();
canvas.renderMode = RenderMode.WorldSpace;
canvasObj.AddComponent<CanvasScaler>();
// Настраиваем размер канваса
RectTransform canvasRect = canvasObj.GetComponent<RectTransform>();
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<TextMeshProUGUI>();
// Настраиваем RectTransform для текста
RectTransform textRect = textObj.GetComponent<RectTransform>();
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];
}
}
}