Skip to content

Latest commit

 

History

History
63 lines (47 loc) · 4.17 KB

File metadata and controls

63 lines (47 loc) · 4.17 KB

Network Singleton

Модульная замена стандартному компоненту Singleton<T>, созданная для автоматической адаптации к мультиплеерной среде.

Назначение

NetworkSingleton<T> — это базовый класс, от которого наследуются глобальные менеджеры (н-р ProgressionManager, WorldTimeManager, InventoryManager).

Его фишка — условная компиляция.

  • Если в проекте установлен пакет Mirror Networking, скрипт автоматически наследует класс [NetworkBehaviour], позволяя вам использовать [SyncVar], [Command] и [ClientRpc].
  • Если пакет не установлен (или вы делаете чисто синглплеерную часть), он работает как классический [MonoBehaviour], не требующий сети. Таким образом, код вашего проекта не ломается при отсутствии библиотеки мультиплеера.

Важное отличие от Singleton<T>

Обычный Singleton<T> живет вечно в сцене. В мультиплеере глобальные менеджеры часто размножаются (н-р Менеджер Инвентаря может принадлежать каждому подключенному игроку). NetworkSingleton<T> содержит логику автоматического разрешения этих коллизий (различает Authority клиентскую копию и серверную), гарантируя, что статический доступ Instance сошлется именно на локальную копию текущего игрока, а не на "чужого".

API

Поскольку NetworkSingleton<T> это дженерик-класс, у него нет "вызываемых событий" для Inspector, он используется исключительно программистами в C#.

Метод / Свойство Описание
Singleton (Свойство) Возвращает актуальный инстанс компонента на сцене.
HasServerAuthority() Проверяет, является ли вызывающий код владельцем объекта на сервере. В соло-режиме (без Mirror) всегда возвращает true.
IsServer() Проверяет, работает ли данный скрипт на Сервере. В соло-режиме всегда возвращает true.

Tip

Всегда оборачивайте операции, меняющие данные (начисление денег, выдачу урона), в проверку if (!HasServerAuthority()) return;. Это защитит вашу игру от читеров, запретив клиентам локально менять важные переменные (сервер просто проигнорирует их).

Примеры

Реализация собственного счетчика (Code)

using Neo.Network;
using Mirror;

// Создаем наш глобальный менеджер.
public class MyScoreManager : NetworkSingleton<MyScoreManager>
{
#if MIRROR
    // Переменная будет автоматически обновляться у всех клиентов,
    // но менять её имеет право ТОЛЬКО сервер!
    [SyncVar] 
#endif
    public int GlobalScore;

    public void AddScore(int amount)
    {
        // Проверяем: Можем ли мы редактировать счет?
        if (!HasServerAuthority()) 
        {
            Debug.LogWarning("Только сервер может добавлять очки!");
            return;
        }

        GlobalScore += amount;
    }
}

См. также