2016-08-29 4 views
2

Я делаю 2D-игру, в которой мой персонаж может войти и выйти из разных комнат, так как каждая комната представляет собой другую сцену, мне нужно как-то сохранить своего персонажа каждая отдельная сцена, для этой цели единство предлагает DontDestroyOnLoad() Так что я использовал эту функцию всякий раз, когда я переключаю свои сцены, однако есть проблема с этим.Сохранить объект между сценами с помощью DontDestroyOnLoad Unity C#

Давайте предположим, что мои номера только 2, и они действительно просто глядя, как этот

enter image description here

Здесь, в этой схеме основной номер один, что вы начинаете игру в, она содержит уже порождал сборник персонажа. Как только мы пойдем во вторую комнату, мой персонаж будет спасен со всеми его хорошими вещами, однако, если мы вернемся к главной сцене/комнате, мы теперь увидим 2 персонажа. Зачем ? Поскольку наш начальный символ не уничтожается, когда загружаются разные сцены, и у нас также есть тот, который создается вместе с главной комнатой/сценой. Теперь это действительно противно, и я не знаю, как это исправить, у меня также есть одна и та же проблема с некоторыми сценариями, которые мне нужны в каждой отдельной сцене. Любая помощь приветствуется.

ответ

0

Обычное решение - вы не создаете объекты, которые установлены в DontDestroyOnLoad в сценах, которые можно просматривать более одного раза.

Что делает большинство людей, это создать сцену предварительной загрузки, которая является самой первой сценой, которая загружается с игрой, которая создает все объекты, которые выживают между сценами, а затем эта сцена до загрузки загружает «главную сцену игры».

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

+0

Я сделал именно второй вариант, однако им в поисках объекта, используя FindObjectsWithTag или некоторые другие функции, которые находят игру объекты, однако я знаю, что эти методы не являются действительно работают быстро, и если у меня есть много объектов, то при переключении между сценами много это не будет приятным опытом. Я поеду с первым вариантом, спасибо за мгновенный ответ! – Asimm

+0

@Asimm Вы не будете использовать 'FindObjectsWithTag' для второго варианта, но вместо этого вы сделаете игрока одиночным (это будет также' DontDestroyOnLoad'). Одиночные или, скорее, новые экземпляры сами справлялись бы с их уничтожением. –

1

Вы можете заставить героя появиться в главной сцене через скрипт - создать экземпляр. Удостоверьтесь, что вы даете персонажу префикс определенного тега (например, «Player»).

Затем создайте экземпляр символа внутри оператора if. Используя FindGameObjectWithTag(<Tag>) == null, вы можете узнать, был ли персонаж уже создан.

public GameObject player; 

if(GameObject.FindGameObjectWithTag("Player") == null){ 
    player = Instantiate(prefab,position,rotation) as GameObject; 
} 
+0

Это именно то, что вы читаете из моего комментария. – Asimm

Смежные вопросы