Я пытаюсь понять, почему я получаю исключение из-за отсутствующей ссылки после смены сцены при использовании синглетонов.
Итак, у меня есть два объекта GameObject в первой сцене.Основная камера с прикрепленным скриптом GameManager и еще один объект магазина с прикрепленным скриптом Покупателя.Оба сценария также являются синглетонами, созданными, например, следующим образом:
public static Purchaser Instance
void Awake(){
Instance = this
}
Затем они оба ссылаются друг на друга в функции Start (), например, так:
void Start(){
game = GameManager.Instance
}
ПередСмена сцены, оба сценария используют одиночные ссылки друг друга для вызова методов друг от друга, и все, кажется, работает нормально.Как только я меняю сцены, ни один из этих объектов не появляется в следующей сцене, поэтому они оба уничтожаются.Однако, как только я возвращаюсь на главную сцену, я получаю исключение отсутствующей ссылки, когда скрипт покупателя пытается вызвать метод из GameManager с использованием одноэлементной ссылки, получаемой из Start (), которая изменяет текст текстового объекта, присоединенного к основной.камера.Эта функция вызывается после нажатия кнопки, которая прикреплена к объекту магазина, который вызывает эту функцию в скрипте покупателя:
UpdateMoney(){
game.UpdateMoney(100);
}
Я прочитал и увидел, что это может быть потому, что Start () будет толькобыть вызванным один раз на протяжении всей игры.Это означало, что одноэлементный экземпляр GameManger скрипта «Покупатель» все еще был старым до того, как сцены изменились и этот экземпляр был уничтожен.Но я просто проверил, верно ли это, поместив журнал отладки в каждую функцию сценариев Start (), и увидел, что после каждого перехода сцены обратно в основную сцену журнал отладки будет проходить из обоих сценариев Start ().Итак, было бы правильно сказать, что Start () вызывается только один раз для жизни сценария, а не для всей игры, правильно?Не должно ли это также означать, что после того, как игра вернется в основную сцену, и оба GameObjects будут созданы заново, сценарий «Покупатель» должен теперь иметь обновленную ссылку на вновь созданный сценарий GameManager, поскольку функция «Start») была вызвана снова?
Я также обнаружил, что это работает вместо использования ссылки на игру в UpdateMoney ():
UpdateMoney(){
GameManager.Instance.UpdateMoney(100);
}
Итак, почему это работает вместо использования ссылки на игру, полученной в Start ()?Означает ли это, когда Start () называется GameManager.Instance по-прежнему старый GameManager.Instance, поэтому game = GameManager.Instance не работает?Извините, это очень многословно.Любая помощь очень ценится.