Форум программистов, компьютерный форум, киберфорум
Наши страницы
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
ezd
9 / 9 / 5
Регистрация: 09.01.2018
Сообщений: 95
1

Unity сцены. Unity lifecycle

30.10.2018, 08:28. Просмотров 814. Ответов 5
Метки нет (Все метки)

Всем привет.

Не понимаю по каким словам искать ответ на этот вопрос. Не совсем понимаю жизненный цикл юнити и в частности сцены.

Вот юнити загрузился сам. Дальше как он определяет что делать? Есть какое-то место где можно указать какие классы надо запустить, какая-то точка входа для программиста типа Program.Main() для инициализации статического класса и запуска своей new Game()? Или unity просто находит какую-то сцену и запускает там скрипты на всех объектах по жизненному циклу компонентов awake, onenable etc?

Как указать "основную сцену"? Допустим я это сделал, а дальше как? Должен ли я держать какую-то одну сцену и подгружать в нее другие для самой игры или при загрузке одной сцены другие удаляются?

В сущности вопрос как сделать старт приложения и управлять им? Я пока представляю себе это так, допустим:
1) Указываем одну главную сцену
2) На нее пустой объект + один компонент
3) В этом компоненте в статическое поле сохраняется game=new MyGame()
4) Загрузка какой-то другой сцены
...
Дальше просто жонглирование сценами и все всегда будут ссылаться в MyManager.game, который никуда не удалится? Как это принято делать в юнити вообще?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2018, 08:28
Ответы с готовыми решениями:

Подгрузка сцены без перехода на нее (Unity C#)
Собственно у меня есть сцена которая грузится +- 4сек а мне нужно чтобы без задержки был переход на...

Unity 2D. Движение объекта в пределах сцены ( андроид )
Добрый день! Есть сцена с размерами 1280 * 800, есть объект, который движется от края к краю сцены...

С# в Unity. меню при переходе со сцены на сцену
Я сделал меню паузы который появляется при нажатии esc и на него закреплены несколько кнопок. На...

Unity Время уровня, игры,сцены уходит в минус
Здравствуйте есть код представлен ниже. При достижении времени 0 игроку выпает окно что он...

Где можно почитать основы разработки в Unity/Unity 3D
До этого был небольшой опыт работы с Windows.Forms и WFP с C#. Где можно разобраться и научится...

5
1max1
646 / 419 / 236
Регистрация: 26.10.2018
Сообщений: 1,315
Завершенные тесты: 1
30.10.2018, 12:44 2
Дальше как он определяет что делать?
https://docs.unity3d.com/Manual/ExecutionOrder.html
Или unity просто находит какую-то сцену
Не какую-то, а ту, которая активная в данный момент.
и запускает там скрипты на всех объектах по жизненному циклу компонентов awake, onenable etc?
В общем да (первая ссылка), но есть еще и такие вот моменты:
https://docs.unity3d.com/ScriptRefer...Attribute.html
Можно выполнить код, который не висит на объекте и выполнить его до загрузки сцены, даже до вызова первого Awake. В большинстве случаев, это не нужно.
Как указать "основную сцену"?
Та сцена которая в редакторе и будет основная.
Должен ли я держать какую-то одну сцену и подгружать в нее другие для самой игры
Зависит от самой игры, можно обойтись и одной сценой.
или при загрузке одной сцены другие удаляются?
Нет, если использовать аддитивный метод загрузки:
https://docs.unity3d.com/ScriptRefer...LoadScene.html
https://docs.unity3d.com/ScriptRefer...SceneMode.html
Дальше просто жонглирование сценами и все всегда будут ссылаться в MyManager.game, который никуда не удалится? Как это принято делать в юнити вообще?
Есть такая штука:
https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html
Даже если ты загрузишь новую сцену, объект останется и с ним можно будет взаимодействовать в любой сцене.
0
ezd
9 / 9 / 5
Регистрация: 09.01.2018
Сообщений: 95
30.10.2018, 19:49  [ТС] 3
Цитата Сообщение от 1max1 Посмотреть сообщение
https://docs.unity3d.com/Manual/ExecutionOrder.html
Это уже жизненный цикл скрипта висящего на сцене, то есть середина игры условно, это понятно, а меня интересует что происходит до этого. Где я могу поместить свой код, который должен выполниться до загрузки сцены?

Цитата Сообщение от 1max1 Посмотреть сообщение
Не какую-то, а ту, которая активная в данный момент.
"В данный момент" это как? То есть та что перед нажатием запуска помечена как "активна" (с которой работал последний раз)? Именно так выбирается стартовая сцена или есть отдельная настройка? Как-то не очевидно... то есть если сцен много, то надо всегда перед тестом переключаться на стартовую сцену?

Я проверил, создав две сцены (обе помещены в build settings), в первой сцене сделал создание кнопки, вторую пометил как активную (она пустая, только камера и лампочка), но первая все равно выполнилась при нажатии кнопки play (то есть кнопочка появилась). Что не так? Или "активная" имеется ввиду добавлена в иерархию слева, а не активная та что лежит в ассетах, и ее нет в иерархии?

Цитата Сообщение от 1max1 Посмотреть сообщение
В общем да (первая ссылка), но есть еще и такие вот моменты:
https://docs.unity3d.com/ScriptRefer...Attribute.html
Можно выполнить код, который не висит на объекте и выполнить его до загрузки сцены, даже до вызова первого Awake. В большинстве случаев, это не нужно.
То есть как не висит на объекте? А как юнити его найдет и создаст объект этого класса? Где-то есть какой-то список какие объекты надо создавать? Как до этого списка добраться/как туда что-то добавить? Не создает же юнити все объекты всех скриптов, лежащих в assets О.о

Интересно, в принципе ясно.
Цитата Сообщение от 1max1 Посмотреть сообщение
Нет, если использовать аддитивный метод загрузки:
https://docs.unity3d.com/ScriptRefer...LoadScene.html
https://docs.unity3d.com/ScriptRefer...SceneMode.html
Там в описании LoadScene
Returns
void A handle to the Scene being loaded.
Это опечатка, на самом деле возвращается объект Scene или что имеется ввиду?

Все ещё не ясно как создать свой Program.Main(), который гарантированно выполнится раньше всего остального в игре.
0
1max1
646 / 419 / 236
Регистрация: 26.10.2018
Сообщений: 1,315
Завершенные тесты: 1
30.10.2018, 20:19 4
Цитата Сообщение от ezd Посмотреть сообщение
Где я могу поместить свой код, который должен выполниться до загрузки сцены?
C#
1
2
3
4
5
6
7
8
class MyClass
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Initialize()
    {
        Debug.Log("Work!");
    }
}
Этот код выполнится до загрузки сцены и выполнения всех монобехов, но только 1 раз, то есть если загрузить другую сцену, он уже не сработает. Этот скрипт не вешается на объект, он просто лежит в ассетах.
Цитата Сообщение от ezd Посмотреть сообщение
Я проверил, создав две сцены (обе помещены в build settings), в первой сцене сделал создание кнопки, вторую пометил как активную (она пустая, только камера и лампочка), но первая все равно выполнилась при нажатии кнопки play (то есть кнопочка появилась). Что не так? Или "активная" имеется ввиду добавлена в иерархию слева, а не активная та что лежит в ассетах, и ее нет в иерархии?
Не знаю как там у тебя, но у меня выполняется сцена, та, которая в иерархии.
Цитата Сообщение от ezd Посмотреть сообщение
То есть как не висит на объекте? А как юнити его найдет и создаст объект этого класса? Где-то есть какой-то список какие объекты надо создавать? Как до этого списка добраться/как туда что-то добавить? Не создает же юнити все объекты всех скриптов, лежащих в assets О.о
Что-то тут я тебя совсем не понял, почитай справку по https://docs.unity3d.com/ScriptRefer...Attribute.html, ему не нужны никакие объекты, в самом начале я показал как выполняется код до запуска сцены, без объектов на сцене.
Цитата Сообщение от ezd Посмотреть сообщение
Это опечатка, на самом деле возвращается объект Scene или что имеется ввиду?
Это не опечатка, методы перегружены, некоторые из них void другие возвращают Scene.
Цитата Сообщение от ezd Посмотреть сообщение
Все ещё не ясно как создать свой Program.Main(), который гарантированно выполнится раньше всего остального в игре.
В юнити нет точки входа, она здесь не нужна, ну о-о-очень в редких случаях может и нужна и как это сделать я уже сказал (первый ответ).
1
ezd
9 / 9 / 5
Регистрация: 09.01.2018
Сообщений: 95
30.10.2018, 20:54  [ТС] 5
RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)
Сработал из папки ассетов, отлично, спасибо.

