синглтон

Программирование на Юнити.

синглтон

Сообщение TRBLG 12 мар 2018, 14:30

программа работает не корректно. грешу на синглтон (c#) . GameManager вызывается 22 раза если верить консоли. Я вызываю его только в GetInstance();

public class GameManager : MonoBehaviour {

private List<GameObject> _animals = new List<GameObject>();
private List<GameObject> _plants = new List<GameObject>();

private Vector2 _bottomLeft;
// private Vector2 _bottomRight;
// private Vector2 _topLeft;
private Vector2 _topRight;

private List<Animal> _subscribers = new List<Animal>();

private static GameManager _instance;

private Camera _camera;

private GameManager() {
Debug.Log("GameManager");
}

private void Start() {
GetCameraSides();
StartCoroutine(CheckPosition());
}

public static GameManager GetInstance() {
Debug.Log("Get GameManager");
if (_instance == null) {
_instance = new GameManager();
}
return _instance;
}
TRBLG
UNец
 
Сообщения: 2
Зарегистрирован: 28 мар 2017, 12:24

Re: синглтон

Сообщение 1max1 12 мар 2018, 14:57

не советую делать синглтон от MonoBehaviour, лучше реализуй его обходными путями
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: синглтон

Сообщение IDoNotExist 12 мар 2018, 14:57

Либо убери наследование от MonoBehaviour. Либо не используй конструктор в нём и создание через new.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: синглтон

Сообщение TRBLG 12 мар 2018, 15:17

1max1 писал(а):не советую делать синглтон от MonoBehaviour, лучше реализуй его обходными путями


это помогает, но мне нужны корутины в этом классе, а они в MonoBehavoir классе. как это можно обойти?
TRBLG
UNец
 
Сообщения: 2
Зарегистрирован: 28 мар 2017, 12:24

Re: синглтон

Сообщение Woolf 12 мар 2018, 15:29

1max1 писал(а):не советую делать синглтон от MonoBehaviour, лучше реализуй его обходными путями


Почему, нормально, только нужно соблюдать несколько правил:

✔ в Awake добавить DontDestroyOnLoad
✔ создавать его не из скрипта, а на главной сцене добавлять компонент в инспекторе
✔ предусмотреть, что при повторной загрузке главной сцены он продублируется, так что надо прибить лишний.
✔ Ну и, конечно, не вызывать этот синглтон в Awake в скриптах, или же настроить ExecutionOrder

А так, весьма удобно иметь синглтон от монобеха, в котором можно выставить в инспекторе какие-то значения. да и карутины те-же тоже нужны. Я, например, в таких храню текстуры и наборы цветов.

Вот, например, мой синглтон на монобехе

Синтаксис:
Используется csharp
public class GuiProcessor : MonoBehaviour {

    public static GuiProcessor getI { get; private set; }

    void Awake() {
        Object[] gos = FindObjectsOfType(GetType());
        if (gos != null && gos.Length > 1) {
          //Если уже есть такой, самоубьёмся
            Destroy(gameObject);
            return;
        }
        //Не убивать при смене уровней
        DontDestroyOnLoad(gameObject);
        getI = this;
    }
}
Последний раз редактировалось Woolf 12 мар 2018, 15:46, всего редактировалось 2 раз(а).
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: синглтон

Сообщение 1max1 12 мар 2018, 15:42

Могу предложить просто сделать все переменные public static и получать доступ по имени класса, а не через instance
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: синглтон

Сообщение Woolf 12 мар 2018, 15:45

1max1 писал(а):Могу предложить просто сделать все переменные public static и получать доступ по имени класса, а не через instance


Дикость какая.. Это не синглтон а хрень собачья.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: синглтон

Сообщение 1max1 12 мар 2018, 16:30

Не вижу принципиальной разницы, если только не нужно обращаться к самому компоненту...
Последний раз редактировалось 1max1 12 мар 2018, 16:38, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: синглтон

Сообщение Woolf 12 мар 2018, 16:37

1max1 писал(а):не вижу принципиальной разницы

Вот это и плохо, что не видите.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: синглтон

Сообщение 1max1 12 мар 2018, 16:39

У меня еще не было такой ситуации, где синглтон был бы незаменим, все прекрасно решалось static методами и отлично работало.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: синглтон

Сообщение IDoNotExist 12 мар 2018, 16:41

Согласен с Woolf синглтоны с монобехом крайне полезны, 1max1 вы затеяли холивар.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: синглтон

Сообщение 1max1 12 мар 2018, 16:45

static vs singlton? xD, да мне всё равно, кому как удобней пусть так и делает, я не собираюсь доказывать что лучше применять)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6