Страница 1 из 1

синглтон

СообщениеДобавлено: 12 мар 2018, 14:30
TRBLG
программа работает не корректно. грешу на синглтон (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;
}

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 14:57
1max1
не советую делать синглтон от MonoBehaviour, лучше реализуй его обходными путями

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 14:57
IDoNotExist
Либо убери наследование от MonoBehaviour. Либо не используй конструктор в нём и создание через new.

Re: синглтон

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


это помогает, но мне нужны корутины в этом классе, а они в MonoBehavoir классе. как это можно обойти?

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 15:29
Woolf
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;
    }
}

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 15:42
1max1
Могу предложить просто сделать все переменные public static и получать доступ по имени класса, а не через instance

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 15:45
Woolf
1max1 писал(а):Могу предложить просто сделать все переменные public static и получать доступ по имени класса, а не через instance


Дикость какая.. Это не синглтон а хрень собачья.

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 16:30
1max1
Не вижу принципиальной разницы, если только не нужно обращаться к самому компоненту...

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 16:37
Woolf
1max1 писал(а):не вижу принципиальной разницы

Вот это и плохо, что не видите.

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 16:39
1max1
У меня еще не было такой ситуации, где синглтон был бы незаменим, все прекрасно решалось static методами и отлично работало.

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 16:41
IDoNotExist
Согласен с Woolf синглтоны с монобехом крайне полезны, 1max1 вы затеяли холивар.

Re: синглтон

СообщениеДобавлено: 12 мар 2018, 16:45
1max1
static vs singlton? xD, да мне всё равно, кому как удобней пусть так и делает, я не собираюсь доказывать что лучше применять)