Комментарии 15
Почти DI :)
Лучше в Dictionary ключи не string, а тип (T). При таком подходе поиск зависимостей по проекту делать проще, чем по стрингам.
Лучше в Dictionary ключи не string, а тип (T). При таком подходе поиск зависимостей по проекту делать проще, чем по стрингам.
+3
Как бы это помягче сказать, чтобы не показаться грубым… Это велосипед, причём плохой.
По факту это Service Locator, который уже давно считается антипаттерном, к тому же очень скудно реализованный (например, что мешает в качестве ключа использовать тип?). Плюс синглтоны, что тоже весьма печально.
Курите StrangeIoc/Zenject, как гораздо более вменяемую альтернативу.
По факту это Service Locator, который уже давно считается антипаттерном, к тому же очень скудно реализованный (например, что мешает в качестве ключа использовать тип?). Плюс синглтоны, что тоже весьма печально.
Курите StrangeIoc/Zenject, как гораздо более вменяемую альтернативу.
0
Какие альтернативы синглтона в unity вы можете подсказать?
0
вам же подсказали — Zenject. Strange крайне не рекомендую. Слишком свою архитектуру навязывают. Живем с ним на двух проектах как с наследием, дико плюемся (имеется опыт проекта с Зенджектом)
0
Полностью избавиться от синглтонов в Unity действительно весьма сложно и даже не всегда оправданно. Но если инъекция зависимостей поможет распутать код, то почему бы и да.
+1
Главное Zenject не берите.
-2
Поддерживаю
Сам синглтон еще терпим — но в крайне редких случаях. Unity позволяет обойтись без него стандартными средствами. Проблем приносит на порядок больше.
SL — просто отличный пример как не стоит делать (за редким исключением).
По факту SL хорошо смотрится вкупе с DI — когда каждый сервис является подмножеством взаимозаменяемых сервисов, но сложность этого подхода все же ставит его в антипаттерны.
Сам синглтон еще терпим — но в крайне редких случаях. Unity позволяет обойтись без него стандартными средствами. Проблем приносит на порядок больше.
SL — просто отличный пример как не стоит делать (за редким исключением).
По факту SL хорошо смотрится вкупе с DI — когда каждый сервис является подмножеством взаимозаменяемых сервисов, но сложность этого подхода все же ставит его в антипаттерны.
0
Ну, DI обычно воспринимается как преемник SL, вытесняющий его полностью.
0
Я сильно ориентируюсь по этой статье www.skipy.ru/architecture/module_design.html
Применительно к Unity — совсем немного времени на нем провел, пришел из плюсов с полгодика назад.
Отсюда вопрос — хорошая литература и проекты по Unity (Net)- не подскажешь? А то я больше занимаюсь обработкой изображений, на Unity у меня небольшой проектик по AR (в ТЦ Капитолий стоит, майки примерять) и чувствую что нагреб граблей по незнанию.
Применительно к Unity — совсем немного времени на нем провел, пришел из плюсов с полгодика назад.
Отсюда вопрос — хорошая литература и проекты по Unity (Net)- не подскажешь? А то я больше занимаюсь обработкой изображений, на Unity у меня небольшой проектик по AR (в ТЦ Капитолий стоит, майки примерять) и чувствую что нагреб граблей по незнанию.
0
Хорошей литературы (вот чтоб прямо книги) по Unity я не видел. Искал где-то года два назад, может сейчас что-нибудь да поменялось. Что-то толковое может быть по отдельным кускам, типа Shader Graph, но я не слежу.
С другой стороны, если интересен их перспективный стек DOTS, есть отличное чтиво R.Fabian «Data-Oriented Design», но он не про конкретно технологию, а про сам подход. Даже официальная бесплатная онлайн-версия есть.
С другой стороны, если интересен их перспективный стек DOTS, есть отличное чтиво R.Fabian «Data-Oriented Design», но он не про конкретно технологию, а про сам подход. Даже официальная бесплатная онлайн-версия есть.
0
Проверяли логику работы данных синглтонов при переходе между сценами?
Накидаю кейс проверки — нужно вызывать методы синглтона посредством делегатов (UnityEvent). Допустим используем синглтон для музыки, пишем обертку для дизайнера, чтобы он мог ручками накидывать необходимые ему взаимосвязи через интерфейс Unity Editor — как отработает ваш код?
Я пока данный глюк так и не поборол.
Под катом мой код сингелтона:
Накидаю кейс проверки — нужно вызывать методы синглтона посредством делегатов (UnityEvent). Допустим используем синглтон для музыки, пишем обертку для дизайнера, чтобы он мог ручками накидывать необходимые ему взаимосвязи через интерфейс Unity Editor — как отработает ваш код?
Я пока данный глюк так и не поборол.
Под катом мой код сингелтона:
Singelton.cs
using UnityEngine;
/// <summary>
/// Реализация сингелтона для наследования.
/// </summary>
/// <typeparam name="T">Класс, который нужно сделать сингелтоном</typeparam>
/// <remarks>/// Если необходимо обращаться к классу во время OnDestroy или OnApplicationQuit
/// необходимо проверять наличие объекта через IsAlive. Объект может быть уже
/// уничтожен, и обращение к нему вызовет его еще раз.
///
///
/// При использовании в дочернем классе Awake, OnDestroy,
/// OnApplicationQuit необходимо вызывать базовые методы
/// base.Awake() и тд.
///
/// Добавил скрываемый метод Initialization - чтобы перегружать его и использовать
/// необходимые действия.
///
/// Создание объекта производится через unity, поэтому использовать блокировку
/// объекта нет необходимости. Однако ее можно добавить, в случае если
/// понадобится обращение к объекту из других потоков.
///
/// Из книг:
/// - Рихтер "CLR via C#"
/// - Chris Dickinson "Unity 2017 Game optimization"
///</remarks>
public class Singelton<T> : MonoBehaviour where T : Singelton<T>
{
private static T instance = null;
private bool alive = true;
public static T Instance
{
get
{
if (instance != null)
{
return instance;
}
else
{
//Find T
T[] managers = GameObject.FindObjectsOfType<T>();
if (managers != null)
{
if (managers.Length == 1)
{
instance = managers[0];
DontDestroyOnLoad(instance);
return instance;
}
else
{
if (managers.Length > 1)
{
Debug.LogError($"Have more that one {typeof(T).Name} in scene. " +
"But this is Singelton! Check project.");
for (int i = 0; i < managers.Length; ++i)
{
T manager = managers[i];
Destroy(manager.gameObject);
}
}
}
}
//create
GameObject go = new GameObject(typeof(T).Name, typeof(T));
instance = go.GetComponent<T>();
instance.Initialization();
DontDestroyOnLoad(instance.gameObject);
return instance;
}
}
//Can be initialized externally
set
{
instance = value as T;
}
}
/// <summary>
/// Check flag if need work from OnDestroy or OnApplicationExit
/// </summary>
public static bool IsAlive
{
get
{
if (instance == null)
return false;
return instance.alive;
}
}
protected void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = this as T;
Initialization();
}
else
{
Debug.LogError($"Have more that one {typeof(T).Name} in scene. " +
"But this is Singelton! Check project.");
DestroyImmediate(this);
}
}
protected void OnDestroy() { alive = false; }
protected void OnApplicationQuit() { alive = false; }
protected virtual void Initialization() { }
}
0
Думаю будет полезно посмотреть
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Unity3D: Автоматический агрегатор скриптов-менеджеров