Unity Singleton

137
20 января 2021, 10:40

Есть MainCamera на которой висят скрипты. Соответственно, мне нужно чтобы объект не удалялся при загрузке нового уровня (сцены). Оставляю объект строкой: DontDestroyOnLoad(transform.gameObject). Нужно при входе в главное меню удалить прежнюю MainCamera. Как мне это реализовать?

Вчера в ответ на мой вопрос получил вот такой код от пользователя trollingchar :

public sealed class UnitySingleton : MonoBehaviour {
    public static UnitySingleton Instance { get; private set; }
    private void Awake () {
        if (Instance) {
            Destroy (gameObject);
        }
        else {
            DontDestroyOnLoad (gameObject);
            Instance = this;
        }
    }
}

Проблема заключается в том что скрипт на Canvas(text) работает , а на объектах с box collider2d нет.
P.S. С синглтонами я работаю впервые , да и проблему ,наверное, недостаточно хорошо описал.

Answer 1

Добавьте статический метод для удаления и обнуления ссылки на Instance:

public sealed class UnitySingleton : MonoBehaviour {
    public static UnitySingleton Instance { get; private set; }
    private void Awake() {
        if (Instance) {
            Destroy(gameObject);
        }
        else {
            DontDestroyOnLoad(gameObject);
            Instance = this;
        }
    }
    public static void DeleteSingletonInstance() {
        if(Instance) {
            Destroy(Instance.gameObject);
            Instance = null;
        }
    }
}

Применение:

UnitySingleton.DeleteSingletonInstance();

Вообще, Singleton - это объект, который существует, пока программа не завершит свое выполнение. Если вам вдруг понадобилось какие-то скрипты хранить в виде одиночки - лучше сделать отдельный от камеры объект-одиночку с необходимыми скриптами и не привязывать к этому делу камеру.

Answer 2

Есть также решение, когда мы имеем сцену, назовем ее InitScene, где храним объекты, не предназначенные для повторного создания. Вызываем у их родителя DontDestroyOnLoad, инициализируем там что нам нужно и загружаем сцену с главным меню MainScene. После этого InitScene больше не загружаем.

READ ALSO
Как сделать удаление строк из файла?

Как сделать удаление строк из файла?

ключ-имя игрока, значение-запись (в секундах) есть код, который нужно улучшить

124
Проблема с обновлением данных datagrid

Проблема с обновлением данных datagrid

Всем приветПрограмма для проведения соревнований

84
Постфиксный декремент

Постфиксный декремент

большая просьба помочь разобраться со следующим примером:

116