Как копировать сцену в юнити

Scenes

Scenes contain the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces.

Как копировать сцену в юнити. NewEmptyScene 01. Как копировать сцену в юнити фото. Как копировать сцену в юнити-NewEmptyScene 01. картинка Как копировать сцену в юнити. картинка NewEmptyScene 01A new empty Scene, with the default 3D objects: a Main Camera and a directional Light

When you create a new Unity project, your scene view displays a new Scene. This Scene is untitled and unsaved. The Scene is empty except for a Camera (called Main Camera) and a Light (called Directional Light).

To save the Scene you’re currently working on, choose File > Save Scene from the menu, or press Ctrl + S (Windows) or Cmd + S (masOS).

Unity saves Scenes as Assets in your project’s Assets folder. This means they appear in the Project window, with the rest of your Assets.

Как копировать сцену в юнити. SceneAssetsInProjectView 01. Как копировать сцену в юнити фото. Как копировать сцену в юнити-SceneAssetsInProjectView 01. картинка Как копировать сцену в юнити. картинка SceneAssetsInProjectView 01Saved Scene Assets visible in the Project window

To open a Scene in Unity, double-click the Scene Asset in the Project window. You must open a Scene in Unity to work on it.

If your current Scene contains unsaved changes, Unity asks you whether you want to save or discard the changes.

Multi-Scene editing

It is possible to have multiple Scenes open for editing at one time. For more information about this, see documentation on Multi-Scene editing.

Источник

