Skip to content

Instantly share code, notes, and snippets.

Created August 26, 2017 16:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/31d099a169f0b68d45835462a62a327f to your computer and use it in GitHub Desktop.
Save anonymous/31d099a169f0b68d45835462a62a327f to your computer and use it in GitHub Desktop.
Как сделать кнопки в игре

Как сделать кнопки в игре



Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Unity бесподобна для быстрого прототипирования игр. Если у вас появилась идея какой-то новой игровой механики, с Unity её можно реализовать и протестировать в кратчайшие сроки. Под катом я расскажу как можно сделать несложную головоломку используя только стандартные компоненты и не залезая в графические редакторы. По ходу статьи я продемонстрирую пару трюков игрового дизайна, а в конце немного расскажу об эстетике, динамике и механике. Для самых нетерпеливых по ссылкам ниже находится готовый прототип. Двумерную головоломку с колобком в роли главного героя, который может двигать ящики, которые могут нажимать кнопки, которые могут открывать двери, за которыми скрывается выход из уровня, который построил я. Или вы, у нас же здесь туториал как-никак. Подразумевается, что вы уже успели скачать Unity и поигрались немного в редакторе. Сейчас самое время, я подожду. Грубый набросок Я соврал, я не буду ждать. Создаём пустой проект без лишних пакетов и выбираем схему расположения окошек на свой вкус, я буду использовать Tall. Добавляем в иерархию сферу, перетаскиваем на неё главную камеру. Теперь камера будет следовать за нашей сферой, если она вдруг захочет погулять. Не забывайте проверять координаты префабов при создании и использовании, если мы хотим делать игрушку в двух измерениях, то третья ось должна быть выставлена в ноль для всех взаимодействующих объектов. Его координаты не имеют значения, он будет освещать наши объекты одинаково из любого места. Однако, имеет смысл поднять его немного над сценой, чтобы не мешался при выделении объектов, поэтому поставим ему координаты 0;0; К слову о сцене, ось X у нас будет расти слева направо, Y — снизу вверх, а Z — от зрителя вглубь экрана. Покликайте по стрелочкам вокруг кубика в правом верхнем углу сцены и поверните её нужным образом. Одинокая кубическая стена рядом со сферическим колобком не очень-то впечатляет, да? В Unity есть много других полезных горячих клавиш , например зажатый Ctrl ограничивает перемещение объектов единичными интервалами, а клавиша V позволит тягать объект за вершины, и они будут липнуть к вершинам других объектов. Замечательно, не правда ли? И вы всё ещё пишете свой движок? Сообразите что-нибудь похожее на комнату, сохраните сцену, нажмите Play и полюбуйтесь своим творением пару минут. Хорошие гейм-дизайнеры называют это тестированием. Чего-то не хватает, да? Возможно, если я полюбуюсь ещё немного, то… Скрипты и физика Нам нужно больше движения и цвета! Хотя, если ваше суровое детство было наполнено бетонными игрушками, то можно оставить всё как есть. Для всех остальных пришло время скриптов. Я буду приводить примеры на C , но можно писать и на JS или Boo. На самом деле выбирать последние два смысла не имеет, они были добавлены в Юнити скорее как довесок, меньше поддерживаются, хуже расширяются и для них сложнее найти примеры. Особенно ужасен Boo, который по сути является unpythonic Python. Сперва нужно потереть лишний мусор, оставим только нужное. Нажатия кнопок игроком можно получить с помощью класса Input. В комплекте с Unity идут замечательные настройки ввода, достаточно написать Input. Если у игрока подключён геймпад, то он может управлять и с него, нам даже не надо писать лишний код. GetAxis "Horizontal" , Input. GetAxis "Vertical" , 0 ; Такой нехитрой строчкой мы получаем информацию о действиях пользователя и создаём вектор движения. Для того, чтобы вектор куда-нибудь приложить, нам понадобится Rigidbody. Теперь мы можем на него ссылаться в нашём скрипте. AddForce direction ; Функция AddForce имеет несколько интересных вариантов приложения силы , но для начала нам хватит и значений по умолчанию. Сохраняем, жмём Play, тестируем. Эээм, знаете, мне это напомнило тот момент из фильма Inception, где мужик бешено вращал глазами и катился кубарем то по стене, то по потолку. Наверное так он себя чувствовал. Нам нужно запретить вращение и передвижение по оси Z. Выделяем префаб, смотрим на компонент Rigidbody и видим раздел Constraints. Оставляем неотмеченными только первые две галочки X и Y, остальные четыре включаем. Чуть выше снимаем галочку Use Gravity и прописываем Drag равный четырём в разделе об эстетике я расскажу зачем это было сделано. Оно шевелится и не вертится! Но делает это слишком медленно. Добавим одну переменную к нашему скрипту и задействуем её в формуле нашего движения. Весь код будет в итоге выглядеть так: GetAxis "Vertical" , 0 ; rigidbody. Вбиваем в поле тридцатку или что-нибудь на ваш вкус и проверяем в действии. Материалы и коллайдеры Пора уже сделать какую-нибудь кнопку, чтобы было на что нажимать. В инспекторе у коллайдера ставим галочку Is Trigger. Это развоплотит нашу кнопку и заставит другие объекты проходить сквозь неё. У коллайдеров-триггеров есть события OnTriggerEnter и OnTriggerExit , которые вызываются всякий раз, когда что-то пересекает область триггера. На самом деле это не совсем так, ибо есть множество разных объектов и физический движок обрабатывает не все столкновения, подробнее читайте здесь. Для начала просто проверим как работают триггеры. Напишем что-нибудь в консольку Unity. Log очень полезная, кроме текста она также умеет печатать разные игровые объекты. Было бы нагляднее, если бы наша кнопка меняла цвет при нажатии. Для цвета нам нужно прикрепить к кнопке материал. В свойствах материала выберем для Main Color зелёненький. Теперь в скрипте мы можем обращаться к цвету материала с помощью renderer. Заставим кнопку краснеть от вхождения в неё нашего колобка. Если вы ещё не сделали это, то настала пора прибраться в нашем проекте, иначе мы заблудимся в мешанине префабов и скриптов. Знаете, а ведь наша кнопка до сих пор не похожа на кнопку! Давайте её сплющим и заставим продавливаться под колобком. Выберите кнопку в иерархии, сделайте её толщиной в 0. С помощью них можно взаимодействовать с префабом прямо на месте. Нажмите Apply и все кнопки отныне будут плоские и лежачие. Для реализации программной анимации мы будет использовать класс Transform. У него есть свойство localPosition , которое позволит нам двигать кнопку: В целом это выглядит так: Наезд на кнопку вынуждает её нехило колбасить из-за сферического коллайдера колобка, который не всегда будет соприкасаться в утопленной кнопкой. Вспоминаем, что игры наполовину состоят из лжи, а значит размеры коллайдера совсем не обязательно должны совпадать с моделькой. Смотрим в инпекторе свойства коллайдера, учетверяем его размер по оси Z и смещаем его на Двери, ящики и магниты Теперь, когда у нас есть полнофункциональная кнопка, можно заставить её что-нибудь делать. Для того, чтобы как-то воздействовать на дверь, нам нужно иметь ссылку на её объект, поэтому создадим у кнопки новую переменную. Если вы ещё пользуетесь Unity третьей версии, то вам придётся воспользоваться альтернативами. С помощью свойства активности можно прятать объекты не удаляя их. Они как бы пропадают со сцены и их коллайдеры перестают участвовать в расчётах. Прям то, что надо для двери. Приводим код к следующему виду: SetActive false ; transform. SetActive true ; transform. Проверяем код в действии. Наезд колобком на кнопку автомагически растворяет дверь и возвращает её на место после разъезда. Но какой толк нам от кнопки, которая постоянно выключается и запирает нам дверь? Как вы наверное заметили, толкать ящик не очень-то удобно. Кроме того, если он застрянет в углу комнаты, то достать его будет невозможно. Как вариант, мы можем сделать зоны-телепорты по углам комнаты, которые будут перемещать все попавшие в них ящики, но это немного мудрёно. Добавим в PlayerController магнит, который будет притягивать все близлежащие ящики. GetButton в отличие от Input. GetButtonDown будет возвращать true до тех пор, пока нажата запрашиваемая кнопка. То, что нам нужно. GetButton "Jump" Как мы будем находить ящики? Помните ту ссылку на матрицу с разными коллайдерами? К тому же магнит должен работать только по нажатию кнопки, в остальное время он не нужен. Поэтому мы будем вручную проверять столкновения с помощью Physics. Чтобы отсеять лишнее, воспользуемся метками , они нам ещё не раз пригодятся. Выбираем префабы и метим их с помощью выпадающего списка вверху инспектора. Теперь мы можем отсеять нужные нам коробки: Немного математики с векторами, ничего сложного для тех, кто не прогуливал школу. Ящик всё равно нас немного толкает, не не будем сейчас на этом заморачиваться, в движении всё равно это не мешает. Внимательные читатели давно уже заметили один баг кнопки. Внимательные и усердные его уже исправили. Какой же это баг? Если в поле коллайдера попадает два объекта, а потом один объект уходит по своим делам, то срабатывает лишнее выключение кнопки. Нам нужно считать количество колобков и ящиков в области коллайдера и выключать кнопку, когда рядом никого нет, а включать при любом количестве тех и других. К сожалению, в Unity нет списка текущих столкновений. Возможно, у разработчиков ещё не дошли до этого руки. В любом случае это решается парой строчек кода. Мы можем сделать свой список и складывать в него все приходящие объекты, вынимать все уходящие, а состояние кнопки менять в Update. Плохой вариант using UnityEngine; using System. Generic; public class Button: Программирование 2,9k авторов , 6,5k публикаций. Системное программирование авторов , публикации. Тестирование IT-систем авторов , 1,1k публикаций. CSS авторов , 1,2k публикаций. JavaScript 1,9k авторов , 4k публикаций. Совершенный код авторов , публикации. Разработка веб-сайтов 4,1k авторов , 9,6k публикаций. IT-стандарты авторов , публикаций. Семантика авторов , публикаций. Разработка игр 1,2k авторов , 2,9k публикаций. Как правильно использовать переменные в препроцессорах LESS и SASS 5,8k 3. Добавить в закладки Даниил Басманов BasmanovDaniil карма. Спасибо, первый мануал по Unity, который сподвигнул меня к действию. Очень рад, для того и старался. Ещё советую посмотреть catlikecoding. На хабре их не видел, наверное, стоило бы их перевести. По-больше бы таких мануалов и методик по кросс-платформенной разработке приложений на Unity3D! Спешу вас обрадовать, у меня в планах статья о создании сетевой игры. Вот допилю тестовый сервер для хабра до того состояния, когда он не сразу сляжет и опубликую. Да, это практически эталонный туториал — четко, ничего лишнего, все самое важное что бы быстро начать. Видел очень много всего, в т. Автору просьба продолжать в том же стиле! Вот еще годный сайт cgcookie. Спасибо за интересный материал. Когда ж у меня появится время для изучения Unity? Ровно в тот момент как вы его выделите определите что вот этот кусок времени он точно для Unity. Например скАжите тебе — ближайший час я хочу потратить на изучение юнити. Таким образом можно создать время на это прямо сегодня: Спасибо, сегодня я выделил два часа на изучения unity ;. Супер, я рад что сработало. И отличного продвижения в Unity: Выделенное время — решает ps: Но в версии 3. Не работает код door. SetActive false ; Ошибок никаких не выводится. Кнопка меняет цвет при наезде на нее, но с дверью ничего не происходит. На кнопке висит такой код, но дверь не работает? Спасибо за помощь BasmanovDaniil Надо было перетащить на скрипт кнопки дверь не из нижнего окошка Проект , а из верхнего Иерархия. Тогда уж и я отпишусь. В публичных переменных скриптов можно сохранять не только ссылки на объекты, которые находятся на сцене, но и ссылки на префабы, анимации, текстуры и другие объекты проекта. На ссылку, сохранённую в префабе можно рассчитывать, если она ссылается на подчиненный объект. В случае выше в префабе сохранилась ссылка на соседний префаб, что в инспекторе на сцене выглядело совершенно нормально, но активация-деактивация объекта не приводила к видимому результату. Вот такая детективная история. MonoDevelop сам подсказывал при вводе, а в официальной документации уже выпили эту функцию. Да, ее тоже пробовал. Но дело оказалось в другом. Надо было с иерархии дверь перетаскивать. Переделал немного статью, добавил про FixedUpdate, SetActive, переделал код кнопки и перезалил архивы. Он-лайн уроки случайно не пробовали преподавать по Unity? Типо вебинара что ли? Я эту статью дня три только оформлял и печатал, плюс время на программирование. Зато в итоге мой туториал бессмертен, его можно сразу окинуть взглядом, пролистать вперёд, легко скопировать код и т. А онлайн-компонент тоже присутствует, вот он я, туточки, задавайте любые вопросы. Подготовка к выступлению в реальном времени заняла бы неделю-другую, а смысла было бы много меньше. По той же причине не понимаю моды на видео-туториалы по программированию. Чисто текстовое занятие запихивать в неподходящий формат, зачем это нужно? Некоторые ещё и деньги за это берут. Что есть, то есть… Особенно реклама на роликах, их бесполезность и размазанное качество. А онлайн-компонент тоже присутствует, вот он я, туточки, задавайте любые вопросы Хотелось бы подробный туториал по созданию красивого мира импорта сцен из 3D-редакторов и управление движениями анимациями 3D-объектов тоже из 3D-редакторов: Сетевое взаимодействие и экспорт на несколько различных платформ. Желательно сделать пример с сушей и водой, анимацией природы, свет солнце, тени и т. Птицы сетевые клиенты с разных платформ просто летают по уровню. Реально в несколько уроков вписать? Создание красивого мира — неподъёмная тема, на много-много книг хватит. Импорт сцен — зависит от редакторов и форматов, это проще в документации посмотреть. Анимация — это про Mecanim, это можно. Создание 3D игры — сложно, не в пример сложнее двадэшной. Если ещё и по сети, то возникает куча других проблем. А вот переключение камеры это легко, пара строчек кода. Ну не красивого, а просто 3D-модель из внешнего редактора. Импорт сцен — подскажите, где лучше смотреть ссылку. Если ещё и по сети, то возникает куча других проблем Это каких? Сокет-сервер или что-то более глубокое в рамках Unity3D? Интересно разобраться в экспорте одного и того же приложения для Web, PC, Android, iPhone, WindowsPhone, и т. Насчёт моделей из внешнего редактора можете начать отсюда. Суша , вода , источники света. Проблем с сетевыми играми масса. Предположим, мы забыли про самописный сервер и взяли стандартный из коробки. Как синхронизировать действия игроков? Клиент отправляет своё положение, сервер раздаёт всем остальным. Клиенты стали посылать подложные пакеты, чтобы получить преимущество. Теперь нам приходится симулировать часть игрового мира на сервере и проверять получаемые значения. Ну теперь-то точно работает, да? Игрок совершенно точно видит, как простреливает голову из базуки другому игроку, но из-за большого пинга он видит устаревшее положение жертвы, а значит сервер не засчитает фраг. Теперь нам нужно заниматься предсказыванием движения и сглаживанием рваных координат игроков. А если игрок прерывает игру, что делать с его персонажем? А если во время игры могут присоединяться новые люди? В каждой конкретной игре будут свои причудливые вопросы, над которыми можно долго ломать голову. Про мультиплатформу советую даже не думать, пока вы не разберётесь в основах Unity. Но вообще на хабре видел статьи, подходящие под ваше описание, поищите на хабе Unity. Нашел видео уроки на русском: Метки лучше разделять запятой. Первая российская материнская плата массового сегмента 23,5k Интересные публикации Хабрахабр Geektimes. Проблема непрерывной защиты веб-приложений. Взгляд со стороны исследователей и эксплуатантов. Исследование устойчивости национальных сегментов сети. Cолнце и ветер стали самыми дешевыми источниками энергии GT. W3C всё-таки одобрил стандарт DRM для HTML5 GT. Как я боролся с комарами. Личный опыт и тесты на себе GT. Neuralink — Будущее, которое сложно себе представить. Вы будете его частью GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Поделиться новостью:


Vudu Читай пост keltar а, сто процентов оно! Одновременное нажатие нескольких кнопок в игре Поделиться. Vudu Постоялец www 11 фев. Можно ли както сделать чтобы в игре работало большее количство кнопок. Хочется сделать многопользовательскую игру для одного компьютера. FDsagizi Постоялец www 11 фев. Вариант подключить мышь к игре или джостики хотя насчет 2х джостиков невкурсе. Лечится применением нормальной клавиатуры: У разных клавиатур уверенно распознаваемые комбинации могут различаться, поэтому при проектировании наобходимо исходить из гарантррованного минимума: CStalker Постоялец www 11 фев. Очень неприятный баг при проектировании игры для нескольких человек за одной клавиатурой. Lion Постоялец www 11 фев. Suslik Модератор www 12 фев. Lion Постоялец www 12 фев. Войти Участники Каталог сайтов Категории Архив новостей.


https://gist.github.com/4066784a3290fb0c84e44ed5d90808a9
https://gist.github.com/e20b5ca15b11983b8ab4d250ac07f3e9
https://gist.github.com/97090f0dc0af36eb28b34f37820075c9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment