Модульная замена стандартному компоненту Singleton<T>, созданная для автоматической адаптации к мультиплеерной среде.
NetworkSingleton<T> — это базовый класс, от которого наследуются глобальные менеджеры (н-р ProgressionManager, WorldTimeManager, InventoryManager).
Его фишка — условная компиляция.
- Если в проекте установлен пакет Mirror Networking, скрипт автоматически наследует класс [NetworkBehaviour], позволяя вам использовать
[SyncVar],[Command]и[ClientRpc]. - Если пакет не установлен (или вы делаете чисто синглплеерную часть), он работает как классический [MonoBehaviour], не требующий сети. Таким образом, код вашего проекта не ломается при отсутствии библиотеки мультиплеера.
Обычный Singleton<T> живет вечно в сцене.
В мультиплеере глобальные менеджеры часто размножаются (н-р Менеджер Инвентаря может принадлежать каждому подключенному игроку). NetworkSingleton<T> содержит логику автоматического разрешения этих коллизий (различает Authority клиентскую копию и серверную), гарантируя, что статический доступ Instance сошлется именно на локальную копию текущего игрока, а не на "чужого".
Поскольку NetworkSingleton<T> это дженерик-класс, у него нет "вызываемых событий" для Inspector, он используется исключительно программистами в C#.
| Метод / Свойство | Описание |
|---|---|
Singleton |
(Свойство) Возвращает актуальный инстанс компонента на сцене. |
HasServerAuthority() |
Проверяет, является ли вызывающий код владельцем объекта на сервере. В соло-режиме (без Mirror) всегда возвращает true. |
IsServer() |
Проверяет, работает ли данный скрипт на Сервере. В соло-режиме всегда возвращает true. |
Tip
Всегда оборачивайте операции, меняющие данные (начисление денег, выдачу урона), в проверку if (!HasServerAuthority()) return;. Это защитит вашу игру от читеров, запретив клиентам локально менять важные переменные (сервер просто проигнорирует их).
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;
}
}