[C#, Unity2D] Как переместить объект из одной сцены в другую?

Здравствуйте, всем! Я создаю мобильное приложение по созданию коллажей из одежды.

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

Я совсем новичок (и девушка) и не понимаю как реализовать такое. Что и как нужно сделать?

Пожалуйста есть ли есть хоть какие-то идеи, напишите!

ну по хорошему такое не должно переноситься между сценами
и нужна ли тебе отдельная сцена если ты собираешься туда сюда постоянно ползать между ними

мало информации чтобы посоветовать что-то дельное
например что вообще из себя представляет одежда, это 3д модели или что?
если используешь какие-то ресурсы (модели, спрайты там или еще чего)
то логичней было бы два разных объекта делать, один для представления в каталоге, другой для реализации редактирования(вообще не понимаю о чем речь)

если ты будешь как-то сохранять все это дело, то у тебя должны быть какие-то модели, через которые и происходит взаимодействие между разными функциональностями

mitroxa
Можешь посмотреть такое приложение Smart Closet. Есть каталог одежды, где пользователь выбирает понравившиеся вещи и создает из них образ. Например, нажимает на майку и сразу переходит в редактор, где можно поменять размер спрайта и поменять его положение. Далее можно сохранить полный образ.
Вот такой каталог у меня:
Как копировать сцену в юнити. tops. Как копировать сцену в юнити фото. Как копировать сцену в юнити-tops. картинка Как копировать сцену в юнити. картинка tops

И редактор:
Как копировать сцену в юнити. create. Как копировать сцену в юнити фото. Как копировать сцену в юнити-create. картинка Как копировать сцену в юнити. картинка create

Kanelia
ок, а зачем тут юнити? обычные приложухи делаются на других фреймворках
Flutter например, вообще много их и для шарпа тоже можно найти

даже если по игровым движкам пройтись, можно найти кучу других, которые лучше подходят для этой цели

и займись для начала моделью: коллаж состоит из шмоток, у них позиции и т.д.
один спрайт явно нет никакого смысла передавать между уровнями

тебе нужно передавать просто имя спрайта, если больше у шмоток нет никаких характеристик, дальше создавать какое-то представление в редакторе для них, которое будет частью коллажа, коллаж основная модель, шмотка его дочерняя модель, в ней позиция масштаб и всякое такое, потом это все сохранять можно

Kanelia
> У меня есть сцена (каталог одежды), из которого нужно перенести объект в другую
> сцену (редактор одежды) и в дальнейшем его там изменять.
Требуется изменять сам мешь и сохранять изменения на диск? В любом случае через префаб или использовать один меш на двух разных объектах в разных сценах. Сам объект это ориентация и свойства компонентов, остальное это ссылки на контент (материал, меш).

Источник

Переход между сценами в Unity по кнопке

В этом уроке мы затронем библиотеку Scene Management, чтобы сделать переход между сценами по кнопке. Это одна из самых простых вещей, но она необходима для создания игры.

Давайте начнем. Для начала создадим в ассетах 2 новые сцены и назовем их «Scene1» и «Scene2».

Как копировать сцену в юнити. changing scene. Как копировать сцену в юнити фото. Как копировать сцену в юнити-changing scene. картинка Как копировать сцену в юнити. картинка changing scene

Чтобы создать новую сцену, щелкните правой кнопкой мыши по панели ассетов и выберите Create > Scene.

В этих сценах нам нужно создать элементы, с помощью которых мы будем переходить между сценами. Сделать это можно различными способами, но для облегчения понимания будем использовать самый простой способ. Мы будем создавать объект SceneChanger, который будет обрабатывать весь код изменения сцены.

Обычно, когда сцена сменяется от одной к другой, все экземпляры игровых объектов, сценариев и т. д., принадлежащие этой сцене, уничтожаются, а загружаются экземпляры из новой. Другой метод заключается в использовании функции DontDestroyOnLoad (), которая будет поддерживать ссылку на объект при смене сцены, но об этом следует поговорить в другом уроке.

Создание объекта и префаба SceneChanger

Итак, вернемся в Unity, на вкладке иерархии в «Scene1» создадим пустой объект и назовем его «SceneChanger».

Как копировать сцену в юнити. game object. Как копировать сцену в юнити фото. Как копировать сцену в юнити-game object. картинка Как копировать сцену в юнити. картинка game object

Теперь добавим скрипт к объекту «SceneChanger» и назовем его «SceneChanger».

Откроем скрипт в Visual Studio и напишем следующий код:

Как копировать сцену в юнити. scene change. Как копировать сцену в юнити фото. Как копировать сцену в юнити-scene change. картинка Как копировать сцену в юнити. картинка scene change

Создание пользовательского интерфейса

В пользовательском интерфейсе у нас будет текстовый объект с указанием названия сцены и кнопка, которая будет изменять сцену.

Ваш конечный результат должен выглядеть примерно так

Как копировать сцену в юнити. game object 1. Как копировать сцену в юнити фото. Как копировать сцену в юнити-game object 1. картинка Как копировать сцену в юнити. картинка game object 1

Изменим текст на «THIS IS SCENE 1» и текст в кнопке на «CHANGE SCENE». Результат выглядит следующим образом:

Как копировать сцену в юнити. change scene2. Как копировать сцену в юнити фото. Как копировать сцену в юнити-change scene2. картинка Как копировать сцену в юнити. картинка change scene2

Далее необходимо выбрать объект Button в Иерархии. На вкладке инспектора нажмем значок «плюс» в компоненте «Button».

Как копировать сцену в юнити. image inspector. Как копировать сцену в юнити фото. Как копировать сцену в юнити-image inspector. картинка Как копировать сцену в юнити. картинка image inspector

Перетащим объект SceneChanger из иерархии в ссылку на объект (выделено красным цветом)

Как копировать сцену в юнити. image function. Как копировать сцену в юнити фото. Как копировать сцену в юнити-image function. картинка Как копировать сцену в юнити. картинка image function

Теперь нужно выбрать функцию (выделено красным). В раскрывающемся списке выберите SceneChanger> ChangeScene (string).

Cделайте то же самое для «Scene2», но введите «Scene1» в качестве входа и измените текст в Scene2 соответствующим образом.

Нажмите на кнопку воспроизведения. Нажатие на кнопку в сцене приведет к переходу к другой сцене.

Источник

Передача данных между сценами в Unity — применение мультисценности в разработке простых игр

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

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

Ситуация

Моя игра представляет собой две сцены — главное меню, которое видно сразу при загрузке и, непосредственно, игровая сцена с механикой, в которую в зависимости от выбранной опции подгружается префаб объекта. Объединить их в одну сцену мне не представлялось возможным, так как на меню завязано несколько довольно сложных объектов, да и удобнее всё же разделять сущности.

Ранее для хранения данных я бы просто использовала некий объект-контроллер, но с выгрузкой сцены он перестаёт существовать.

Передача данных (static class)

Оказалось, что Unity превосходно умеет работать с кодом, даже если он мирно лежит файликом в папке скриптов и не прикреплён компонентом к объекту на сцене (это было не очевидно для новичка). Например, таким файлом может быть статический класс такого вида:

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

С помощью такого механизма можно также передавать в другие сцены настройки из меню, например — язык локализации, настройки звуков и музыки и многое другое.

Мультисценность (SceneManagement)

Меня всё устраивало и так, пока не поступила задача подключить к проекту Admob (рекламу), таким образом, чтобы ролик показывался прямо в начале игровой сцены. Как выяснилось, тут есть тонкости: запрос ролика занимает существенное время, и он просто не успевает прийти при переключении сцен. Лепить дополнительные задержки в проекте не хотелось, тем более, что у нас есть куча времени, пока игрок «залипает» в меню. Тут я и узнала, что переключать сцены «жёстко» нет никакой необходимости, ведь есть замечательная опция аддитивной загрузки (без выгрузки предыдущей сцены).

Подгружаю игровую сцену контроллером меню (сцена с меню и объектом рекламы остаётся загруженной тоже):

По завершению уровня, выгружаю сцену игры игровым контроллером (чтобы не висела в памяти):

С использованием такой схемы, реклама загружается сразу при старте приложения, и вызвать показ рекламного ролика можно в любой нужный момент. Аналогично можно поступать с любыми необходимыми вам объектами.

Проблемы

К сожалению, даже при аддитивной загрузке сцен, не удастся вволю покопаться в объектах одной сцены из другой. Ссылки на объекты придётся передавать через некий «медиатор» (в моём случае использовался тот самый статический класс).

Будьте внимательны при инстанцировании префабов, если активны несколько сцен — у меня они все решили затолкаться в неправильную сцену (об этом в другой раз).

Источник

Сохранение данных между сценами в Unity

Этот учебник предполагает базовые знания Unity Engine. Если у вас нет собственного проекта, вы можете свободно взять пример проекта, связанный здесь. Вы также найдете загрузку завершенного проекта в конце этой статьи.

Если вы боретесь с сохранением данных между двумя сценами, это руководство для вас.

Как копировать сцену в юнити. 2631eaf5a44c4dd003ccb2c5de1eb8ba. Как копировать сцену в юнити фото. Как копировать сцену в юнити-2631eaf5a44c4dd003ccb2c5de1eb8ba. картинка Как копировать сцену в юнити. картинка 2631eaf5a44c4dd003ccb2c5de1eb8ba

Отправная точка

Загрузите пример проекта:

Логика

Unity — игровой движок со своей философией. Несмотря на то, что существует довольно много альтернатив, он довольно уникален в том, как он обрабатывает строительные блоки любой игры — игровые объекты, сцены, код, граф сцены. И под уникальным я подразумеваю, как легко это понять.

Если вы пытались запустить Unity для тестирования, поскольку его можно бесплатно загрузить, вы, вероятно, познакомились с реализацией его сценариев. «Скрипты», написанные на C #, JavaScript (или, начиная с Unity 5, UnityScript) или на языке Boo, являются компонентами, которые прикрепляются к любому игровому объекту. Внутри скрипта вы можете получить доступ к объекту, к которому он прикреплен, или к любым связанным объектам. Он довольно интуитивно понятен, прост в использовании и с ним интересно строить.

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

Вот основная проблема, которую мы будем решать сегодня. Каждый уровень в движке Unity называется «Сцена». Вы можете редактировать сцену, используя графический редактор, как вам нравится. Вы можете перемещать сцену, используя одну строку кода (которая запускается, возможно, при прикосновении игрока к двери или при помощи объекта и т. Д.). Каждая сцена имеет объекты, которые имеют «компоненты».

Как копировать сцену в юнити. 63f639b88e1eab37997104ff94ec0dc6. Как копировать сцену в юнити фото. Как копировать сцену в юнити-63f639b88e1eab37997104ff94ec0dc6. картинка Как копировать сцену в юнити. картинка 63f639b88e1eab37997104ff94ec0dc6

Общие «Объекты» представляют то, что еще составляет ваш уровень (сетки, триггеры, частицы и т. Д.)

Каждая сцена построена в своем начальном состоянии. Переход сцены в другую означает, что новая сцена будет загружена в своем первоначальном состоянии (естественно). Но как насчет статистики игрока, например, количества боеприпасов, опыта или инвентаря?

Как мы сохраняем данные, когда мы можем писать код только в «Scripts» — компонентах игровых объектов — которые просто разрушаются при переходах между сценами?

Вот основной рабочий процесс игры с использованием такого объекта:

Как копировать сцену в юнити. 90ed82ed984301d9ecfbeaedb656b0ad. Как копировать сцену в юнити фото. Как копировать сцену в юнити-90ed82ed984301d9ecfbeaedb656b0ad. картинка Как копировать сцену в юнити. картинка 90ed82ed984301d9ecfbeaedb656b0ad

Нам нужно сохранить данные, перенести сцену, а затем загрузить данные обратно.

Вот основная разбивка логики, которую мы будем использовать:

Логика инициализации глобального объекта:

Этот поток гарантирует, что сцена 1 всегда инициализирует игрока начальными данными. Затем, если вы сохраняете данные в глобальном объекте перед любым переходом сцены, вы гарантируете, что эти данные всегда будут загружаться в объект Player следующего уровня.

Это предполагает, что вы поместили один и тот же объект Player (предпочтительно объект Prefabbed) в каждую сцену. Обратите внимание, что «логика инициализации объекта Player» применима к любому объекту, который нуждается в иллюзии «сохранения через сцены»; мы используем Player только в качестве наиболее очевидного примера.

Хорошо, достаточно графиков и абстрактного мышления на данный момент. Давайте перейдем к кодированию.

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

Давайте сначала создадим глобальный объект для всей игры. Важно, чтобы мы поняли это правильно, поэтому давайте выясним, что нам нужно для этого:

Сначала перейдите к своей первой сцене и создайте новый пустой игровой объект. Переименуйте его в нечто более подходящее, например, «GameMaster» или «GlobalObject».

Затем создайте новый сценарий C # (желательно в новой папке — не забывайте, чтобы все было организовано). Дайте ему подходящее имя. Мой сценарий называется «GlobalControl».

Прикрепите новый пустой скрипт C # к новому игровому объекту и откройте скрипт в выбранном вами редакторе. MonoDevelop, который поставляется с Unity, хорош, но вы также можете использовать Visual Studio.

Поместите этот код в скрипт GlobalControl:

Основная предпосылка шаблона проектирования Singleton состоит в том, что существует один публичный статический экземпляр одного класса. В методе пробуждения (тот, который вызывается, когда предполагается, что объект загружен), мы проверяем это, говоря: «Если есть другой экземпляр, уничтожьте его и убедитесь, что этот экземпляр является этим».

Обратите внимание на очень специфический вызов функции в методе Awake Это часть нашего решения проблемы стойкости между сценами. Это то, что сохранит игру. Объект, к которому прикреплен этот скрипт, перенесет его в другую сцену. Оставшаяся часть концепции Singleton гарантирует, что если есть еще одна копия объекта с этим же сценарием (и вам нужно будет поместить этот объект в каждую сцену), то другой объект будет уничтожен, и этот (оригинальный) ) будет сохранен.

Если вы хотите, вы можете проверить это сейчас. Поместите GameMaster или GlobalObject (или что-либо еще с этим сценарием) в каждую имеющуюся у вас сцену и попробуйте перемещать сцены во время выполнения. Вы заметите, что в данный момент в сцене есть только один такой глобальный объект.

Если мы сейчас запишем в него данные, они будут сохранены!

Теперь перейдем к другой части проблемы:
Что нам нужно сохранить?

Предположим, что для этого урока у вашего игрока есть три статистики:

Теперь мы готовы сохранить данные. Нам нужно сохранять данные только при переходе сцены и загружать их, когда мы начинаем сцену.

Вот как сохранить данные из скрипта, в котором вы храните переменные вашего игрока:

Целесообразно создать специальную функцию для сохранения данных игрока в экземпляр.
Теперь пропущен еще один шаг: загрузка из GlobalControl. Вы можете легко вызвать это в функции Start скрипта State вашего игрока:

С этим кодом наш поток данных будет выглядеть примерно так:

Как копировать сцену в юнити. 8e0aecb2023aecbdc5a46a83df761c87. Как копировать сцену в юнити фото. Как копировать сцену в юнити-8e0aecb2023aecbdc5a46a83df761c87. картинка Как копировать сцену в юнити. картинка 8e0aecb2023aecbdc5a46a83df761c87

