SyncHub Docs
Cloud
Cloud
  • SyncHub Cloud
  • Получение токена доступа
  • Установка SyncHubCloud
  • Создание простой онлайн-игры с комнатами и синхронизацией
Powered by GitBook
On this page
  • Что мы будем делать?
  • Интерфейс сцены Menu
  • Логика создания комнаты
  • Проверка создания комнаты
  • Создание сцены Game и персонажа
  • Спавн игроков через GameManager
  • Подключение к уже существующим комнатам
  • Управление только своим персонажем
  • Синхронизация Transform
  • Что вы узнали:

Was this helpful?

Создание простой онлайн-игры с комнатами и синхронизацией

Введение SyncHubCloud — это мощное и гибкое SDK для Unity, разработанное для интеграции облачных сервисов в игровые и интерактивные проекты. Этот инструмент позволяет разработчикам легко подключаться

Этот урок охватывает весь цикл создания простой онлайн-игры на Unity с использованием SyncHubCloud: от подключения к серверу до синхронизации движения персонажей между клиентами.

Что мы будем делать?

  1. Подключаться к серверу по токену

  2. Создавать комнаты

  3. Подключаться к существующим комнатам

  4. Спавнить персонажей (включая других игроков)

  5. Управлять персонажем

  6. Определять владельца экземпляра префаба

  7. Синхронизировать позиции и повороты

  8. Готовить билд и проверять мультиплеер

Интерфейс сцены Menu

  1. Убедитесь, что сцена называется Menu.

  2. Добавьте UI-элемент InputField и назовите его InputFieldNameRoom.

  3. Добавьте две кнопки:

    • ButtonCreateRoom — создание комнаты

    • ButtonGetRooms — получение списка комнат

Итоговая сцена должна включать:

  • SyncHub_ConnectionManager

  • InputFieldNameRoom

  • ButtonCreateRoom

  • ButtonGetRooms

Логика создания комнаты

  1. Создайте C#-скрипт RoomsManager.cs.

  2. Создайте пустой объект RoomsManager и добавьте на него этот скрипт.

  3. Откройте RoomsManager.cs и добавьте следующий код:

RoomsManager.cs
using UnityEngine;
using UnityEngine.UI;
using SyncHubCloud;

public class RoomsManager : MonoBehaviour
{
    // Поле для ввода названия комнаты
    public InputField InputFieldNameRoom;
    // Кнопка создания комнаты
    public Button ButtonCreateRoom;

    void Start()
    {
        //Назначаем событие на кнопку создания комнаты
        ButtonCreateRoom.onClick.AddListener(CreateRoom);
    }

    public void CreateRoom()
    {
        // Проверяем подключены ли мы к серверу
        if(SyncHub_ConnectionManager.Instance.IsConnected)
        {
            // Проверяем ввели ли мы название комнаты
            if(string.IsNullOrEmpty(InputFieldNameRoom.text) == false)
            {
             /* Создаём комнату, первый параметр её название, второй параметр название сцены для неё и третий максимальное количество игроков */

                SyncHub_ConnectionManager.Instance.CreateRoom(InputFieldNameRoom.text, "Game", 5);
            }
        }
    }
}
  1. Назначьте в инспекторе InputFieldNameRoom и ButtonCreateRoom в скрипт RoomsManager.

Проверка создания комнаты

  1. Запустите сцену Menu.

  2. Введите название комнаты в поле InputFieldNameRoom.

  3. Нажмите на кнопку Создать комнату.

Если вы не создавали сцену Game, вы получите ошибку — это ожидаемо.

Создание сцены Game и персонажа

  1. Создайте сцену Game.

  2. Добавьте 3D Object -> Plane (это будет пол).

  3. Добавьте 3D Object -> Capsule, переименуйте в Player — имя обязательно.

  4. Добавьте на него:

    • SyncHub_ConnectionView

    • Скрипт PlayerController.cs

PlayerController.cs:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Скорость перемещения игрока
    public float SpeedMove = 5f;

    void Update()
    {
        // Движение вперёд-назад (ось Z)
        transform.position += Vector3.forward * SpeedMove * Input.GetAxis("Vertical") * Time.deltaTime;

        // Движение влево-вправо (ось X)
        transform.position += Vector3.right * SpeedMove * Input.GetAxis("Horizontal") * Time.deltaTime;
    }
}
  1. Сделайте префаб из объекта Player и удалите его со сцены. Сохраните его в Assets/SyncHubPrefabs.


Спавн игроков через GameManager

  1. Создайте скрипт GameManager.cs, добавьте на объект GameManager в сцене Game.

GameManager.cs:

using System.Collections.Generic;
using UnityEngine;
using SyncHubCloud;

