Сайт о телевидении

Сайт о телевидении

» » Главное меню unity3d. Rect Transform зависит от текущих настроек якоря. Использование Canvas Scaler

Главное меню unity3d. Rect Transform зависит от текущих настроек якоря. Использование Canvas Scaler

, Как добавить врагов , Контроллер врагов .
5. Простейшая игра (3) : Система частиц , Добавление звуков , Создание текста на экране , Публикация .
6. Трехмерный платформер. (в процессе создания)

2. Интерфейс программы

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

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

(Если эта тема не интересна, вы замечаете, что начинаете быстро утомляться при чтении, то можете пропустить целый раздел «Интерфейс», и сразу перейти к разделу «3. Создание простейшей игры ». Многим трудно даётся теория, гораздо эффективнее получается обучение сразу на практике. В 3-ей главе вы сразу же будете видеть результат своей работы, и обучение начнет приносить положительные эмоции. Но чтобы всё осознать, вам придётся периодически возвращаться ко второму разделу).

Ну а мы продолжаем.

Общий вид

Рабочее окно Unity разбито на 6 взаимосвязанных областей. (По умолчанию в Unity включается вид «Default» или «Tall». Если у вас другой вид рабочего окна, то можете переключить его в меню «Layout» в верхнем правом углу окна).



Перечень всех рабочих областей окна Unity:


1. Main menu
(Главное меню)
Строчка текста сверху, где располагаются все команды , доступные в программе. Многие команды продублированы кнопками и меню в рабочих областях, поэтому главное меню не обязательно использовать.
2. Project View
(Обзор проекта)
Список, в котором показаны все используемые файлы в игре: файл сцены, файл программного кода, графические и аудиофайлы.
3. Hierarchy
(Иерархия)
Список, где перечислены все объекты , добавленные на сцену. Здесь можно работать с объектами, копировать их, переименовывать, удалять.
4. Scene
(Сцена)
Область, где отображается игровой мир или игровая сцена. Здесь мы можем добавлять новые объекты, перетаскивать их, менять вид.
5. Game
(Игра)
Область предпросмотра, где видно, как сцена будет выглядеть в игре . Здесь можно настраивать различные настройки экрана и видеорежима.
6. Inspector
(Инспектор)
Список, состоящий из нескольких различных по виду разделов. Показывает все свойства выбранного объекта : размеры, модели, текстуры, скрипты.

Подробнее о каждой области будет описано ниже.

2.1. Главное меню (Main menu)


Главное меню Unity3D стандартно располагается в верхнем левом углу окна. Здесь есть обычные команды, типа «сохранить», «загрузить», но есть и уникальные для этой программы строчки.


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

2.2. Обзор проекта (Project View)


Каждый проект содержит папку «Assets». Содержимое этой папки представлено в области «Project View». Это ресурсы игры: файлы-скрипты, 3D-модели, текстуры, аудиофайлы, префабы (объекты, которые можно клонировать).


(Перемещение файлов можно выполнять в папке и через стандартный Проводник Windows, щёлкнув правой кнопкой мыши по нему и выбрав «Reveal in Exlorer». Но при перемещении ресурсов в Проводнике Windows будут потеряны все ссылки между объектами. Лучше всегда перемещать файлы внутри проекта только в «Project View»).


Добавить новый ресурс в проект можно двумя способами:

Перетащить файл из Проводника в Project View.

Команда «Assets» > «Import New Assets».


Проекты игры состоят из одного или нескольких файлов сцены. Каждая отдельная сцена – это отдельный уровень игры. Сцены так же хранятся в папке «Assets» и отображаются в «Project View».


Некоторые игровые ресурсы не являются файлами, и создаются непосредственно в Unity. Для создания ресурса используется выпадающее меню «Create» в «Project View» или (ПКМ) > «Create».

Меню «Create» позволяет добавлять в проект скрипты, префабы, папки и прочее. Любой ресурс или папку можно переименовать, нажав «F2» или сделав два клика по имени. Если зажать «Alt», то при раскрытии директории будут раскрыты и все поддиректории.

2.3. Иерархия (Hierarchy)


Иерархия содержит все объекты (GameObject) открытой сцены. Объекты, добавляемые в сцену или удаляемые из неё, отображаются или наоборот перестают отображаться в Hierarchy.


Наследование (Parenting). В иерархии Unity объектам можно задавать наследование. Любой объект может быть дочерним по отношению к другому. Дочерний объект будет двигаться и вращаться вместе с родителем. Для создания дочерней связи достаточно перетащить объект на «родителя» в Hierarchy.

2.4. Сцена (Scene View)


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


В 2D режиме управление интуитивно понятно. В 3D режиме есть множество приёмов для перемещения по сцене:

* Зажатый ПКМ активирует режим свободного полёта.

* Перемещаться можно клавишами WASD на манер игры в жанре FPS.

* Выберите объект в списке иерархии и нажмите «F». Вид сцены будет центрирован и масштабирован по выбранному объекту.

* При зажатом Alt, ЛКМ будет крутить камеру вокруг текущей точки опоры.

* При зажатом Alt, СКМ будет перемещать камеру.

* При зажатом Alt, ПКМ будет масштабировать вид сцены.

* Альтернативный режим перемещений - клавиша Q.

2.5. Игровой вид (Game View) Сайт сайт


Game View - предпросмотр игры (рендер из игровой камеры).

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


Три кнопки в верхней части окна Юнити отвечают за управление предпросмотром игры: «Play», «Pause» и «Step». (Все изменения, произведённые во время предпросмотра, сбрасываются при выходе из него. Исключением являются изменения в префабах).


Game View Control Bar

Первое выпадающее меню в «Game View» - это контроль пропорций изображения (Aspect Drop-down). На некоторых дисплеях это соотношение отличается от стандартного 4:3 (например, на широкоформатных мониторах - 16:10).

Кнопка «Gizmos» включает отображение контейнеров гизмо в «Game View».

Последняя кнопка - «Stats». Она показывает статистку рендеринга (Rendering Statistics), полезную при оптимизации.

2.6. Инспектор (Inspector)


GameObject – это любой объект в игре. Следует понимать, что сам по себе объект ничего не делает. Ему требуются специальные свойства, прежде чем он станет персонажем, окружением или визуальным эффектом.

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


Перечень объектов содержится в области «Hierarchy». Если в списке иерархии мы выберем любой объект, то в области «Inspector» (Инспектор) отобразятся все свойства этого конкретного объекта. Здесь же можно редактировать все эти свойства или добавлять новые.


Объект может содержать в себе такие типы компонентов: расположение в пространстве (Transform), меши (meshes), скрипты (scripts), звуки, ИС (Lights) и другие элементы.

Status Bar

Строка состояния (Status Bar) расположена в нижней части окна редактора. Она отображает ошибки компиляции и логи дебага. Если возникают проблемы с игрой, стоит заглянуть в строку состояния. Двойное нажатие на неё вызовет окно консоли (Console), в котором отображаются все ошибки.

2.7. Настройка рабочего окна

Можно настраивать расположение (Layout) секторов, перетаскивая их за закладки. Если перетащить закладку в область закладок уже существующего окна, то она будет добавлена к присутствующим там закладкам. Также можно прикрепить сектор к краю экрана или краю другого сектора.

Сектор может быть пристыкован к одной из сторон существующего окна.

Закладки могут открепляться от главного окна редактора и включаться в состав плавающего окна редактора. Плавающее окно может содержать сектора и закладки так же, как и главное окно.

Плавающее окно редактор похоже на главное окно, но не имеет панели инструментов (Toolbar).

Когда расположение секторов задано, его можно сохранить и загрузить в нужный момент через выпадающее меню Layout (Save и Load).

Полностью настроенное расположение секторов.

В любое время можно правым кликом по закладке вызвать меню с дополнительными возможностями, такими как максимизация сектора или добавление новых закладок.

