Dontdestroyonload unity что это
DontDestroyOnLoad в Unity
В моей игре на Unity есть главная сцена, с которой я перемещаюсь на другие сцены, а затем возвращаюсь назад.
Когда я возвращаюсь назад, я хочу, чтобы игрок стоял там-же где он был в момент перехода на другую сцену, а он каждый раз стоит в одном и том же месте, т.к. при загрузке новой сцены все объекты из нее удаляются.
Чтобы объект игрока не удалялся и чтобы при загрузке новой сцены он был в единственном экземпляре, применил к нему такой скрипт:
DontDestroyOnLoad(this) делает, чтобы объект не удалялся при загрузке новой сцены, а код ниже удаляет лишние экземпляры объекта, чтобы он был один. Проблема в том, что код, как я понял, удаляет тот экземпляр, который мне нужен и не удаляет тот, который не нужен (который каждый раз в одном и том эе месте появляется).
Не знаю, как это разрешить..
P.S. На форуме Unity ответа не дождался
Так положите свой класс в PlayerSingleton, а его на объект игрока
Если закомментарировать три строки с классами, то при загрузке главной сцены, перемещении на другую сцену и повторной загрузке главной, в сцене будет 2 объекта игрока. При чем управляемый тот из них, который нужно удалить. Странно, что если его отключить в инспекторе, то второй объект игрока не реагирует на нажатия клавиш, как первый.
А точно, потому что в цене уже был назначен этот объект. Мы же его не удаляли. Надо подумать.
Я бы смотрел в сторону singleton
public class PlayerSingleton : MonoBehaviour
<
public static PlayerSingleton plr;
public void Awake()
<
if (!plr) <
DontDestroyOnLoad(gameObject);
plr = this;
> else <
Destroy(gameObject);
>
>
>
Желательно делать dontdestroy для самого игрового объекта:
DontDestroyOnLoad(gameObject)
также родитель у этого объекта должен быть null:
gameObject.transform.parent = null;
иначе он тупа удалится при удалении родителя что собственно и происходит.
если же хочется оставить компонент нужно сохранять его ссылку в статическую переменную что не рулит при повторном использовании класса:
пример E-Cone
Спасибо, использовал скрипт E-Cone, кажется что-то получается, но есть две неполадки:
ДонтДестрой нужен для того чтобы обьект сопровождал тебя в каждой сцене. Если твой игрок помечен как донтДестрой, тогда естественно в сцене ‘в доме’ не должно быть еще одного дубликата, тк игрок перейдет из предидущей сцены.
Тк твой игрок помечен как донтДестрой, тебе достаточно сразу после загрузки сцены ‘в доме’ найти его и тупо поставить в нужные координаты.
RadianTOR
> ДонтДестрой нужен для того чтобы обьект сопровождал тебя в каждой сцене
Такое ощущение, что для всех это вообще элементарно, а только один я туплю=)
dmitrykozyr
> DontDestroyOnLoad(this);
> Проблема в том, что код, как я понял, удаляет тот экземпляр, который мне нужен и не удаляет тот, который не нужен
Выдает ошибку. Мне кажется, объект playerObject во 2м методе инициализируетя при запуске игры (сцены с улицей), а при входе в дом значение, которое ей присвоено теряется. Как этого можно избежать? Такое ощущение, что пока объект отключен, Find его не находит..
не помню точно, но по-моему GameObject.Find(«PlayerAnimated»); не работает на отключенных объектах.
Урааа, получилось. Сделал просто отключение отдельных компонентов объекта, а не всего объекта, так Find работает.
Всем спасибо за помощь, это была очень критичная задача, я бы ее сам еще долго решал!
Object.DontDestroyOnLoad
Success!
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Submission failed
For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Parameters
Description
Makes the object target not be destroyed automatically when loading a new scene.
When loading a new level all objects in the scene are destroyed, then the objects in the new level are loaded. In order to preserve an object during level loading call DontDestroyOnLoad on it. If the object is a component or game object then its entire transform hierarchy will not be destroyed either.
Note: DontDestroyOnLoad does not return a value. It is also intended to have it’s argument changed. The typeof operator makes this change if it is needed.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
You’ve told us this page needs code samples. If you’d like to help us further, you could provide a code sample, or tell us about what kind of code sample you’d like to see:
You’ve told us there are code samples on this page which don’t work. If you know how to fix it, or have something better we could use instead, please let us know:
You’ve told us there is information missing from this page. Please tell us more about what’s missing:
You’ve told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You’ve told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You’ve told us there is a spelling or grammar error on this page. Please tell us what’s wrong:
You’ve told us this page has a problem. Please tell us more about what’s wrong:
Thanks for helping to make the Unity documentation better!
Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.
Copyright © 2018 Unity Technologies. Publication: 2017.3-002A. Built: 2018-04-04.
Object.DontDestroyOnLoad
Success!
Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.
Submission failed
For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.
Parameters
Description
Makes the object target not be destroyed automatically when loading a new scene.
When loading a new level, all objects in the scene are destroyed, then the objects in the new level are loaded. In order to preserve an object during level loading call DontDestroyOnLoad on it. If the object is a component or game object then its entire transform hierarchy will not be destroyed either.
Note: DontDestroyOnLoad does not return a value. It is also intended to have its argument changed. The typeof operator makes this change if it is needed.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
You’ve told us this page needs code samples. If you’d like to help us further, you could provide a code sample, or tell us about what kind of code sample you’d like to see:
You’ve told us there are code samples on this page which don’t work. If you know how to fix it, or have something better we could use instead, please let us know:
You’ve told us there is information missing from this page. Please tell us more about what’s missing:
You’ve told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You’ve told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You’ve told us there is a spelling or grammar error on this page. Please tell us what’s wrong:
You’ve told us this page has a problem. Please tell us more about what’s wrong:
Thanks for helping to make the Unity documentation better!
Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.
Copyright © 2018 Unity Technologies. Publication: 2018.1-002N. Built: 2018-12-04.
Unity3d, в помощь начинающим
Эта статья предназначена для тех пользователей unity3d, что уже хорошо знакомы с самим движком, но ещё не обладают достаточной собственной базой знаний для того, чтобы писать без дополнительного сёрфинга по интернету, с целью поиска возникающих иногда фундаментальных вопросов. Чтобы сократить некоторым время на ресёч, расскажу несколько важных фишек, которые необходимо знать каждому unity программисту. Если у Вас возникают вопросы: как сделать чтобы у Вас не тормозило на чём-то послабее iPad 3, или Вы не знаете как удобно работать со спрайтами, как заставить музыку не прерываться при загрузке, или как обойти максимальный допустимый размер под android (50 мегабайт) и так далее, возможно Вы найдёте ответ в этой статье.
Статья затрагивает лишь проблемы мобильной разработки (IOS, Android). Все примеры только на C#.
Автор статьи не претендует на абсолютную категоричность и правильность предложенных решений.
Основы основ
1) Обязательно почитайте рекомендации от разработчиков Unity, как писать оптимальные с точки зрения производительности скрипты.
2) Лучше всего создать класс, прямой наследник от MonoBehaviour, который реализует кеширование transform и остальных подобных свойств MonoBehavior, все основные скрипты наследовать от него:
3) Используйте для хранения глобальных параметров своей игры статический класс со статическими методами и полями (если конечно данные не должны быть сохранены при закрытии игры, тогда пользуйте PlayerPrefs) но такой объект должен быть всего один, не увлекайтесь. Храните в нем только такие глобальные вещи, как текущее состояние игры (игра на паузе; мы в меню; cписок доступных пёрхейзов с их ценами, полученный с сервера и т.п.)
4) Всегда используйте (даже если ваша игра вся в 2D) две камеры одну для игровых объектов, другую для GUI, указывайте у GUI-элементов необходимый слой (слой GUI камеры и будет Вам счастье) Конечно это не касается случаев меню, где и одной камеры предостаточно.
5) Если Вы хотите, чтобы ваш GUI под iPad выглядел не размытым а так же на всех устройствах одинаковым, Вы не хотите его ресайзить в зависимости от размеров экрана, сделайте для GUI камеры size — 1,59. Спокойно верстайте всё под размер iPad2, на других устройствах всё будет отмасштабировано само.
6) Если необходимо перетащить несколько объектов в список другого объекта, и не хочется перетаскивать их по одному, можно зафиксировать объект, отображаемый в инспекторе, нажав на замочек в правом верхнем углу (на предыдущей картинке его тоже можно заметить).
Работа с 2d спрайтами (плагин tk2d)
В завершении хочу приложить код скрипта, который растягивает tk2d спрайт на весь экран без искажения, быть может, на первый взгляд и сложноват для решаемой задачи, но проверено работает всегда.
Графический текст
Какая же игра без красивого шрифта? Для создания красивого графического текста лучше всего использовать Glyph Designer, работает только под Mac, платная, но зато удобная. Имеется как минимум два бесплатных аналога, работающие под Windows, но по-настоящему красивый текст в них Вы не получите.
Программы по созданию графических шрифтов создадут xml и текстурную карту, используйте их в tk2d или в бесплатном EZ GUI.
Pool объектов
Одна из проблем, с которой можно столкнуться при написании игры – это большая дороговизна операции создания объекта, т. е. дороговизна операции Instantiate. Для решения этой проблемы для начала можно воспользоваться CoRoutine’ом, но если на мобильном устройстве тормозит даже создание одного объекта, тогда необходимо использовать порождающий паттерн проектирования Объектный пулл.
Таким образом можно избавиться от лагов при создании объектов, и все их можно инстанциировать при загрузке уровня. Нужный объект очень удобно искать и получать по полю name.
Это единственный способ борьбы с лагами при написании игры с динамически генерируемым уровнем, например, при написании раннера.
Quality Levels
Мобильные устройства – очень разные по разрешению, но всегда хочется добиться, чтобы игра работала с хорошей производительностью на всех устройствах. Готовить несколько различных билдов для различных устройств (4 apk для android и 2 билда для iOS) абсолютно необязательно.
Сначала правильно настройте Quality уровни в игре (Edit->Project settings->Quality):
В unity3d есть замечательная возможность переключать Quality прямо на этапе запуска приложения.
DontDestroyOnLoad объекты и бесконечная музыка
Если необходимо, чтобы главная тема приложения проигрывалась беспрерывно, даже при перезагрузке из одной сцену в другую необходимо использовать DontDestroyOnLoad (gameObject);
Т. е. объект с нашей музыкой не удаляется никогда. Важно учесть, чтобы таких наших неудаляемых объектов не получилось в результате несколько. Для этого целесообразно использовать паттерн программирования Singleton.
Таким же образом организуются и другие неудаляемые объекты.
Пример такого скрипта: Music.cs
TouchDispatcher
События touch – есть разделяемый ресурс. Для удобного использования необходимо написать некий контроллер, который будет раздавать получаемые события между обрабатывающими их объектами.
На мой личный взгляд очень удобно это организованно в cocos2d/x, за основу и была взята предложенная этим игровым движком концепция:
1) есть интерфейс, содержащий обработку 4 стандартных функций touch событий: TouchBegan, TouchMoved, TouchCancelled, TouchEnd. Если объект отлавливает touch события, он реализует этот интерфейс.
2) Есть класс TouchDispatcher – класс, управляющий и делегирующий события.
AccelerometerDispatcher
Всё что, написано выше для TouchDispather’а справедливо и для аккселерометра, с одним лишь исключением: аккселерометр у устройсва всегда только один, а значит, и код реализующего контроллера немного проще.
Есть только одна особенность, про которую нельзя забывать, при работе с акселерометром: если устройство перевёрнуто вверх ногами: PortraitUpsideDown или LandscapeRight, нельзя забывать, что меняются значения по оси x или y, соответственно. Мы получим обратно-ориентированное управление, не учтя это.
Проверка попадания точки в concave полигон
Одна из самых распространённых задач компьютерной графики. Если коротко: точка находится внутри невыпуклого полигона, если луч, направленный в любую сторону пересекает края полигона нечётное количество раз.
Сам алгоритм можно легко найти в интернете.
Я рассматриваю эту задачу сейчас в контексте попадания touch в объект GUI (Конечно, можно всё делать проверкой попадания луча в collider, но, на мой взгляд, для 2D объектов лучше использовать предложенный ниже способ).
Для простых кнопок можно использовать обычные прямоугольники и touchZone.Contains(position);. Но если объекты – сложной формы, и перекрывают друг друга – этого будет недостаточно.
Координаты обводки – полигона нашей условной кнопки можно взять из VertexHelper, к сожалению, не знаю ничего лучше и ничего для windows.
В результате мы получим координаты относительно центра нашего 2D объекта, что нам и нужно.
Полученную строку легко загнать в наш обрабатывающий скрипт, и распарсить на массив точек:
Таким образом, осталось только реализовать алгоритм поиска пересечения прямых.
Также прилагается макет класса, реализующий интерфейс делегата touch событий, и проверяющий попадания пальца в обводку.
Догрузка уровней из интернета WWW
Если у Вас возникла необходимость догрузить часть уровней из интернета после установки игры, то WWW.LoadFromCacheOrDownload – Ваш лучший друг. Но он работает только в Unity Pro.
Загружать можно только специально подготовленные сцены, создавать такие можно при помощи
BuildPipeline.BuildStreamedSceneAssetBundle. Честно говоря под Unity 3.5.2 довольно глючно работало под IOS, но я думаю с тех времён это дело поправили.
В документации Unity подробно и исчерпывающе описан весь процесс организации загрузки уровней из сети.
Заключение
Надеюсь кому-то предложенная статья будет полезной, и поможет сэкономить немного времени.
Почти всё из описанного выше, было использовано здесь:
Developer blog
DontDestroyOnLoad tutorial
Please share this post with your friends
This is a simple DontDestroyOnLoad tutorial for unity3D. It is used to keep game objects alive during for example scene reloads. In this tutorial we will look at how to keep game music playing while reloading a scene.
This technique is used in Friendsheep. You can download or clone this tutorial from this repository on Github. This tutorial exists in the Assets/Examples/DontDestroyOnLoad/ folder.
1. New scene
Start of by adding a scene and create an empty game object in the scene. Then add an audio source and drag your music to the audioclip. I used a free stock song from JewelBeat in this example. Download it here.
The new game object is called MusicController.
2. Add script
Add a new script to MusicController with the same name and open it with you editor.
3. MusicController.cs
The class we just created will look like this:
First we create a static instance variable of the type MusicController and call it Instance. It’s in this variable we will store the reference to our object and make it available to use from other objects.
In the Awake() method we call another method that is called InstantiateController(). And that is where the magic happens.
InstantiateController()
4. Reloading Scene
ButtonController.cs will look like this. It uses SceneManager.LoadScene() to reload the current scene:
Then add ReloadScene() as an onClick event to the button.
OnClick – DontDestroyOnLoad tutorial
That’s it. Now you can reload your scene how many times you wan’t without the music restarting. You can combine this tutorial with toggling music on and off.