Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Интегрирована система кастомных визуальных эффектов (VFX): - Добавлена новая утилита MvpVFXUtility и настройки MvpVFXSpawnSettings для спавна эффектов. - Реализован пул эффектов VFXPool с поддержкой отслеживания версий спавна, сброса оверрайдов и анимации масштаба по времени. - Добавлены эффекты прыжка и приземления в PlayerAnimationEvents. - Интегрирован эффект DeathVignetteController для плавного затемнения экрана при смерти игрока. - Добавлены частицы stompImpactVFX при уничтожении врагов прыжком сверху (EnemyController). - Реализован эффект конфетти finishVFX при успешном завершении уровня (LevelFinish). - Интегрированы эффекты искр при сборе монеток, кристаллов и других собираемых предметов (Collectible, EnvironmentalCollectibleBase). - Улучшен и визуально доработан пользовательский интерфейс (UI): - Добавлен скрипт QRCodeTierHighlight для цветовой подсветки QR-кодов в зависимости от тира приза. - Реализована пульсация блока приза в баннере победы (WinBannerController). - Обновлено обозначение валюты в BalanceDisplay с "₽" на "руб.". - Добавлены новые префабы, сцены, ассеты тайлсетов и шейдеров для настройки визуального стиля. - Обновлён протокол и инициализация подсветки COM-платы: - Изменен префикс команд подсветки с 85/86 на 8550, а диапазон эффектов обновлен с 40...52 на 10...22 (LightController, LightMode, LightCycleDurations). - Исправлена хардкод-команда сброса подсветки при инициализации в ComDeviceClient с устаревшей 8600 на новую 8550 для предотвращения рассинхронизации буфера обмена платы.
71 lines
2.0 KiB
C#
71 lines
2.0 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace RR.Common.UI.FX
|
|
{
|
|
/// <summary>
|
|
/// Автоматически добавляет базовые UI-эффекты к интерактивным элементам.
|
|
/// </summary>
|
|
[AddComponentMenu("RR/UI/FX/UI FX Runtime Installer")]
|
|
public sealed class UIFXRuntimeInstaller : MonoBehaviour
|
|
{
|
|
private const string RuntimeObjectName = "UI FX Runtime Installer";
|
|
|
|
private static UIFXRuntimeInstaller _instance;
|
|
|
|
[SerializeField, Min(0.1f)] private float scanInterval = 0.5f;
|
|
|
|
private float _nextScanTime;
|
|
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
|
private static void Bootstrap()
|
|
{
|
|
if (_instance != null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GameObject installerObject = new(RuntimeObjectName);
|
|
installerObject.AddComponent<UIFXRuntimeInstaller>();
|
|
DontDestroyOnLoad(installerObject);
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
if (_instance != null && _instance != this)
|
|
{
|
|
Destroy(gameObject);
|
|
return;
|
|
}
|
|
|
|
_instance = this;
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (Time.unscaledTime < _nextScanTime)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_nextScanTime = Time.unscaledTime + scanInterval;
|
|
InstallButtonGlow();
|
|
}
|
|
|
|
private static void InstallButtonGlow()
|
|
{
|
|
Button[] buttons = FindObjectsByType<Button>(FindObjectsInactive.Exclude, FindObjectsSortMode.None);
|
|
foreach (Button button in buttons)
|
|
{
|
|
if (button == null || button.GetComponent<UISelectableFocusGlow>() != null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
button.gameObject.AddComponent<UISelectableFocusGlow>();
|
|
}
|
|
}
|
|
}
|
|
}
|