public class GameManager : MonoBehaviour
{
    // Список возможных префабов персонажей
    public List<GameObject> PrefabsPlayer = new List<GameObject>();
    // Индекс текущего выбранного персонажа
    public int MyIndexPlayer;
    // Ссылка на нашего заспавненного игрока
    public GameObject MyPlayerGM;

    private void Awake()
    {
        // Читаем выбранный индекс персонажа (если есть)
        MyIndexPlayer = PlayerPrefs.GetInt("SelectedIndexPlayer");

        // Запрашиваем список игроков в комнате
        SyncHub_ConnectionManager.Instance.GetPlayersInRoom();
    }

    private void OnEnable()
    {
        // Подписываемся на события
        SyncHub_ConnectionManager.OnGetPlayers += OnGetPlayers;
        SyncHub_ConnectionManager.OnConnectedNewPlayerInRoom += OnConnectedNewPlayerInRoom;
    }

    private void OnDisable()
    {
        // Отписываемся от событий
        SyncHub_ConnectionManager.OnGetPlayers -= OnGetPlayers;
        SyncHub_ConnectionManager.OnConnectedNewPlayerInRoom -= OnConnectedNewPlayerInRoom;
    }

    private void OnGetPlayers(SyncHub_ConnectionManager.RootPlayers _players)
    {
        // Спавним нашего персонажа первым
        GameObject myPlayerPrefab = PrefabsPlayer[MyIndexPlayer];
        MyPlayerGM = SyncHub_ConnectionManager.Instance.SpawnMyPlayer(myPlayerPrefab, _players);

        // Даем случайное смещение позиции
        MyPlayerGM.transform.position += new Vector3(Random.Range(-4, 4), 0, Random.Range(-4, 4));

        // Спавним всех остальных игроков
        SyncHub_ConnectionManager.Instance.SpawnOtherPlayers(PrefabsPlayer, _players);
    }

    private void OnConnectedNewPlayerInRoom(string _connectionID, string _namePrefab)
    {
        // Спавним только что подключившегося нового игрока
        SyncHub_ConnectionManager.Instance.SpawnConnectedNewPlayer(PrefabsPlayer, _namePrefab, _connectionID);
    }
}

Добавляем префаб нашего персонажа в GameManager


Подключение к уже существующим комнатам

  1. На сцене Menu создайте ScrollView, назовите ScrollViewListRooms.

  2. Внутри Content создайте кнопку ButtonRoom.

  3. Создайте скрипт ButtonRoom.cs, привяжите к кнопке.

ButtonRoom.cs:

using UnityEngine;
using UnityEngine.UI;
using SyncHubCloud;

public class ButtonRoom : MonoBehaviour
{
    // Текстовое поле для описания комнаты
    public Text TextDescriptionRoom;

    // Установка информации о комнате на кнопку
    public void SetDataRoom(string _nameRoom, int _currentPlayers, int _maxPlayers)
    {
        TextDescriptionRoom.text = $"Название комнаты: {_nameRoom} | Игроки: {_currentPlayers}/{_maxPlayers}";

        // Подключаемся при нажатии
        this.GetComponent<Button>().onClick.AddListener(delegate { ConnectToRoom(_nameRoom); });
    }

    // Подключение к комнате
    public void ConnectToRoom(string _nameRoom)
    {
        SyncHub_ConnectionManager.Instance.ConnectRoom(_nameRoom);
    }
}
  1. Сделайте префаб из кнопки в Assets/MenuPrefabs, удалите оригинал со сцены.

  2. Расширьте RoomsManager.cs:

public Transform ContentScrollRect;
public Button ButtonGetRooms;
public GameObject ButtonRoomPrefab;

и добавьте в Start():

ButtonGetRooms.onClick.AddListener(UpdateListRooms);

и методы:

private void OnEnable() => SyncHub_ConnectionManager.OnGetRooms += OnGetRooms;
private void OnDisable() => SyncHub_ConnectionManager.OnGetRooms -= OnGetRooms;

private void OnGetRooms(SyncHub_ConnectionManager.RootRooms _rooms)
{
    foreach (var room in _rooms.Data)
    {
        GameObject btn = Instantiate(ButtonRoomPrefab, ContentScrollRect);
        btn.GetComponent<ButtonRoom>().SetDataRoom(room.NameRoom, room.CurrentCountPlayers, room.CountMaxPlayers);
    }
}

public void UpdateListRooms() => SyncHub_ConnectionManager.Instance.GetListRooms();

Итоговый RoomsManager.cs

using UnityEngine;
using UnityEngine.UI;
using SyncHubCloud;