Это касается любого перехода сцены, повсеместно. Даже переход от Сцены 2 к Сцене 1 теперь будет сохранять статистику вашего игрока!

Есть, конечно, несколько изломов, чтобы работать. Например, если вы выходите в главное меню и запускаете новую игру (не выходя из игры вообще), вам необходимо сбросить сохраненные данные, в противном случае вы начнете новую игру со статистикой игрока из предыдущего сеанса!

Почему не публичный статический класс?

Вопреки тому, что вы можете интуитивно подумать, публичные статические классы на самом деле не сохраняются в игре. Поскольку любой класс (то есть любой скрипт) присоединен к игровому объекту, он будет уничтожен при загрузке новой сцены. Даже если в другой сцене есть новый открытый статический класс, данные внутри будут сброшены, то есть статический класс будет инициализирован заново при загрузке сцены.

Вот почему мы должны использовать метод DontDestroyOnLoad и немного больше кода, чтобы убедиться, что у нас есть только один экземпляр класса, который мы намерены переносить по уровням.

Полировка и подготовка к следующему уроку

Вы, наверное, заметили, что в этом примере нетрудно вручную ввести три необходимых значения в GlobalData и обратно. Но что, если у нас будет большая, более сложная игра с десятками, если не сотнями переменных игрока, за которыми нужно следить?

