168 lines
6.1 KiB
C#
168 lines
6.1 KiB
C#
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];
|
||
}
|
||
}
|
||
}
|