Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Синглтоны плохи тем, что они остаются в памяти даже тогда, когда уже и не нужны, а убрать их оттуда сложнее чем разрушить объект.
namespace Client.Common {
sealed class PlayerManager : UnitySingleton<PlayerManager> {
public PlayerSettings Settings { get; private set; }
public PlayerProgress Progress { get; private set; }
public PlayerSession Session { get; private set; }
protected override void OnConstruct () {
base.OnConstruct ();
DontDestroyOnLoad (gameObject);
Session = new PlayerSession ();
LoadSettings ();
SaveSettings ();
LoadProgress ();
SaveProgress ();
}
void LoadSettings () {
// грузим Settings из PlayerPrefs или из Persistent-хранилища
}
public void SaveSettings () {
// сохраняем Settings в PlayerPrefs или в Persistent-хранилище
}
public void LoadProgress () {
// грузим локальный прогресс
}
public void SaveProgress () {
// сохраняем локальный прогресс
}
}
}
sealed class PlayerSettings {
[JsonName ("o1")]
public float SoundVolume = 1f;
[JsonName ("o2")]
public float MusicVolume = 1f;
}
// по аналогии - другие классы-холдеры данных, с Json-сериализацией.
Если к объекту можно получить доступ из любого места, то это глобальный объект.
Представьте что вам надо параллельно запустить 2 игры в том же контексте. (дешевый split-screen через уже готовый сетевой код игры).
А уж о тестировании, и параллельном тестировании, когда есть зависимости от сцены и глобалов, можете забыть.
То что из любого метода можно получить доступ к сцене и есть глобальный доступ. Как ваш код будет вести себя без сцены?
Нельзя получить, посмотрите пример по ссылке.
Как будет себя вести код расчитывающий на TLS, если его запустить в через async/await?
Раньше работало, сегодня сломалось.
рестарт игры это редкий кейс?
Ре-логин, перенос сохранений
это только такой сущности как «игра», другие предоставляют свои бенефиты от отсутствия связанности.
Но можно из любого метода этой сцены. Эдакий «контекст» в виде сцены.
Если вы про async/await, то никто не запрещает навешать на основной юнитевский поток SyncronizationContext и async/await заработает как надо!
Второй вы проигнорировали.
Вот это вообще из раздела фантастики.

заведите папку addons или extensions и все-все-все сторонние дополнения старайтесь сохранить в ней.
Обычно после обновления нахожу переменную ответственную за путь и меняю на соответствующий
вызывает неопределённое поведение иногда
IEnumerator RunInParallel()
{
yield return StartCoroutine(Coroutine1());
yield return StartCoroutine(Coroutine2());
}
public void RunInSequence()
{
StartCoroutine(Coroutine1());
StartCoroutine(Coroutine1());
}
StartCoroutine(Coroutine1());
StartCoroutine(Coroutine2());
yield return StartCoroutine(Coroutine1());
yield return StartCoroutine(Coroutine2());
IEnumerator Coroutine()
{
Debug.Log("1");
yield return;
Debug.Log("2");
}
Тут должна быть ещё проверка на то, что если объект существует, то его нельзя прицепить.
Хотя я бы вообще не советовал делать монобехи синглтонами.
Зачем, если все остальные инстансы просто сами по себе умрут при проверке, являются ли они настоящим синглтоном.
Если нужна реакция на события жизненного цикла юнити — без этого не обойтись.
В плане умрут в той реализации, которая в статье?
Может быть в некоторых случаях соглашусь, хотя у меня получалось выстраивать архитектуру так, чтобы синглтоны по сути вызывались в монобехах, но сами монобехами не являлись.
20. Создайте и поддерживайте свой собственный класс времени, чтобы сделать работу с паузами удобнее.
Советы и рекомендации по работе с Unity3D