- Добавлен LevelFinish.cs: новый компонент финиша уровня - выдача маленького приза через PrizeSystemManager (учитывает enableHopper) - настройки: enablePrizeOnFinish, prizeEnabledSettingKey, prizeDelay, debugMode - защита от двойной выдачи (_prizeGiven) - PlayerController: закомментирован старый переход на следующий уровень по тегу 'Finish' (теперь за это отвечает LevelFinish) - QRCodeUIController: помечен [Obsolete], QR-коды показываются только при победе через WinBannerController.ShowWin() -> PrizeSystemManager.GetQRCodes() - Finish.prefab: добавлен компонент LevelFinish (enablePrizeOnFinish=true, prizeDelay=0) - Сцена 1-1: переопределён enablePrizeOnFinish=false для финиша промежуточного уровня - Сцена 1-3: minor update - MainMenu: правки якорей UI-элементов и активация скрытого объекта
125 lines
4.7 KiB
C#
125 lines
4.7 KiB
C#
using UnityEngine;
|
||
using RR.Common.Controls;
|
||
using RR.Common.Settings;
|
||
using RR.Game2D.Core.Managers;
|
||
|
||
namespace RR.Game2D.Behaviour
|
||
{
|
||
/// <summary>
|
||
/// Компонент финиша уровня с возможностью выдачи маленького приза.
|
||
/// Устанавливается на объект с триггером и тегом "Finish".
|
||
/// </summary>
|
||
[RequireComponent(typeof(Collider2D))]
|
||
public class LevelFinish : MonoBehaviour
|
||
{
|
||
[Header("Настройки приза")]
|
||
[Tooltip("Включить выдачу приза при завершении уровня")]
|
||
[SerializeField] private bool enablePrizeOnFinish = true;
|
||
|
||
[Tooltip("Ключ настройки для проверки включения выдачи призов (если пусто - не проверяется)")]
|
||
[SerializeField] private string prizeEnabledSettingKey = "prize.smallPrizeEnabled";
|
||
|
||
[Tooltip("Задержка перед выдачей приза (в секундах)")]
|
||
[SerializeField] private float prizeDelay = 0.5f;
|
||
|
||
[Header("Отладка")]
|
||
[SerializeField] private bool debugMode;
|
||
|
||
private bool _prizeGiven;
|
||
|
||
private void OnTriggerEnter2D(Collider2D collision)
|
||
{
|
||
// Проверяем, что это игрок
|
||
if (!collision.CompareTag("Player")) return;
|
||
|
||
// Пытаемся выдать приз
|
||
TryGivePrize();
|
||
|
||
// Переход на следующий уровень
|
||
GameManager.Instance.NextLevel();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Пытается выдать приз игроку, если выполнены все условия.
|
||
/// </summary>
|
||
private void TryGivePrize()
|
||
{
|
||
// Проверка, что приз еще не был выдан
|
||
if (_prizeGiven)
|
||
{
|
||
if (debugMode)
|
||
Debug.Log("[LevelFinish] Приз уже был выдан на этом финише.");
|
||
return;
|
||
}
|
||
|
||
// Проверка, включена ли выдача призов в этом компоненте
|
||
if (!enablePrizeOnFinish)
|
||
{
|
||
if (debugMode)
|
||
Debug.Log("[LevelFinish] Выдача призов отключена в компоненте.");
|
||
return;
|
||
}
|
||
|
||
// Проверка настроек (если указан ключ)
|
||
if (!string.IsNullOrEmpty(prizeEnabledSettingKey))
|
||
{
|
||
bool settingEnabled = SettingsManager.Instance.GetBool(prizeEnabledSettingKey);
|
||
if (!settingEnabled)
|
||
{
|
||
if (debugMode)
|
||
Debug.Log($"[LevelFinish] Выдача призов отключена в настройках ({prizeEnabledSettingKey}).");
|
||
return;
|
||
}
|
||
}
|
||
|
||
// Все проверки пройдены - выдаем приз
|
||
_prizeGiven = true;
|
||
|
||
if (prizeDelay > 0)
|
||
{
|
||
Invoke(nameof(GivePrize), prizeDelay);
|
||
}
|
||
else
|
||
{
|
||
GivePrize();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Выдает приз через PrizeSystemManager (учитывает флаг enableHopper).
|
||
/// </summary>
|
||
private void GivePrize()
|
||
{
|
||
if (debugMode)
|
||
Debug.Log("[LevelFinish] Выдаю приз игроку!");
|
||
|
||
if (RR.Common.Managers.PrizeSystemManager.Instance != null)
|
||
RR.Common.Managers.PrizeSystemManager.Instance.GivePrize();
|
||
else
|
||
PrizeSystem.GivePrize(); // fallback
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сбрасывает состояние выдачи приза (для повторного использования).
|
||
/// </summary>
|
||
public void ResetPrize()
|
||
{
|
||
_prizeGiven = false;
|
||
}
|
||
|
||
#if UNITY_EDITOR
|
||
private void OnDrawGizmos()
|
||
{
|
||
// Визуализация зоны финиша в редакторе
|
||
Collider2D col = GetComponent<Collider2D>();
|
||
if (col != null)
|
||
{
|
||
Gizmos.color = enablePrizeOnFinish ? Color.green : Color.yellow;
|
||
Gizmos.DrawWireCube(col.bounds.center, col.bounds.size);
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|