Danil Iarosh d39d160d92 Implement physical prize dispensing, service stats, and QR screen timeout
- Добавлен асинхронный процесс аппаратной выдачи физических призов (хоппер и витрина) в GameplayHudController.
- Реализована блокировка выдачи по 10-секундному таймауту датчика хоппера с гарантированной отправкой команды отключения двигателя '300'.
- Реализован автоматический таймаут неактивности на экране QR-кода с последующим переходом в главное меню.
- Расширен сервис статистики PrizeSessionStateService новыми долгосрочными счетчиками (сыгранные игры, очки, монеты, сбои связи COM, физ. выдачи и ошибки).
- Обновлен построитель сводки статистики в меню настроек для отображения новых счетчиков и списка последних 5 сессий.
- Написаны EditMode тесты для проверки инкремента счетчиков и запуска выдачи призов.
2026-06-23 10:36:13 +03:00

40 lines
1.4 KiB
C#

using UnityEngine;
using DanroJump.Audio;
namespace DanroJump.Gameplay
{
/// <summary>
/// Collectible, который дает игроку усиленный вертикальный отскок и очки.
/// </summary>
public sealed class BounceBoostCollectible : CollectibleBase
{
[SerializeField] [Min(0f)] private float bounceVelocity = 24f;
[SerializeField] [Min(0)] private int scoreValue = 5;
private GameplaySession session;
private IGameAudioService audioService;
/// <summary>
/// Получает игровую сессию для начисления очков.
/// </summary>
[Zenject.Inject]
public void Construct(
GameplaySession injectedSession,
[Zenject.InjectOptional] IGameAudioService injectedAudioService = null)
{
session = injectedSession;
audioService = injectedAudioService;
}
/// <summary>
/// Применяет усиленный прыжок и награду за подбор.
/// </summary>
protected override void OnCollected(JumpPlayerController player)
{
audioService?.Play(GameAudioEvent.BoostCollected, transform.position);
player.BounceWithEnemyPassThrough(bounceVelocity);
session?.AddScore(scoreValue);
}
}
}