Достижение "Почётный читатель сайт"
Понравилась статья? В благодарность можно поставить лайк через любую социальную сеть. Для вас это - один клик, для нас - очередной шаг вверх в рейтинге игровых сайтов.
Достижение "Почётный спонсор сайт"
Для особо щедрых есть возможность перевести деньги на счет сайта. В этом случае вы можете повлиять на выбор новой темы для статьи или прохождения.
money.yandex.ru/to/410011922382680
  • Разработка под Android
    • Tutorial

    Как создать внутриигровое меню в Unity

    Unity позволяет не делать меню настроек, так как есть встроенный диалог настроек качества и разрешения перед запуском игры. Однако если вы хотите сделать вашу игру неповторимой и показать, на что способны, как дизайнер, то эта статья именно для вас. После прохождения этого туториала вы сможете создавать свое собственное меню с таким функционалом – настройки громкости, разрешения, качества изображения, переключения полноэкранного и оконного режима. Интересно? Тогда запускай Unity и поехали!
    Создание и дизайн главного меню и меню настроек
    1. Создаем две сцены: Menu и Game
    2. Открываем File->BuildSettings и перетаскиваем созданные сцены в Scenes in build.

    Теперь можем приступать к созданию пользовательского интерфейса. Откройте сцену Menu и добавьте Panel. Сразу добавляется Canvas(Холст) и дочерним объектом к нему добавляется Panel (Панель).


    Обратим внимание на инспектор для Canvas. А именно на компонент Canvas.


    Render Mode автоматически выставлен на Screen Space – Overlay.

    Немного информации:

    Screen Space – Overlay:

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

    Важен порядок размещения объектов в иерархии. Холст Screen Space – Overlay должен находиться в самом верху иерархии, иначе он может пропасть из виду.


    Screen Space – Camera:

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

    Так же для Холста с такими настройками важно размещение относительно других объектов. На переднем плане будут объекты, которые находятся ближе к камере, не зависимо от того, это UI или другие GameObjects.


    World Space:

    Холст размещается, как любой другой объект без привязки к камере или экрану, он может быть ориентирован как вам угодно, размер Холста задается с помощью RectTransform, но то, как его будет видно во время игры, будет зависеть от положения камеры.
    В данном задании мы будем использовать Screen Space – Overlay.
    Давайте настроим цвет панели. Можно также добавить картинку на фон. Для этого нужно обратить внимание на компонент Image в Инспекторе панели.


    Как видите, картинка добавляется в поле Source Image. Картинку можно просто перетащить из файлов проекта, либо кликнуть на кружочек справа от поля.

    Цвет выбирается в поле Color, либо с помощью инструмента пипетки.
    Важно знать, что пипетка позволяет выбрать цвет за пределами Unity.
    После того, как выбрали цвет или картинку, нам нужно разместить кнопки, которые всем будут управлять, а так же текст. Чтобы упростить себе задачу, для Panel мы добавим еще один компонент, который называется Vertical Layout Group. И сразу настроим его.

    Нам необходимо разместить все кнопки и текст по центру экрана. Для этого находим в компоненте Vertical Layout Group пункт Child Alignment и выбираем Middle Center. Теперь все наши элементы, будь то кнопки или текст, будут выравниваться по центру, независимо от разрешения экрана.

    Так же убираем галочки с ChildForceExpand. Должно получиться так:


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

    В нашем меню должны быть следующие кнопки:

    1. Start Game
    2. Settings
    3. Exit

    Сейчас, добавляем Text дочерним элементом нашей Панели. Можете заметить, как он прикрепляется по центру. Иногда для этого требуется созданный элемент в окне Scene просто передвинуть на Panel и тогда он выровняется. Настраиваем текст так, как хочется с помощью компонента Text(Script) в инспекторе.


    После добавляем Button. Кнопка добавится под текст.

    Разберем компонент Button нашей кнопки. Нас интересует Transition – то, как кнопка будет реагировать на действия мышки. В Unity реализовано несколько способов. Пока рассмотрим довольно простой Color Tint. Это значит, что кнопка будет менять свой цвет при определенных состояниях. Интерфейс для настройки довольно удобный. Настраиваем так, как нравится.


    Так же у объекта Button есть дочерний объект Text – это текст который будет отображаться на кнопке. В тексте прописываем Play.

    Кажется, Текст и Кнопки находятся слишком близко друг к другу.

    Что бы это исправить для нашего Текста Menu добавляем еще один компонент, который называется Layout Element. И ставим галочку напротив Ignore Layout.


    После этого выставляем Anchor на Middle-Center.


    Потом добавляем еще три кнопки и называем их Settings, Credits, Exit.
    Можно поменять размеры кнопок. На этом этапе меню выглядит так:

    Переходы между main menu и settings
    Что бы переходить на меню опций не обязательно делать новую сцену.
    Для начала создаем пустой GameObject (Create Empty) как Child нашего Холста. Назовем его Main menu. Потом нашу панель, со всеми инструментами сделаем дочерними элементами этого объекта. Должно получиться так:


    Выбираем наш MainMenu объект и сделаем его дубликат. С выбранным элементом нажимаем комбинацию клавиш Ctrl+D. У нас появится новый объект.


    Переименовываем новый объект в Settings. Для удобства управления инактивируем MainMenu.


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

    За контроль Fullscreen будет отвечать элемент Toggle.
    За громкость – Slider.
    За качество изображения и разрешение – Dropdown.

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

    Можно настроить Spacing в Vertical layout group, чтобы между элементами было немного пространства. Добавим на панель картинку и в итоге получим такой результат:

    Программирование кнопок
    Перейдем к написанию скрипта меню.

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

    Это мы и пропишем в нашем скрипте.

    Для MainMenu добавляем новый компонент MenuControls.cs и отрываем его.

    Первое что надо сделать – удалить существующие методы Start() и Update() – тут они нам не нужны.

    Using UnityEngine.SceneManagement;
    После этого напишем свой метод для нажатия кнопки Play. Метод должен быть public - нам нужно иметь возможность видеть его за пределами нашего скрипта.

    За загрузку сцены отвечает SceneManager и у него есть метод LoadScene. Существует несколько перегрузок метода. Можно передавать имя сцены, которую вы хотите загрузить. В нашем случае это сцена «Game».

    В итоге функция будет выглядеть следующим образом.

    Public void PlayPressed() { SceneManager.LoadScene("Game"); }
    Так же создаем метод для выхода из игры:

    Public void ExitPressed() { Application.Quit(); }
    Однако в Unity мы не увидим результата работы этого метода, так как подобное работает только в билде. Для того что бы проверить, что все работает правильно, добавляем в метод строчку

    Debug.Log("Exit pressed!");
    Теперь необходимо прикрепить события кнопок к этим методам. Выбираем кнопку Play и находим в инспекторе следующее:


    Это событие кнопки, которое по нажатию будет вызывать подписанные на событие методы. Добавляем метод нажимая на +.

    В появившееся окно нужно перетащить объект, в котором содержится нужный скрипт. В нашем случае это Main Menu.

    После этого нужно выбрать скрипт MenuControls и найти метод PlayPressed().


    Точно также делаем для кнопки Exit. Только теперь выбираем метод ExitPressed().
    Для кнопки Settings нам не нужно писать никакой код, так как некоторый функционал уже встроен.

    Суть в том, что мы будем активировать GameObject. На этом этапе у вас должен быть активным MainMenu, а Settings не должно быть видно. Так же видим, что когда мы активируем Settings, он полностью перекрывает Menu. Суть в том, что играет роль порядок расположения дочерних объектов Холста – в каком порядке они расположены в иерархии в том порядке они и будут прорисовываться. Поскольку Settings у нас находятся над Main Menu, то они перекрывают меню.
    Это мы и будем использовать.

    Выбираем кнопку Settings и в OnClick() перетаскиваем наш объект Settings. В функциях выбираем GameObject ->SetActive(); и ставим галочку. Вот так:


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

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

    Настройки
    Настройки полного экрана

    Первое что мы пропишем это переключение полноэкранного и оконного режимов.
    Нужно убрать галочку с пункта Is On нашего Toggle элемента.
    Создаем скрипт для объекта Settings. Назовем его Settings.cs.

    Для начала нам надо хранить переменную типа bool которая будет отображать текущее состояниеполноэкранный режим или нет. А потом, по изменению toggle эта переменная будет переключаться на противоположное значение.

    У экрана есть свойство Screen.fullScreen типа bool. Можно просто будем присваивать значение нашей переменной isFullScreen этому свойству.

    Код выглядит так:

    Public void FullScreenToggle() { isFullScreen = !isFullScreen; Screen.fullScreen = isFullScreen; }
    Увидеть результат можно только в билде. Давайте сейчас это сделаем. Учтите, что для того что бы билд был правильным нужно оставить активным только объект MainMenu, а Settings отключить. Если это сделано, то запускаем билд через File->BuildSettings и нажимаем кнопку Build.

    После этого можно проверить работу программы. Если все правильно, то по нажатию галочки сразу будет изменяться режим.

    Изменения громкости звука в игре
    Для работы с настройками звука нам для начала понадобится AudioMixer, а также какой-нибудь трек, на котором мы будем проверять работу наших настроек.

    Добавим эти два элемента. Сначала добавляем AudioMixer. Правой кнопкой мыши в окне Project ->Create->AudioMixer.

    Называем его GameSettings. После этого открываем окно AudioMixer: Window->Audio Mixer (Ctrl + 8).

    Что бы контролировать параметры миксера через скрипт, их нужно сделать видимыми для этого скрипта. Эта процедура называется ExposeParameters. Для этого кликаем на Mixer и в инспекторе находим volume и кликаем правой кнопкой мыши. Выбираем Expose to script:


    Теперь в окне Audio Mixer обратите внимание на пункт Exposed Parameters в верхней левой части.
    Теперь там есть параметр. Кликаем на него и называем наш параметр masterVolume. Следует запомнить имя, которое ему присваиваем – его нужно будет указать в коде.

    Переходим в Settings.cs и создаем поле AudioMixer, чтобы получить ссылку на него в коде.

    Public AudioMixer am;
    потом создаем метод

    Public void AudioVolume(float sliderValue) { am.SetFloat("masterVolume", sliderValue); }
    Метод SetFloat будет принимать значения нашего слайдера и присваивать это значение параметру “masterVolume”.

    Осталось прикрепить наш метод к событиям слайдера. Находим в инспекторе слайдера поле On Value Changed и точно так же прикрепляем объект. Вот только теперь нам надо не просто выбирать метод из списка, а использовать поле Dynamic float. Как видите, там уже есть наш метод, и он будет получать переменную от самого слайдера. Также нужно не забыть перетащить AudioMixer в соответствующее поле в компоненте Settings.cs.


    Обратите внимание, что мы напрямую привязываем значение слайдера к значениям аудио-миксера. В аудио миксере громкость изменяется от -80 до 20. Нам же достаточно менять от -80(нет звука) до 0(нормальный звук). В настройках слайдера минимальное значение выставляем на -80, максимальное на 0.
    Теперь добавим звуки в нашу игру, чтобы проверить работу скрипта.
    На canvas добавим компонент Audio Source.
    Настроим его следующим образом:


    Audio Clip – саундтрек
    Output – Мастер нашего миксера (дочерний объект)
    Loop – поставить галочку – зациклить композицию, чтобы она играла постоянно.
    Качество изображения
    В Unity уже встроены настройки качества изображения. Edit->Project Settings->Quality. В инспекторе видим Quality settings. Их можно добавлять и настраивать.

    Особенностью работы с настройками качества является следующее:
    Каждой настройке соответствует индекс, который мы можем получить из Dropdown. Все что нужно сделать – переписать соответствующие пункты в нужные индексы в нашем UI элементе. Открываем его и в инспекторе находим Dropdown(Script) и в нем пункт Options. Дальше вписываем настройки в нужном порядке. У меня получилось так:


    Дальше нужно прописать код. Мы продолжаем дополнять методами наш скрипт Settings.cs
    Создаем метод, который будет принимать int – индекс выбранного пункта.

    Public void Quality(int q) { QualitySettings.SetQualityLevel(q); }
    Сохраняем скрипт и подключаем метод к событию на нашем меню. На этот раз это событие Dropdown – On Value Changed.

    Поскольку наш метод будет получать значение от самого UI элемента, то мы выбираем название метода из группы Dymanic int. по аналогии с предыдущим пунктом.

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

    Первое что нам понадобится – массив типа Resolution где мы будем хранить значения разрешений экрана.

    Однако для пунктов выпадающего списка тип – string. Поэтому создаем список List<> в который мы будем сохранять значения возможных разрешений. Для работы со списками необходимо подключить:

    Using System.Collections.Generic;
    Также нам понадобится ссылка на соответствующий Dropdown. Для работы с UI элементами следует также прописать:

    Using UnityEngine.UI;
    В скрипте получим следующие поля:

    Resolution rsl; List resolutions; public Dropdown dropdown;
    Инициализацию и заполнение проводим в методе Awake. Этот метод вызывается при запуске объекта, соответственно выполняется раньше, чем все остальные методы.

    Получаем значения и каждое из них добавляем в List в формате ширина*высота. После этого очищаем список Dropdown и заполняем его новыми опциями.

    Public void Awake() { resolutions = new List(); rsl = Screen.resolutions; foreach (var i in rsl) { resolutions.Add(i.width +"x" + i.height); } dropdown.ClearOptions(); dropdown.AddOptions(resolutions); }
    Теперь нужно создать метод, который будет менять разрешение экрана. Как и в предыдущих пунктах – принимать значение будем от UI элемента. Создаем функцию, которая принимает int

    Public void Resolution(int r) { Screen.SetResolution(rsl[r].width, rsl[r].height, isFullScreen); }
    В SetResolution необходимо передать параметры – ширина, высота и булевскую переменную, отвечающую за полный экран. У нас такая уже есть – это isFullScreen. Передаем ее в функцию.
    Дальше не забываем подключить к соответствующему событию наш метод Resolution из группы Dynamic Int, а так же добавить ссылку на нужный Dropdown.


    Готово. Теперь можно использовать это меню вместо скучного дефолтного лаунчера. Однако, чтобы был толк нужно отключить его запуск.

    Edit->ProjectSettings-> Display Resolution Dialog-Disabled


    Теперь у вас есть возможность создавать свои менюшки и использовать в них любые дизайнерские решения, которые сделают игру уникальной и запоминающейся.
    Unity позволяет не делать меню настроек, так как есть встроенный диалог настроек качества и разрешения перед запуском игры. Однако если вы хотите сделать вашу игру неповторимой и показать, на что способны, как дизайнер, то эта статья именно для вас. После прохождения этого туториала вы сможете создавать свое собственное меню с таким функционалом – настройки громкости, разрешения, качества изображения, переключения полноэкранного и оконного режима. Интересно? Тогда запускай Unity и поехали!
    Создание и дизайн главного меню и меню настроек
    1. Создаем две сцены: Menu и Game
    2. Открываем File->BuildSettings и перетаскиваем созданные сцены в Scenes in build.

    Теперь можем приступать к созданию пользовательского интерфейса. Откройте сцену Menu и добавьте Panel. Сразу добавляется Canvas(Холст) и дочерним объектом к нему добавляется Panel (Панель).


    Обратим внимание на инспектор для Canvas. А именно на компонент Canvas.


    Render Mode автоматически выставлен на Screen Space – Overlay.

    Немного информации:

    Screen Space – Overlay:

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

    Важен порядок размещения объектов в иерархии. Холст Screen Space – Overlay должен находиться в самом верху иерархии, иначе он может пропасть из виду.


    Screen Space – Camera:

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

    Так же для Холста с такими настройками важно размещение относительно других объектов. На переднем плане будут объекты, которые находятся ближе к камере, не зависимо от того, это UI или другие GameObjects.


    World Space:

    Холст размещается, как любой другой объект без привязки к камере или экрану, он может быть ориентирован как вам угодно, размер Холста задается с помощью RectTransform, но то, как его будет видно во время игры, будет зависеть от положения камеры.
    В данном задании мы будем использовать Screen Space – Overlay.
    Давайте настроим цвет панели. Можно также добавить картинку на фон. Для этого нужно обратить внимание на компонент Image в Инспекторе панели.


    Как видите, картинка добавляется в поле Source Image. Картинку можно просто перетащить из файлов проекта, либо кликнуть на кружочек справа от поля.

    Цвет выбирается в поле Color, либо с помощью инструмента пипетки.
    Важно знать, что пипетка позволяет выбрать цвет за пределами Unity.
    После того, как выбрали цвет или картинку, нам нужно разместить кнопки, которые всем будут управлять, а так же текст. Чтобы упростить себе задачу, для Panel мы добавим еще один компонент, который называется Vertical Layout Group. И сразу настроим его.

    Нам необходимо разместить все кнопки и текст по центру экрана. Для этого находим в компоненте Vertical Layout Group пункт Child Alignment и выбираем Middle Center. Теперь все наши элементы, будь то кнопки или текст, будут выравниваться по центру, независимо от разрешения экрана.

    Так же убираем галочки с ChildForceExpand. Должно получиться так:


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

    В нашем меню должны быть следующие кнопки:

    1. Start Game
    2. Settings
    3. Exit

    Сейчас, добавляем Text дочерним элементом нашей Панели. Можете заметить, как он прикрепляется по центру. Иногда для этого требуется созданный элемент в окне Scene просто передвинуть на Panel и тогда он выровняется. Настраиваем текст так, как хочется с помощью компонента Text(Script) в инспекторе.


    После добавляем Button. Кнопка добавится под текст.

    Разберем компонент Button нашей кнопки. Нас интересует Transition – то, как кнопка будет реагировать на действия мышки. В Unity реализовано несколько способов. Пока рассмотрим довольно простой Color Tint. Это значит, что кнопка будет менять свой цвет при определенных состояниях. Интерфейс для настройки довольно удобный. Настраиваем так, как нравится.


    Так же у объекта Button есть дочерний объект Text – это текст который будет отображаться на кнопке. В тексте прописываем Play.

    Кажется, Текст и Кнопки находятся слишком близко друг к другу.

    Что бы это исправить для нашего Текста Menu добавляем еще один компонент, который называется Layout Element. И ставим галочку напротив Ignore Layout.


    После этого выставляем Anchor на Middle-Center.


    Потом добавляем еще три кнопки и называем их Settings, Credits, Exit.
    Можно поменять размеры кнопок. На этом этапе меню выглядит так:

    Переходы между main menu и settings
    Что бы переходить на меню опций не обязательно делать новую сцену.
    Для начала создаем пустой GameObject (Create Empty) как Child нашего Холста. Назовем его Main menu. Потом нашу панель, со всеми инструментами сделаем дочерними элементами этого объекта. Должно получиться так:


    Выбираем наш MainMenu объект и сделаем его дубликат. С выбранным элементом нажимаем комбинацию клавиш Ctrl+D. У нас появится новый объект.


    Переименовываем новый объект в Settings. Для удобства управления инактивируем MainMenu.


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

    За контроль Fullscreen будет отвечать элемент Toggle.
    За громкость – Slider.
    За качество изображения и разрешение – Dropdown.

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

    Можно настроить Spacing в Vertical layout group, чтобы между элементами было немного пространства. Добавим на панель картинку и в итоге получим такой результат:

    Программирование кнопок
    Перейдем к написанию скрипта меню.

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

    Это мы и пропишем в нашем скрипте.

    Для MainMenu добавляем новый компонент MenuControls.cs и отрываем его.

    Первое что надо сделать – удалить существующие методы Start() и Update() – тут они нам не нужны.

    Using UnityEngine.SceneManagement;
    После этого напишем свой метод для нажатия кнопки Play. Метод должен быть public - нам нужно иметь возможность видеть его за пределами нашего скрипта.

    За загрузку сцены отвечает SceneManager и у него есть метод LoadScene. Существует несколько перегрузок метода. Можно передавать имя сцены, которую вы хотите загрузить. В нашем случае это сцена «Game».

    В итоге функция будет выглядеть следующим образом.

    Public void PlayPressed() { SceneManager.LoadScene("Game"); }
    Так же создаем метод для выхода из игры:

    Public void ExitPressed() { Application.Quit(); }
    Однако в Unity мы не увидим результата работы этого метода, так как подобное работает только в билде. Для того что бы проверить, что все работает правильно, добавляем в метод строчку

    Debug.Log("Exit pressed!");
    Теперь необходимо прикрепить события кнопок к этим методам. Выбираем кнопку Play и находим в инспекторе следующее:


    Это событие кнопки, которое по нажатию будет вызывать подписанные на событие методы. Добавляем метод нажимая на +.

    В появившееся окно нужно перетащить объект, в котором содержится нужный скрипт. В нашем случае это Main Menu.

    После этого нужно выбрать скрипт MenuControls и найти метод PlayPressed().


    Точно также делаем для кнопки Exit. Только теперь выбираем метод ExitPressed().
    Для кнопки Settings нам не нужно писать никакой код, так как некоторый функционал уже встроен.

    Суть в том, что мы будем активировать GameObject. На этом этапе у вас должен быть активным MainMenu, а Settings не должно быть видно. Так же видим, что когда мы активируем Settings, он полностью перекрывает Menu. Суть в том, что играет роль порядок расположения дочерних объектов Холста – в каком порядке они расположены в иерархии в том порядке они и будут прорисовываться. Поскольку Settings у нас находятся над Main Menu, то они перекрывают меню.
    Это мы и будем использовать.

    Выбираем кнопку Settings и в OnClick() перетаскиваем наш объект Settings. В функциях выбираем GameObject ->SetActive(); и ставим галочку. Вот так:


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

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

    Настройки
    Настройки полного экрана

    Первое что мы пропишем это переключение полноэкранного и оконного режимов.
    Нужно убрать галочку с пункта Is On нашего Toggle элемента.
    Создаем скрипт для объекта Settings. Назовем его Settings.cs.

    Для начала нам надо хранить переменную типа bool которая будет отображать текущее состояние – полноэкранный режим или нет. А потом, по изменению toggle эта переменная будет переключаться на противоположное значение.

    У экрана есть свойство Screen.fullScreen типа bool. Можно просто будем присваивать значение нашей переменной isFullScreen этому свойству.

    Код выглядит так:

    Public void FullScreenToggle() { isFullScreen = !isFullScreen; Screen.fullScreen = isFullScreen; }
    Увидеть результат можно только в билде. Давайте сейчас это сделаем. Учтите, что для того что бы билд был правильным нужно оставить активным только объект MainMenu, а Settings отключить. Если это сделано, то запускаем билд через File->BuildSettings и нажимаем кнопку Build.

    После этого можно проверить работу программы. Если все правильно, то по нажатию галочки сразу будет изменяться режим.

    Изменения громкости звука в игре
    Для работы с настройками звука нам для начала понадобится AudioMixer, а также какой-нибудь трек, на котором мы будем проверять работу наших настроек.

    Добавим эти два элемента. Сначала добавляем AudioMixer. Правой кнопкой мыши в окне Project ->Create->AudioMixer.

    Называем его GameSettings. После этого открываем окно AudioMixer: Window->Audio Mixer (Ctrl + 8).

    Что бы контролировать параметры миксера через скрипт, их нужно сделать видимыми для этого скрипта. Эта процедура называется ExposeParameters. Для этого кликаем на Mixer и в инспекторе находим volume и кликаем правой кнопкой мыши. Выбираем Expose to script:


    Теперь в окне Audio Mixer обратите внимание на пункт Exposed Parameters в верхней левой части.
    Теперь там есть параметр. Кликаем на него и называем наш параметр masterVolume. Следует запомнить имя, которое ему присваиваем – его нужно будет указать в коде.

    Переходим в Settings.cs и создаем поле AudioMixer, чтобы получить ссылку на него в коде.

    Public AudioMixer am;
    потом создаем метод

    Public void AudioVolume(float sliderValue) { am.SetFloat("masterVolume", sliderValue); }
    Метод SetFloat будет принимать значения нашего слайдера и присваивать это значение параметру “masterVolume”.

    Осталось прикрепить наш метод к событиям слайдера. Находим в инспекторе слайдера поле On Value Changed и точно так же прикрепляем объект. Вот только теперь нам надо не просто выбирать метод из списка, а использовать поле Dynamic float. Как видите, там уже есть наш метод, и он будет получать переменную от самого слайдера. Также нужно не забыть перетащить AudioMixer в соответствующее поле в компоненте Settings.cs.


    Обратите внимание, что мы напрямую привязываем значение слайдера к значениям аудио-миксера. В аудио миксере громкость изменяется от -80 до 20. Нам же достаточно менять от -80(нет звука) до 0(нормальный звук). В настройках слайдера минимальное значение выставляем на -80, максимальное на 0.
    Теперь добавим звуки в нашу игру, чтобы проверить работу скрипта.
    На canvas добавим компонент Audio Source.
    Настроим его следующим образом:


    Audio Clip – саундтрек
    Output – Мастер нашего миксера (дочерний объект)
    Loop – поставить галочку – зациклить композицию, чтобы она играла постоянно.
    Качество изображения
    В Unity уже встроены настройки качества изображения. Edit->Project Settings->Quality. В инспекторе видим Quality settings. Их можно добавлять и настраивать.

    Особенностью работы с настройками качества является следующее:
    Каждой настройке соответствует индекс, который мы можем получить из Dropdown. Все что нужно сделать – переписать соответствующие пункты в нужные индексы в нашем UI элементе. Открываем его и в инспекторе находим Dropdown(Script) и в нем пункт Options. Дальше вписываем настройки в нужном порядке. У меня получилось так:


    Дальше нужно прописать код. Мы продолжаем дополнять методами наш скрипт Settings.cs
    Создаем метод, который будет принимать int – индекс выбранного пункта.

    Public void Quality(int q) { QualitySettings.SetQualityLevel(q); }
    Сохраняем скрипт и подключаем метод к событию на нашем меню. На этот раз это событие Dropdown – On Value Changed.

    Поскольку наш метод будет получать значение от самого UI элемента, то мы выбираем название метода из группы Dymanic int. по аналогии с предыдущим пунктом.

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

    Первое что нам понадобится – массив типа Resolution где мы будем хранить значения разрешений экрана.

    Однако для пунктов выпадающего списка тип – string. Поэтому создаем список List<> в который мы будем сохранять значения возможных разрешений. Для работы со списками необходимо подключить:

    Using System.Collections.Generic;
    Также нам понадобится ссылка на соответствующий Dropdown. Для работы с UI элементами следует также прописать:

    Using UnityEngine.UI;
    В скрипте получим следующие поля:

    Resolution rsl; List resolutions; public Dropdown dropdown;
    Инициализацию и заполнение проводим в методе Awake. Этот метод вызывается при запуске объекта, соответственно выполняется раньше, чем все остальные методы.

    Получаем значения и каждое из них добавляем в List в формате ширина*высота. После этого очищаем список Dropdown и заполняем его новыми опциями.

    Public void Awake() { resolutions = new List(); rsl = Screen.resolutions; foreach (var i in rsl) { resolutions.Add(i.width +"x" + i.height); } dropdown.ClearOptions(); dropdown.AddOptions(resolutions); }
    Теперь нужно создать метод, который будет менять разрешение экрана. Как и в предыдущих пунктах – принимать значение будем от UI элемента. Создаем функцию, которая принимает int

    Public void Resolution(int r) { Screen.SetResolution(rsl[r].width, rsl[r].height, isFullScreen); }
    В SetResolution необходимо передать параметры – ширина, высота и булевскую переменную, отвечающую за полный экран. У нас такая уже есть – это isFullScreen. Передаем ее в функцию.
    Дальше не забываем подключить к соответствующему событию наш метод Resolution из группы Dynamic Int, а так же добавить ссылку на нужный Dropdown. 

    Часть третья. Контроль текста.

    16. Откройте скрипт TextControl и приготовьтесь писать.

    17. Для начала давайте создадим переменную isNewGameButton, при которой объект будет загружать сцену.

    var isNewGameButton = false;

    Примечание: Почему false? Потому-что при true переменная будет срабатывать сразу.

    18. Лучше не раскатывать тесто, и сразу выставить нужные переменные.

    var isOptionsButton = false; var isQualityButtonFastest = false; var isQualityButtonFantastic = false; var isMainMenuButton = false; var isQuitButton = false;

    19. Теперь давайте разберем самое интересное. При входе на объект курсора мыши, его материал моментально изменяется.

    function OnMouseEnter() {

    function OnMouseExit() {

    Смена материала на серый цвет при входе курсора будет осуществляться таким образом:

    function OnMouseEnter() { renderer.material.color = Color.gray; }

    А возвращение материала в прежний вид при выходе курсора выглядит так:

    function OnMouseExit() { renderer.material.color = Color.white; }

    Примечание: Белый цвет, точнее Color.white, возвращает обычный цвет текстуре.

    20. Сейчас мы начнем делать нажатие на объекты.

    Нажатие осуществляется через:

    function OnMouseUp() {

    А чтобы занять чем-то нажатие, мы составим свойства для каждой переменной.

    Для начала возьмем переменную IsQuitButton:

    function OnMouseUp() { if (isQuitButton) { Application.Quit(); }

    Примечание: Application.Quit() осуществляет выход из игры полностью.

    Теперь возьмем переменную ужасной графики.

    else if (isQualityButtonFastest) { QualitySettings.currentLevel = QualityLevel.Fastest; }

    Примечание: else дает возможность работать в OnMouseUp() много раз. А QualitySettings.currentLevel = QualityLevel.Fastest изменяет графику на уровне.

    else if (isQualityButtonFantastic) { QualitySettings.currentLevel = QualityLevel.Fantastic; }

    Примечание: Тоже самое что и выше, но теперь с максимальной графикой.

    Теперь возьмем переменную загрузки уровня.

    else if (isNewGameButton) { Application.LoadLevel (1); }

    Примечание: Application.LoadLevel () дает возможность загружать уровень. А число в скобках пишут для точной загрузки нужного левела.

    21. Теперь поработаем с камерами. Создайте новые две переменные:

    var camera1:Camera; var camera2:Camera;

    А теперь продолжите таким образом:

    else if (isOptionsButton) { camera1.enabled = false; camera2.enabled = true; }

    Примечание: Мы работаем с нажатием, и таким образом, когда вы щелкаете на кнопке Options, первая камера отключается, а вторая начинает функционировать.

    22. Ну и последнее что нам нужно, это возвращение из игры в меню.

    else if (isMainMenuButton) { Application.LoadLevel (0); }

    Добавьте в конце закрывающуюся скобку }.

    23. Проверяем.

    var isNewGameButton = false; var isOptionsButton = false; var isQualityButtonFastest = false; var isQualityButtonFantastic = false; var isMainMenuButton = false; var isQuitButton = false; var camera1:Camera; var camera2:Camera; function OnMouseEnter() { //color.X - any color that you like renderer.material.color = Color.gray; } function OnMouseExit() { //color.X - any color that you like renderer.material.color = Color.white; } function OnMouseUp() { if (isQuitButton) { Application.Quit(); } else if (isQualityButtonFastest) { QualitySettings.currentLevel = QualityLevel.Fastest; } else if (isQualityButtonFantastic) { QualitySettings.currentLevel = QualityLevel.Fantastic; } else if (isNewGameButton) { //it can be any level Application.LoadLevel (1); } else if (isOptionsButton) { camera1.enabled = false; camera2.enabled = true; } else if (isMainMenuButton) { //main menu level Application.LoadLevel (0); } }

    Часть четвертая. Сборка меню.

    24. Назначьте готовый скрипт ко всем кнопкам в сцене.
    25. Теперь смотрим в Inspector --> Text Control (Script) и разбираем.

    Для начала выберите кубик с New Game и поставьте галочку Is New Game Button.
    Затем щелкните кубик с Options и поставьте галку Is Options Button. А еще в поле Camera 1 вставьте первую камеру, а в поле Camera 2, вторую.
    На кубике Quit галку Is Quit Button.

    Сейчас мы переходим на место с настройками. Выделите куб Fastest и поставьте галочку Is Quality Button Fastest. Так же Fantastic, но уже Is Quality Button Fantastic.
    Выделите кнопку Cancel, поставье галочку Is Options Button, и вставьте в поле Camera 1 вторую камеру, а в поле Camera 2, первую.
    Примечание: Почему? Потому-что нам нужен обратный процесс.

    Для загрузки сцены (1), то есть, Is New Game Button, при компиляции, выставьте уровень под нужным вам числом. И не забудьте изменить значение в скрипте!

    Так же, если потребуется выйти из уровня обратно в меню, используйте переменную Is Main Menu Button.

    26. Теперь посмотрим что получилось.

    Если все в порядке, значит я не зря писал данный урок:)
    А если возникли какие-то проблемы, пишите, помогу всем, чем смогу.
    Спасибо за внимание, с вами был Валентин. Желаю успехов в игрострое!

    Ну а в следующем уроке я расскажу, как улучшить меню в плане возможностей;)

    Хабра уже имеет за плечами пару туториалов на тему кроссплатформенного 3D движка «Unity 3D», но до сих пор не имеет уроков на тему 3D меню.
    На эту статью меня натолкнул пост Unity3d script basics и .
    Так же пару людей поругалось на автора на тему «Уже не в том веке живём», поэтому вот вам щепоточка знаний.
    Делая этот туториал, я предполагал, что вы уже знакомы с основами JS"a и интерфейса Unity 3D.
    Работать я буду с Виндусовской версией Unity 3D. Обладатели других ОС думаю разберутся.

    Приготовления

    1) Иметь основную мысль на тему меню, так сказать мысленную заготовку.
    2) Нужные вам модели. Можно найти (Google Sketchup). Нужный нам формат - collada.
    3) Иметь шрифт под текст меню. Можно взять стандартные из шрифтов винды.

    Первые шаги

    Я придумал сценку на темы «Вестерн».
    Начнём с приготовления сцены.
    Первым создайте terrain и подберите размер/высоту/качество текстурирования(Terrain->Set Resolution/Flatten Heightmap).
    Дальше подберите текстуру и сделайте основной ландшафт сцены

    После поставьте камеру под нужный угол обзора, добавьте свет(Derectional light) и тени он него же.
    Добавьте туман и небо(skybox), всё это можно найти в Edit->Render Settings.




    Модели

    Для начала разархивируйте скачанный архив, и перенесите все текстуры из images в папку Materials вашего проекта(просто выделите и перетащите на папку в окне unity).
    Дальше импортируйте модель *.dae в Unity (Assets->Import New Asset), и добавьте её на сцену, так же измените размер до вам угодного.
    ВАЖНО! Если вы сделаете не по порядку, то получите незатекстурированную модель.

    Меню Основа

    Меню можно сделать с помощью моделей или 3д текста, а можно и из всего сразу.
    Я расскажу о текстовом варианте, т.к. это попривычнее будет.
    Что бы создать 3д текст со своим шрифтом, нужно добавить его в проект (Assets->Import New Asset).
    После, выделив его, перейти в (GameObjects->Create Other->3D Text).
    У вас создастся мыльный текст. Чтобы повысить качество, поменяйте Font Size, а потом подгоните размер.

    Function OnMouseDown () { //1 if(name=="Play Game") { Application.LoadLevel("Test Scene"); } //2 if(name=="Options") { } if(name=="Quit") { Application.Quit(); } //3 } function OnMouseOver () { //1 animation.Play(); //4 }

    1) События при манипуляции с мышью.
    2) Загрузит сцену под названием Test Scene, если вы укажете её при компиляции проекта(так же можно указать порядковый номер).
    3) Выход из приложения, если оно скомпилировано не под web, или не запускается в редакторе.
    4) Метод анимации меню, если таковое вам хочется (Слишком муторно, поэтому рассказывать не буду. Можно будет посмотреть в моём готовом проекте).
    * name - имя объекта, на котором лежит скрипт.

    Переходы по меню

    Создайте цилиндр, и переименуйте его в Menu. Сделайте его прозрачным, применив любой частично прозрачный материал (можно как на скрине).


    Вложим все наши объекты «3д текст» в объект Menu(окно Hierarchy).

    Так же на другой стороне цилиндра создайте два 3д текста, и переместите их по иерархии в Menu. Это будет подпункт меню.


    Обновим скрипт.

    Var menuRotation: GameObject; //1 function OnMouseDown () { if(name=="Play Game") { Application.LoadLevel("Test Scene"); } if(name=="Options" || name=="Back") { menuRotation.transform.Rotate(0, 180, 0); } //2 if(name=="Quit") { Application.Quit(); } } function OnMouseOver () { animation.Play(); }

    1) Создаст переменную, содержащую объект.
    2) При нажатии на объект с названием Options, команда повернёт объект menuRotation на 180*.

    Перенесите цилиндр в поле Menu Rotation кнопки Options.
    Теперь вы имеем почти готовое меню. Осталось только создать слайдер.

    Слайдеры

    Слайдеры - самая муторная часть урока. Приготовьтесь к страданиям и шаманству.
    *Буду рад, если кто-нибудь выложит свою версию слайдера, т.к. мой на самом деле Шаманский.
    Создайте приметив Cube и растяните его до подобия ниточки. Cоздайте приметив Sphere и поместите его в центре Cube.
    Всё это располагаем противоположно основному меню, а именно к подменю Options.
    *Для удобства я переименовал их в line_slider и sphere_slider.


    Создайте новый скрипт JS, и прицепите его к Sphere(sphere_slider).

    Function OnMouseDrag () { //1 var translation: float = Input.GetAxis ("Mouse X"); //2 transform.Translate(translation, 0, 0); //3 print(transform.position.x.ToString()); //4 }

    1) Событие будет активироваться при нажатии (на Sphere/sphere_slider) и передвижении мыши.
    2) Создаст переменную translation, в которую передаются Х координаты мыши.
    3) Перемещает Sphere/sphere_slider за мышкой.
    ВНИМАНИЕ. Координата, по которой будет двигаться шар, у всех разная (легче всего повернуть его координатой Х / красной стрелкой по траектории движения)
    4) Строка transform.position.x выдаст нам координату, на которой в данный момент находится объект.
    ВНИМАНИЕ. Координата всё так же разная (transform.position.x || y || z; либо поворот Sphere/sphere_slider).

    По выводу в консоль определим минимум и максимум, на который будет двигаться будущий слайдер.

    Как только вы засечёте нужные координаты, обновляйте старый скрипт.

    Function OnMouseDrag () { var translation: float = Input.GetAxis ("Mouse X") * 0.18; //1 if (transform.position.x < min || transform.position.x > < min) { transform.Translate(0.1, 0, 0); } //3 if (transform.position.x > max) { transform.Translate(-0.1, 0, 0); } //3 } else { transform.Translate(translation, 0, 0); } }

    1) Всё так же ловим координату Х, но с коэффициентом, который понижаетувеличивает скорость передвижения шара.
    ВНИМАНИЕ! Так же уникален для каждого пользователя.
    2) Максимум и минимум движения слайдера по осям.
    3) При выходе за пределы координата немного убавляется (во избежание застревания слайдера на месте).
    *меняем min и max на полученные ранее пределы.

    Вот слайдер почти и готов. Осталось только научить его возвращать значение.

    Var bullet: float = 0; //1 function OnMouseDrag () { var translation: float = Input.GetAxis ("Mouse X") * 0.18; if (transform.position.x < min || transform.position.x > max) { //2 if (transform.position.x < min) { transform.Translate(0.1, 0, 0); } //3 if (transform.position.x > max) { transform.Translate(-0.1, 0, 0); } //3 } else { transform.Translate(translation, 0, 0); } bullet = (transform.position.x - min)*250;//2 }

    1) Создаст переменную bullet.
    2) Записывает значения слайдера в переменную bullet.

    Вот и всё. Теперь у вас есть более-менее функционирующее меню Unity 3D.
    То что получилось у меня - тык .
    Благодарю за прочитанный урок.