Ниже мы доработаем наш код, чтобы он был не просто красивее, но чтобы предложить дополнительную функциональность, которую мы объясним в следующем уроке, а также о механике сохранения и загрузки.

Во-первых, давайте создадим новый скрипт в нашем проекте. Это будет немного другой тип сценария, потому что он не будет расширять класс MonoBehavior и не будет привязан ни к какому объекту.

Мы назовем его «Сериализуемые», и это будет выглядеть так:

Как видите, здесь нет функций, нет пространств имен, есть только один класс без конструктора, содержащий наши три известные переменные. Зачем мы это делаем?

Таким образом, в нашем глобальном объекте мы можем превратить отдельные статистические данные в один класс для их хранения:

И то же самое в переменных игрока:

Это дает нам дополнительный уровень безопасности. Мы не можем случайно записать неверные переменные проигрывателя в сохраненные переменные (например, XP = HP):

Теперь, когда мы хотим сохранить данные, мы просто удаляем это:

… и вместо этого скопируйте ссылку на класс, который содержит наши данные. Все значения внутри останутся там, где они должны:

То же самое для загрузки данных игрока в функцию запуска игрока!

Теперь у нас есть вся статистика нашего игрока в классе, который представляет только данные игрока, и ничего лишнего. Во время разработки вашей игры, когда вам нужно сохранить и загрузить больше переменных игрока, просто добавьте их в класс — сохранение и извлечение данных игрока в / из Global Object останется прежним.

Вывод

В следующей статье мы рассмотрим сохранение и загрузку всего класса на жесткий диск (а не только глобальный объект) с помощью сериализации.

Если вы застряли в какой-то момент или просто хотите посмотреть, как выглядит готовый проект, вы можете скачать его здесь:

Вопросов? Комментарии? Дайте нам знать в области ниже!

Источник

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

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