Внутренняя разработка VORIVOX. Пакет candidate: оставшиеся проверки обозначены в разделе совместимости.
Пример: спортивная мишень
Серия из 10 выстрелов, кольца 1–10, один видимый маркер последнего попадания и общий результат из 100.
Структура сцены
Сцена PrecisionTargetОдин UI-Canvas для интерфейса и отдельный управляющий объект для логики раунда
CanvasИгровой интерфейсНа одном Canvas располагаются мишень, HUD и итоговая панель.
TargetPlayfieldОбласть мишениСодержит графику мишени и точку последнего попадания.
ScorePanelПанель счётаТекущая сумма очков и число попаданий.
ShotCounterСчётчик выстреловПоказывает прогресс: от 1 до 10 выстрелов.
ResultPanelИтог раундаПоявляется после десятого выстрела.
GameControllerУправляющий объектСодержит
VorivoxGameSdk, игровую логику и обработчик попаданий.- получает событие
HitReceived; - определяет кольцо по радиусу попадания;
- заменяет предыдущий маркер на новый;
- обновляет HUD и завершает раунд после 10 выстрелов.
| Объект | Назначение |
|---|---|
Rings | Фоновая графика колец 1–10. |
LastHitMarker | Единственный видимый маркер. Каждый новый выстрел должен перемещать его, а не создавать новый экземпляр поверх старого. |
ScorePanel | Показывает суммарный результат серии из 10 выстрелов. |
ResultPanel | Показывает финальный счёт после завершения серии. |
Игрок должен видеть только
LastHitMarker. При следующем выстреле предыдущий маркер удаляется или переиспользуется, чтобы не мешать целиться в центр.Логика попадания
private void OnHit(VorivoxHit hit)
{
if (!roundActive || shotCount >= 10)
return;
Vector2 point = hit.ToCanvasLocal(playfield);
float radius = point.magnitude / targetRadius;
int ring = CalculateRing(radius);
shotCount++;
totalScore += ring;
MoveLastMarker(point, ring);
RefreshHud();
if (shotCount == 10)
FinishRound();
}
Расчёт кольца
private static int CalculateRing(float normalizedRadius)
{
if (normalizedRadius > 1f) return 0;
return Mathf.Clamp(10 - Mathf.FloorToInt(normalizedRadius * 10f), 1, 10);
}
Для реальной спортивной мишени лучше хранить радиусы колец в конфигурации или ScriptableObject, а не предполагать одинаковую ширину всех зон.
Учебные примеры — скрипты, требующие сцены и назначенных ссылок Unity. Для production обязательны guard паузы/countdown, обработка потери соединения, защита по shot_id и отписка обработчиков. Старые Samples могут требовать адаптации: полнота игровой механики не заявляется.
Playground — браузерная демонстрация общего контракта. Это не Unity Player и не проверка C#-пакета.