Цитата Сообщение от 1max1 Посмотреть сообщение
Не знаю как там у тебя, но у меня выполняется сцена, та, которая в иерархии.
https://i.gyazo.com/d7919015559712823491e7385a097d4c.png

Что не так? Сцена "старт" активна, а шар появляется это не влияет не на что. Он не появляется если сделать для второй сцены unload, тогда она серенькая. Так зачем нужно эта пометка "active"?

Тогда в чем разница между добавленными в иерархию и теми что просто лежат в ассетах? Те что в иерархии всегда загружаются при старте, а те что в ассетах надо вручную?

Пытаюсь понять цикл разработки чтобы можно было тестировать и создавать готовый проект потом без существенной перестройки проекта, нужно ли добавлять сцены в иерархию или нет. Или то что добавляется в иерархию означает "запустить при нажатии кнопки плей"?

Прямо какой-то сумбур в голове когда не можешь управлять ходом выполнения программы и очередностью загрузки :/
0
1max1
646 / 419 / 236
Регистрация: 26.10.2018
Сообщений: 1,315
Завершенные тесты: 1
30.10.2018, 21:06 6
Цитата Сообщение от ezd Посмотреть сообщение
Что не так? Сцена "старт" активна, а шар появляется это не влияет не на что. Он не появляется если сделать для второй сцены unload, тогда она серенькая. Так зачем нужно эта пометка "active"?
Ну так если вторая сцена тоже подгружена аддитивно, то они обе будут выполнятся. Две активные сцены, да)
Цитата Сообщение от ezd Посмотреть сообщение
Тогда в чем разница между добавленными в иерархию и теми что просто лежат в ассетах? Те что в иерархии всегда загружаются при старте, а те что в ассетах надо вручную?
Именно.
Цитата Сообщение от ezd Посмотреть сообщение
Пытаюсь понять цикл разработки чтобы можно было тестировать и создавать готовый проект потом без существенной перестройки проекта, нужно ли добавлять сцены в иерархию или нет. Или то что добавляется в иерархию означает "запустить при нажатии кнопки плей"?
То что в иерархии, то и будет появляться при старте игры, если там две сцены, будут загружены две сцены, три - три...
1
30.10.2018, 21:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2018, 21:06

[Unity, лайфхак] Как сделать адекватный синглтон (singleton или уникальный для сцены) компонент
Что такое singleton – я надеюсь знают все. Какие цели лично я преследую при использовании...

Передача значений по ip unity -> unity
Доброго времени суток вопрос: (мб простой) как передать например string значение между двумя unity...

Id в unity
Здравствуйте, у меня такой вопрос. Делаю игру на android и решил ввести рекламу. При рекламе нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru