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, в помощь начинающим

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это
Эта статья предназначена для тех пользователей unity3d, что уже хорошо знакомы с самим движком, но ещё не обладают достаточной собственной базой знаний для того, чтобы писать без дополнительного сёрфинга по интернету, с целью поиска возникающих иногда фундаментальных вопросов. Чтобы сократить некоторым время на ресёч, расскажу несколько важных фишек, которые необходимо знать каждому unity программисту. Если у Вас возникают вопросы: как сделать чтобы у Вас не тормозило на чём-то послабее iPad 3, или Вы не знаете как удобно работать со спрайтами, как заставить музыку не прерываться при загрузке, или как обойти максимальный допустимый размер под android (50 мегабайт) и так далее, возможно Вы найдёте ответ в этой статье.

Статья затрагивает лишь проблемы мобильной разработки (IOS, Android). Все примеры только на C#.

Автор статьи не претендует на абсолютную категоричность и правильность предложенных решений.

Основы основ

1) Обязательно почитайте рекомендации от разработчиков Unity, как писать оптимальные с точки зрения производительности скрипты.

2) Лучше всего создать класс, прямой наследник от MonoBehaviour, который реализует кеширование transform и остальных подобных свойств MonoBehavior, все основные скрипты наследовать от него:

3) Используйте для хранения глобальных параметров своей игры статический класс со статическими методами и полями (если конечно данные не должны быть сохранены при закрытии игры, тогда пользуйте PlayerPrefs) но такой объект должен быть всего один, не увлекайтесь. Храните в нем только такие глобальные вещи, как текущее состояние игры (игра на паузе; мы в меню; cписок доступных пёрхейзов с их ценами, полученный с сервера и т.п.)

4) Всегда используйте (даже если ваша игра вся в 2D) две камеры одну для игровых объектов, другую для GUI, указывайте у GUI-элементов необходимый слой (слой GUI камеры и будет Вам счастье) Конечно это не касается случаев меню, где и одной камеры предостаточно.

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это

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):

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это

В 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

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это

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.

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это

2. Add script

Add a new script to MusicController with the same name and open it with you editor.

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это

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.

Dontdestroyonload unity что это. Смотреть фото Dontdestroyonload unity что это. Смотреть картинку Dontdestroyonload unity что это. Картинка про Dontdestroyonload unity что это. Фото Dontdestroyonload unity что это 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.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *