Unity как сделать окно

Обновлено: 20.05.2024

Вы можете создать любое количество пользовательских окон в вашем приложении. Они ведут себя точно так же как и инспектор, Scene View или любое другое встроенное окно. Это отличный способ добавить интерфейс в подсистему вашей игры.

Пользовательский интерфейс редактора за авторством Serious Games Interactive, используемый для скриптинга событий кат-сцен

Пользовательский интерфейс редактора за авторством Serious Games Interactive, используемый для скриптинга событий кат-сцен

Создание пользовательского окна редактора (Editor Window) включает в себя следующие шаги:

  • Создание скрипта, являющегося производным от EditorWindow.
  • Использование кода для включения отображения окна.
  • Реализация кода интерфейса для вашего инструмента.

Вывод из EditorWindow

Для того, чтобы сделать своё окно редактора, ваш скрипт должен храниться внутри папки, названной “Editor”. Создайте в этом скрипте класс, который будет производным от EditorWindow. Затем пропишите ваши элементы управления интерфейса во внутренней OnGUI функции.

MyWindow.js - помещается в папку ‘Editor’ внутри вашего проекта.

Отображение окна

Для того, чтобы отобразить окно на экране, создайте элемент меню, который отображает его. Это делается созданием функции, которая активируется при помощи MenuItem property.

