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];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|