Game SDK

↓ Скачать SDK 1.8.1

Внутренняя разработка VORIVOX. Пакет candidate: оставшиеся проверки обозначены в разделе совместимости.

Один и два игрока

Для двух игроков используйте одну из двух понятных моделей: поочерёдная стрельба или разделение полотна на левую и правую половины. Базовый target.hit не обязан содержать идентификатор оружия.

Заявите поддержку

"players": {
  "supported_counts": [1, 2],
  "default_count": 1,
  "session_modes": ["single", "versus"],
  "same_screen": true
}

Фактическое число игроков приходит в Manifest.Session.PlayerCount и в session.start. Игра не меняет его самостоятельно после старта.

Вариант 1. По очереди

Игра явно показывает, чей ход. Каждое попадание, серия или раунд переключает активного участника по правилам конкретной игры.

private int activePlayer = 0; // 0 = P1, 1 = P2

private void OnHit(VorivoxHit hit)
{
    if (!roundRunning || paused) return;
    scores[activePlayer] += ScoreHit(hit);
    activePlayer = activePlayer == 0 ? 1 : 0;
    hud.ShowTurn(activePlayer + 1);
}

Вариант 2. Полотно делится пополам

Физическая пластина одна, но игровая сцена разделена вертикально. Слева размещается цель игрока 1, справа — цель игрока 2. В нормализованных координатах граница — NX = 0.5.

private static int PlayerForHit(VorivoxHit hit)
    => hit.NormalizedX < 0.5f ? 0 : 1;

private void OnHit(VorivoxHit hit)
{
    if (!roundRunning || paused) return;
    int player = PlayerForHit(hit);
    scores[player] += ScoreHalfTarget(player, hit);
}
Важно: разделение по координате определяет сторону полотна, а не оружие. Игроки должны стрелять только в свою половину. Если нужно разрешить одновременную стрельбу в одну область и определять стрелка, потребуется отдельный канал идентификации.

Как рисовать две половины

Делите активную игровую область, а не просто ширину окна. После letterbox/масштабирования левая игровая половина должна соответствовать 0 ≤ NX < 0.5, правая — 0.5 ≤ NX ≤ 1. Графику и правила желательно зеркалить, чтобы условия были одинаковыми.

Счёт и итог

Во время игры храните отдельные счёты и статистику игроков. Базовый session.complete остаётся агрегированным результатом; не сериализуйте массив игроков в числовое поле score. Индивидуальное сохранение добавляйте только через отдельно утверждённый контракт платформы.

Что тестировать

Очередность: пауза во время смены игрока, последний выстрел, duplicate shot_id. Разделение: попадания точно у центра, оба края, зеркальные цели и понятная индикация стороны.