Danil Iarosh 839a68aef1 Improve VFX, UI overlays, session statistics, COM reliability, audio mixer, and expand architecture guides
Подробный список изменений:
- Перенесены эффекты частиц из C#-кода в готовые префабы-ассеты (Vfx Prefabs) в папке Assets/Resources/Vfx/ с автоматической генерацией материалов в Editor.
- Исправлены ошибки duration на играющих системах частиц и розовые текстуры в GameVfxService.cs.
- Исправлена навигация и фокус кнопок на оверлеях ContinueGameOverlay и PrizeResultOverlay с автоматическим подсвечиванием кнопок лимонно-зеленым цветом при фокусе и проигрыванием звука.
- Добавлена проверка настроек в GameplayHudController.cs для скрытия ContinueGameOverlay, если продолжение игры отключено.
- Расширен сбор статистики: создана структура GameplaySessionRecord, добавлена история до 50 раундов в PrizeSessionStateService и JsonPrizeSessionStateRepository, выведен расчет средних показателей и список 5 последних раундов в сервисной статистике.
- Повышена надежность COM-транспорта: добавлен sleep (80мс) в Dispose для graceful shutdown потоков, реализован цикл переподключения до 10 попыток при обрыве связи.
- Интегрированы настройки громкости с микшером: изменен шаг изменения громкости на 5% (0.05) для удобства, добавлен статус-чек и логи в ApplyServiceVolumes, расширены юнит-тесты на GetFloat параметры.
- Созданы новые архитектурные гайды по аппаратному COM-транспорту и призовой экономике автомата в папке GUIDES/architecture/.
- Оптимизирован и обновлен RAG-индекс проекта.
2026-07-03 15:04:08 +03:00

127 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Полное руководство по UI Toolkit
UI Toolkit (`UnityEngine.UIElements`) — это современная замена uGUI в Unity, основанная на веб-технологиях (HTML/CSS-подобные UXML и USS). В Danro Jump она используется для всего пользовательского интерфейса (Главное меню, HUD, Модальные окна).
## 1. Поиск элементов и обработка событий
Поиск элементов (Querying) работает аналогично `document.querySelector` в JavaScript.
```csharp
using UnityEngine.UIElements;
public class MyMenuController : MonoBehaviour
{
private UIDocument document;
private void OnEnable()
{
document = GetComponent<UIDocument>();
var root = document.rootVisualElement;
// Поиск кнопки по имени
Button startBtn = root.Q<Button>("StartButton");
// Поиск элемента по классу
VisualElement container = root.Q<VisualElement>(className: "main-container");
// Подписка на клик
startBtn.clicked += OnStartClicked;
// Подписка на другие события (например, наведение мыши)
startBtn.RegisterCallback<MouseEnterEvent>(evt => Debug.Log("Hover!"));
}
private void OnStartClicked()
{
Debug.Log("Game Started!");
}
}
```
> [!WARNING]
> Обязательно отписывайтесь от событий (`-=`) или используйте `UnregisterCallback` в методе `OnDisable()`, чтобы избежать утечек памяти (Memory Leaks). Утечки событий в UI Toolkit — одна из самых частых причин падения производительности!
## 2. Анимации через USS (Transitions)
Вместо использования сложных `Animator` или C# корутин для анимации кнопок и меню, в UI Toolkit используются **Transitions** (Плавные переходы) прямо в стилях.
**USS Файл (`styles.uss`):**
```css
.my-button {
background-color: rgb(100, 100, 100);
width: 200px;
/* Указываем, что любые изменения цвета и размера должны длиться 0.3 секунды */
transition-duration: 0.3s;
transition-property: background-color, scale;
}
.my-button:hover {
background-color: rgb(200, 50, 50);
scale: 1.1 1.1; /* Увеличиваем кнопку на 10% */
}
```
Никакого C# кода! Кнопка плавно увеличится и поменяет цвет при наведении, а когда мышь уберут — плавно вернется в исходное состояние.
## 3. Манипуляция стилями из C# (Classes vs Inline Styles)
### Подход 1: Переключение классов (Предпочтительный)
Лучший способ изменить внешний вид — добавить или удалить USS-класс. Это позволяет дизайнеру менять цвета в USS, не трогая код программиста.
```csharp
// В USS: .hidden { display: none; opacity: 0; }
myElement.AddToClassList("hidden"); // Спрятать элемент
myElement.RemoveFromClassList("hidden"); // Показать элемент
myElement.ToggleInClassList("hidden"); // Переключить (если есть - удалить, если нет - добавить)
```
### Подход 2: Inline Styles (Для динамических данных)
Используется, когда значение нельзя предсказать заранее (например, прогресс-бар от 0 до 100%).
```csharp
// Динамически задаем ширину
progressBar.style.width = new Length(50, LengthUnit.Percent);
// Задаем цвет из переменной Unity (Color)
healthBar.style.backgroundColor = new StyleColor(Color.green);
```
## 4. Кастомные Контролы (Custom Controls)
Часто один и тот же кусок интерфейса (например, карточка инвентаря) повторяется. Вместо того чтобы дублировать код, создайте свой собственный `VisualElement`.
```csharp
// 1. Создаем класс-наследник
public class InventorySlot : VisualElement
{
// 2. Фабрика для того, чтобы этот элемент появился в UI Builder
public new class UxmlFactory : UxmlFactory<InventorySlot, UxmlTraits> { }
private Label titleLabel;
private VisualElement iconElement;
// 3. Инициализация (создание верстки из кода или загрузка UXML)
public InventorySlot()
{
// Создаем элементы кодом
titleLabel = new Label("Empty Slot");
iconElement = new VisualElement();
// Добавляем классы для стилизации
this.AddToClassList("inventory-slot");
iconElement.AddToClassList("inventory-icon");
// Строим дерево
hierarchy.Add(iconElement);
hierarchy.Add(titleLabel);
}
// 4. API для программиста
public void SetItem(string name, Sprite icon)
{
titleLabel.text = name;
iconElement.style.backgroundImage = new StyleBackground(icon);
}
}
```
После компиляции элемент `InventorySlot` появится в Library в окне UI Builder, и вы сможете перетаскивать его мышкой как обычную кнопку!