public class RoomsManager : MonoBehaviour
{
    // Поле для ввода названия комнаты
    public InputField InputFieldNameRoom;
    // Кнопка создания комнаты
    public Button ButtonCreateRoom;

    //Объект внутри которого будем спавнить кнопки комнат
    public Transform ContentScrollRect;
    // Кнопка для запроса текущих комнат на сервере
    public Button ButtonGetRooms;
    // Кнопка - префаб которую мы создали для вывода информации о комнатах
    public GameObject ButtonRoomPrefab;

    void Start()
    {
        //Назначаем событие на кнопку создания комнаты
        ButtonCreateRoom.onClick.AddListener(CreateRoom);

        //Назначаем событие на кнопку для запроса комнат
        ButtonGetRooms.onClick.AddListener(UpdateListRooms);
    }

    // Подписываемся на событие получения списка комнат
    private void OnEnable() => SyncHub_ConnectionManager.OnGetRooms += OnGetRooms;
    // Отписываемся от событий при выходе из игры
    private void OnDisable() => SyncHub_ConnectionManager.OnGetRooms -= OnGetRooms;

    private void OnGetRooms(SyncHub_ConnectionManager.RootRooms _rooms)
    {
        foreach (var room in _rooms.Data)
        {
            // Спавним кнопки в списке
            GameObject btn = Instantiate(ButtonRoomPrefab, ContentScrollRect);
            btn.GetComponent<ButtonRoom>().SetDataRoom(room.NameRoom, room.CurrentCountPlayers, room.CountMaxPlayers);
        }
    }

    public void CreateRoom ()
    {
        // Проверяем подключены ли мы к серверу
        if(SyncHub_ConnectionManager.Instance.IsConnected)
        {
            // Проверяем ввели ли мы название комнаты
            if(string.IsNullOrEmpty(InputFieldNameRoom.text) == false)
            {
                /* Создаём комнату, первый параметр её название, второй параметр название сцены для неё и третий
                максимальное количество игроков */
                SyncHub_ConnectionManager.Instance.CreateRoom(InputFieldNameRoom.text, "Game", 5);
            }
        }
    }

    // Запрашиваем у сервера список комнат
    public void UpdateListRooms() => SyncHub_ConnectionManager.Instance.GetListRooms();
}

Вернитесь в сцену Menu и занесите переменные в инспектор


Управление только своим персонажем

Если PlayerController.cs висит на обоих префабах, управляются оба. Добавьте проверку:

using SyncHubCloud;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Ссылка на SyncHub_ConnectionView на объекте
    public SyncHub_ConnectionView syncHub_ConnectionView;
    public float SpeedMove = 5f;

    void Update()
    {
        // Управляем только своим персонажем
        if (syncHub_ConnectionView.IsMine())
        {
            transform.position += Vector3.forward * SpeedMove * Input.GetAxis("Vertical") * Time.deltaTime;
            transform.position += Vector3.right * SpeedMove * Input.GetAxis("Horizontal") * Time.deltaTime;
        }
    }
}

Синхронизация Transform

  1. Откройте префаб Player.

  2. Добавьте SyncHub_SyncTransfrom.cs (обязательно: должен быть SyncHub_ConnectionView.cs).

  3. Настройте:

    • IsSyncPosition = true

    • IsSyncRotation = true

    • IsSyncScale = false

    • TypeInterpolationPos = Lerp

    • TypeInterpolationRot = Lerp

    • TypeInterpolationScale = Instantly

Давайте их разберём чуть подробнее:

  • IsSyncPosition - Если нужна синхронизация позиций

  • IsSyncRotation - Если нужна синхронизация поворота

  • IsSyncScale - Если нужна синхронизация скейла (размера)

  • TypeInterpolationPos, TypeInterpolationRot, TypeInterpolationScale - Тут Вы выбираете тип интерполяции, имеются такие настройки:

  • Lerp - Линейная интерполяция между двумя точками с плавным “торможение” к последней полученным значениям

  • MoveTowards - Интерполяция без плавного “торможения” к последним полученным значениям Instantly - Жёсткая привязка к последним полученным данным без интерполяции (плавного перемещения, поворота и т.д.)

Соберите проект, запустите два клиента и проверьте, что позиция и поворот синхронизируются.


Что вы узнали:

  1. Подключение по токену

  2. Создание комнат

  3. Получение списка и подключение к комнате

  4. Спавн собственного и других игроков

  5. Ограничение управления своим объектом

  6. Синхронизация позиции, поворота и масштаба


В следующем уроке мы разберём RPC и Stream в SyncHubCloud — ключ к удалённым вызовам и потоковой передаче данных.

PreviousУстановка SyncHubCloud

Last updated 27 days ago

Was this helpful?

MenuManager с кодом подключения из прошлого

Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
урока