Стандартным поведением в Unity будет использование различных окон, закрывая одни и открывая другие (таким образом, повторный выбор элемента меню покажет существующие окна. Это выполняется используя функцию EditorWindow.GetWindow. Вот так:

Отображение окна MyWindow

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

Реализация интерфейса вашего окна

Само содержимое окна рендерится при реализации функции OnGUI. Вы можете использовать те же UnityGUI классы, что используете для игрового интерфейса ( GUI и GUILayout ). В дополнение мы предоставляем некоторые дополнительные элементы управления интерфейса, расположенные в editor-only (только для редактора) классах EditorGUI и EditorGUILayout . Эти классы добавляют элементы управления уже доступные в обычных классах, так что вы можете совмещать и комбинировать как захотите.

В итоге этот пример создаёт окно, которые выглядит вот так:

Пользовательское окно редактора, созданное при помощи предоставленного примера.

Пользовательское окно редактора, созданное при помощи предоставленного примера.

Для дополнительной информации изучите примеры и документацию на странице EditorWindow.

Вы можете создать любое количество пользовательских окон в вашем приложении. Они ведут себя точно так же как и инспектор, Scene View или любое другое встроенное окно. Это отличный способ добавить интерфейс в подсистему вашей игры.

Custom Editor Interface by Serious Games Interactive used for scripting cutscene actions

Custom Editor Interface by Serious Games Interactive used for scripting cutscene actions

Создание пользовательского окна редактора (Editor Window) включает в себя следующие шаги:

  • Создание скрипта, являющегося производным от EditorWindow.
  • Использование кода для включения отображения окна.
  • Реализация кода интерфейса для вашего инструмента.

Вывод из EditorWindow

Для того, чтобы сделать своё окно редактора, ваш скрипт должен храниться внутри папки, названной “Editor”. Создайте в этом скрипте класс, который будет производным от EditorWindow. Затем пропишите ваши элементы управления интерфейса во внутренней OnGUI функции.

MyWindow.js - помещается в папку ‘Editor’ внутри вашего проекта.

Отображение окна

In order to show the window on screen, make a menu item that displays it. This is done by creating a function which is activated by the MenuItem property.

Стандартным поведением в Unity будет использование различных окон, закрывая одни и открывая другие (таким образом, повторный выбор элемента меню покажет существующие окна. Это выполняется используя функцию EditorWindow.GetWindow. Вот так:

Отображение окна MyWindow

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

Реализация интерфейса вашего окна

Само содержимое окна рендерится при реализации функции OnGUI. Вы можете использовать те же UnityGUI классы, что используете для игрового интерфейса (GUI и GUILayout). В дополнение мы предоставляем некоторые дополнительные элементы управления интерфейса, расположенные в editor-only (только для редактора) классах EditorGUI и EditorGUILayout. Эти классы добавляют элементы управления уже доступные в обычных классах, так что вы можете совмещать и комбинировать как захотите.

В итоге этот пример создаёт окно, которые выглядит вот так:

Custom Editor Window created using supplied example.

Custom Editor Window created using supplied example.

Для дополнительной информации изучите примеры и документацию на странице EditorWindow.

Вы можете создать любое количество пользовательских окон в вашем приложении. Они ведут себя точно так же как и инспектор, Scene View или любое другое встроенное окно. Это отличный способ добавить интерфейс в подсистему вашей игры.

Custom Editor Interface by Serious Games Interactive used for scripting cutscene actions

Custom Editor Interface by Serious Games Interactive used for scripting cutscene actions

Создание пользовательского окна редактора (Editor Window) включает в себя следующие шаги:

  • Создание скрипта, являющегося производным от EditorWindow.
  • Использование кода для включения отображения окна.
  • Реализация кода интерфейса для вашего инструмента.

Вывод из EditorWindow

Для того, чтобы сделать своё окно редактора, ваш скрипт должен храниться внутри папки, названной “Editor”. Создайте в этом скрипте класс, который будет производным от EditorWindow. Затем пропишите ваши элементы управления интерфейса во внутренней OnGUI функции.

MyWindow.js - помещается в папку ‘Editor’ внутри вашего проекта.

Отображение окна

In order to show the window on screen, make a menu item that displays it. This is done by creating a function which is activated by the MenuItem property.

Стандартным поведением в Unity будет использование различных окон, закрывая одни и открывая другие (таким образом, повторный выбор элемента меню покажет существующие окна. Это выполняется используя функцию EditorWindow.GetWindow. Вот так:

Отображение окна MyWindow

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

Реализация интерфейса вашего окна

Само содержимое окна рендерится при реализации функции OnGUI. Вы можете использовать те же UnityGUI классы, что используете для игрового интерфейса (GUI и GUILayout). В дополнение мы предоставляем некоторые дополнительные элементы управления интерфейса, расположенные в editor-only (только для редактора) классах EditorGUI и EditorGUILayout. Эти классы добавляют элементы управления уже доступные в обычных классах, так что вы можете совмещать и комбинировать как захотите.

В итоге этот пример создаёт окно, которые выглядит вот так:

Custom Editor Window created using supplied example.

Custom Editor Window created using supplied example.

Для дополнительной информации изучите примеры и документацию на странице EditorWindow.

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

paintnet

Далее, сохраним текстуру в формате png (чтоб сохранить прозрачность) в удобное для нас место и перейдем в Unity.

Допустим у нас есть строение, в котором есть окно и нам нужно создать для этого окна стекло.

glasshous

Создадим новый материал (правой кнопкой мыши в окне ProjectCreateMaterial).

newmaterial

И укажем этому материалу другой шейдер Legacy ShadersTransparentSpecular.

Shadersglass

Перенесем нашу текстуру в Unity и изменим ее тип (для отображения прозрачности) на Editor GUI and Legacy GUI, нажмем Apply.

LegacyGlass

И применим эту текстуру к нашему материалу.

MaterialGlass

Ну и последний шаг, применим материал к нашему окну.

Glass

В принципе, получилось вполне похоже на стекло, но не совсем идеально. По крайней мере, этот метод довольно прост и не требует особых затрат. Удачных проектов!

В Unity есть хорошая система для создания пользовательского интерфейса UI Canvas. По ней написано довольно много обучающего материала, но большинство гайдов рассказывает только о том, какие кнопки нажать и какой код написать, чтобы все заработало. В качестве примеров обычно приводится небольшой интерфейс состоящий из пары окон: главное меню, настройки. Однако в играх бывает гораздо больше окон и когда их становится уже хотя бы десяток, возникает необходимость какой-либо их организации. В рамках этой статьи я хочу рассказать как я решаю эту проблему.

Для начала нужно выделить отдельные окна в вашем интерфейсе. Под окном я подразумеваю панель с некоторыми контролами.





У каждого окна должен быть корневой объект, который будет содержать все контролы. Этот объект будет представлять окно как единое целое. Например есть панель на которой находятся элементы управления, логично сделать эти элементы дочерними по отношению к панели. К каждому окну прикрепляется компонент, котрый является наследником абстрактного класса Window.

Window написан исходя из того, что у окон могут быть дочерние окна, т.е. те окна которые могут быть открыты из текущего окна при этом в один момент времени может быть открыто одно дочернее окно, а все остальные должны быть закрыты. С этой целью класс содержит свойство CurrentWindow в котором хранится ссылка на открытое на данный момент окно. А также есть событие OnOpen которое сообщает об открытии окна. Метод ChangeCurrentWindow() можно подписать на это событие у дочерних окон, чтобы в любой момент времени было открыто одно дочернее окно, он закрывает открытое дочернее окно и меняет ссылку на текущее открытое окно, ниже я приведу пример реализации. Также в классе есть методы SelfClose() и SelfOpen(), эти методы отвечают за то как будет открываться и закрываться окно. В методе Awake() происходит регистрация окна в UIManager, т.е. добавляется ссылка на окно.

Далее перейдём к классу UIManager, он является sigleton-классом для того чтобы все окна могли к нему обращаться при необходимости. Как видно в нём есть список окон Windows, именно в нем хранятся ссылки на все окна на сцене. InitUI() нужен чтобы что-либо инициализировать, например, если вы хотите создавать окна из префабов, то здесь вы можете сделать их инстансы.
В методе Start() вы можете открыть окна которые должны быть открыты с самого начала или наоборот закрыть ненужные. Метод Get() позволяет получить ссылку на конкретное окно.

В качестве примера приведу свою реализацию окна настроек:


Из окна настроек я могу открыть 4 других окна, чтобы открыто было только одно окно, я подписываю метод ChangeCurrentWindow() окна настроек на события OnOpen дочерних окон, таким образом открытые окна закрываются, при открытии других. Реализации SelfOpen() и SelfClose() просто активируют или деактивируют окно.

Таким образом получается легко расширяемая система UI, нет необходимости вручную добавлять ссылки на окна в инспекторе или где-либо еще, чтобы добавить новое окно, нужно всего лишь создать соответствующий класс и унаследовать его от Window. У такой системы есть пара минусов, это то, что чем больше окон, тем больше классов необходимо будет создать и то, что поиск ссылки на окно происходит путем перебора массива ссылок, но на мой взгляд эти недостатки окупаются преимуществами.

Читайте также: