Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Классический пинбол, как в древнем игровом автомате или в компактной игрушке: есть пружины, шарики и препятствия. В нашем варианте можно не только зарабатывать очки: чтобы пройти уровень, придется выполнить дополнительную миссию.

Пинбол Пикабу

Аркады, На ловкость, Казуальные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Unity + Программирование

С этим тегом используют

Gamedev Разработка Инди Инди игра Игры YouTube Компьютерные игры IT Программист IT юмор Python Картинка с текстом Юмор Все
299 постов сначала свежее
5
velskboy
velskboy
1 год назад
Лига Разработчиков Видеоигр

История шиткодера игродела!⁠⁠

Меня зовут velskboy и я ношу гордое название шиткодера. В этой серии постов я буду писать о том, как продвигается разработка моей мобильной игры. Что бы вы понимали какого уровня будет контент я сразу опишу вводные моего, кхе, "опыта":
1. У меня не техническое образование (фельдшер)
2. С айти я связан только тем что пытался закодировать батю
3. На момент старта игры в юнити я мог создать только новую сцену и пустой объект
4. Из С# я знал, что byte жрет меньше памяти чем int (эти знания я не использовал)
5. К моменту написания сего вводного поста игра разрабатывается уже месяц, каждый вечер по паре часов.
6. Я делаю абсолютно всё один. И прогаю, и рисую, и пенисы пинаю
7. Юзаю чатгпт, конечно же.

Хотя должен вам сознаться, что уже я...

История шиткодера игродела! Игры, Компьютерные игры, Gamedev, Программирование, Unity, Инди, Разработка, Мобильные игры, Гифка, Длиннопост

Слегка исказил истину

Небольшой опыт программирования был, но он был на питоне и с использованием Vk api и SQLite (сделал бота для настолок по моему сеттингу, хотел что бы игроки могли написать /стрельба и бот сам считал результат исходя из вбитых в БД значений), но вряд ли он сильно мне помог.

Далее:
Я не хочу этой игрой заработать (нет, хочу, конечно, но не рассчитываю).
Я ее делаю развлечения ради.
В игре нет никакого глубокого смысла или логической концовки, это будет банальный таймкиллер с мини играми и кучей лута.

История шиткодера игродела! Игры, Компьютерные игры, Gamedev, Программирование, Unity, Инди, Разработка, Мобильные игры, Гифка, Длиннопост

ХА ХА ДА БОЛЬШЕ ЛУТА СЮДА ЛУУУУТ (кадры из игры, да)

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

Показать полностью 2
[моё] Игры Компьютерные игры Gamedev Программирование Unity Инди Разработка Мобильные игры Гифка Длиннопост
2
1
NutrientElement
NutrientElement
1 год назад
Лига программистов
Серия Программирование

Куда копать для того чтобы начать разрабатывать игры на JavaScript⁠⁠

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

Куда копать для того чтобы начать разрабатывать игры на JavaScript Программирование, Unreal Engine, IT, Unity, Программист, Разработка, Игры, Gamedev

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

Например:

  • PixiJS - это 2D-рендерер WebGL, который позволяет эффективно отрисовывать 2D-сцены и объекты1.

  • ExcaliburJS - это полноценный игровой фреймворк, написанный на TypeScript, который предоставляет систему сцен и камер, спрайты и анимации, звуки, физику и т.д.1.

  • Unity - это самый популярный игровой движок в мире, который поддерживает C# и JavaScript для создания 2D и 3D игр для разных платформ23.

  • Phaser - это быстрый и удобный фреймворк для создания HTML5 игр с использованием Canvas и WebGL.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью
[моё] Программирование Unreal Engine IT Unity Программист Разработка Игры Gamedev
5
0
Anatoly.Shapov
1 год назад
Unity

Unity SteamVR⁠⁠

Мне нужно реализовать физику вагонетки. То есть вагонетка должна двигаться только по определённому пути. Но это не всё, само по себе вагонетка двигаться не должна, она должна двигаться например когда мы её толкнули и в зависимости от силы толчка, вагонетка едет с разной скоростью. Пытался найти как это сделать, но не смог, подскажите пожалуйста, как это можно реализовать?

[моё] Unity Разработка Программирование Steam Игры Текст
2
Аноним
Аноним
1 год назад

Посоветуйте пожалуйста фундаментальных курсов по Юнити [2]⁠⁠

Спасибо Пикабу, что обрезал бо́льшую часть поста Посоветуйте пожалуйста фундаментальных курсов по Юнити

Дублирую:

Всем привет! Знаю, таких постов уже было много, но попытаю удачу. Прошу помощи в поисках курсов и материалов по работе с Юнити. Планирую вкатываться с С++ (джун) в С#. Что касается Юнити, то больше интересует "техническая" сторона в плане:

  1. Почему и зачем для каждого создается отдельный класс

  2. Иерархия, что от чего наследуется (например канвас -> UI и тд)

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

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

Нужен совет Обучение Программирование Unity Unity3D Разработчики игр Csharp Текст
5
AliseDavydova
AliseDavydova
1 год назад

Ищу ребят в команду⁠⁠

в общем я делаю свою игру и хочу найти ребят в свою команду так как одному будет сложно работать, СРАЗУ скажу зарплаты не будет! деньги будем получать (если вообще будем) с донатов в вк и скачиваний игры
В КОМАНДУ НУЖНЫ:
программист 1 или 2
2д художник окружения
2д художник персонажей
и один 3д моделлер
вк студии:https://vk.com/club222708923
вк игры: https://vk.com/club222708136

3D моделирование Персонажи Blender 2D Компьютерная графика Поиск работы Работа Бесплатно Игры Компьютерные игры Программист Программирование Команда Gamedev Разработка Инди Инди игра ВКонтакте Unreal Engine Unity Текст
13
1
AppFox
AppFox
1 год назад

Оптимизация работы с сетью с использованием библиотеки OkHttp и Retrofit⁠⁠

Современные приложения, особенно мобильные, часто требуют обмена данными с удаленными серверами. Это может быть запрос к веб-сервису для получения информации или отправка данных на сервер. Оптимизация этого процесса играет важную роль в производительности и удобстве работы пользователей. В этой статье мы рассмотрим, как использовать библиотеки OkHttp и Retrofit для эффективной работы в Интернете.

Оптимизация работы с сетью с использованием библиотеки OkHttp и Retrofit Инновации, IT, Разработка, Программирование, Технологии, Программист, Python, Unity, Linux

Зачем нужны OkHttp и Retrofit

Прежде чем погрузиться в детали, давайте разберемся, почему OkHttp и Retrofit так важны для работы в Интернете. OkHttp - это современная библиотека для обработки HTTP-запросов, предоставляющая множество возможностей, включая поддержку HTTP/2, кэширование, переподключение и многое другое. Retrofit, в свою очередь, обеспечивает удобное создание REST-клиента на основе интерфейса, что делает код более читабельным и уменьшает его размер.

Установка и настройка библиотек

Прежде чем начать использовать OkHttp и Retrofit, необходимо установить и настроить их в своем проекте. Для этого необходимо добавить соответствующие зависимости в файл build.gradle. После этого необходимо выполнить начальную настройку, указав базовый URL для Retrofit и, при необходимости, добавить перехватчики для OkHttp, которые могут добавлять заголовки или выполнять другие операции перед отправкой запросов.

Создание запросов с помощью Retrofit

Одним из ключевых преимуществ Retrofit является возможность создания запросов с использованием интерфейсов. Мы определяем методы в интерфейсе, а Retrofit автоматически генерирует код для выполнения запросов. Это делает код более чистым и понятным. Кроме того, аннотации Retrofit могут быть использованы для настройки запросов, например, для указания URL, метода запроса, параметров и даже для разбора ответов в формате JSON.

Оптимизация производительности сети с помощью OkHttp

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

Обработка ошибок

При работе с сетью важно учитывать возможные ошибки. Retrofit позволяет определить, какие ошибки считаются успешными, а какие - нет. Это позволяет более точно отрабатывать различные сценарии, например, отсутствие подключения к Интернету или недоступность сервера.

Параллельные запросы и управление потоком

Для повышения производительности приложения мы можем использовать параллельные запросы с помощью Retrofit и OkHttp. Это позволяет выполнять несколько запросов к серверу одновременно, ускоряя загрузку данных. Также для более эффективной обработки асинхронных операций можно использовать управление потоками, например RxJava или Kotlin Coroutines.

Тестирование сетевых запросов

И последнее, но не менее важное, тестирование сетевых запросов. Мы можем использовать такие инструменты, как MockWebServer, для создания симуляции сервера и тестирования различных сценариев. Это позволяет обнаружить и устранить проблемы до того, как приложение будет запущено в производство.

Оптимизация работы с сетью с помощью библиотеки OkHttp и Retrofit может значительно повысить производительность и надежность приложения. Понимание основных концепций и правильное использование этих библиотек поможет создать более эффективные и отзывчивые приложения

Показать полностью 1
[моё] Инновации IT Разработка Программирование Технологии Программист Python Unity Linux
0
7
FellowPablo
FellowPablo
1 год назад
Лига Разработчиков Видеоигр

Катастрофа для инди разработчиков, которые используют Unity⁠⁠

[моё] Unity Unity3D Gamedev Инди Разработка Новости Программирование Видео Вертикальное видео
76
569
monobogdan
monobogdan
1 год назад
TECHNO BROTHER

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб?⁠⁠

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Многие программисты так или иначе имеют тягу и интерес к разработке игр. Немалое количество спецов было замечено за написанием маленьких и миленьких игрушек, которые были разработаны за короткое время «just for fun». Большинству разработчиков за счастье взять готовый игровой движок по типу Unity/UE и попытаться создать что-то своё с их помощью, особенно упорные изучают и пытаются что-то сделать в экзотических движках типа Godot/Urho, а совсем прожжённые ребята любят писать игрушки… с нуля. Таковым любителем писать все сам оказался и я. И в один день мне просто захотелось написать что-нибудь прикольное, мобильное и обязательно — двадэшное! В этой статье вы узнаете про: написание производительного 2D-рендерера с нуля на базе OpenGL ES, обработку «сырого» ввода в мобильных играх, организацию архитектуры и игровой логики и адаптация игры под любые устройства. Интересно? Тогда жду вас в статье!

❯ Как это работает?



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

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост


Один из прошлых проектов — 3D шутэмап под… коммуникаторы с Windows Mobile без видеоускорителей! Игра отлично работала и на HTC Gene, и на QTek S110!

В больших студиях принято всю нагрузку распределять на целые команды разработчиков. Артовики занимаются графикой, звуковики — музыкой и звуковыми эффектами, геймдизайнеры — продумывают мир и геймплей будущей игры, а программисты — воплощают всё это в жизнь. Однако, за последние 20 лет появилось довольно большое количествобесплатныхинструментов, благодаря которым маленькие команды или даже разработчики-одиночки могут разрабатывать собственные игры сами!

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Подобные инструменты включают в себя как довольно функциональныеконструкторы игр, которые обычно не требуют серьёзных навыков программирования и позволяют собирать игру из логических блоков, так и полноценных игровых движков на манер Unity или Unreal Engine, которые позволяют разработчикам писать игры и продумывать их архитектуру самим. Можно сказать что именно «благодаря» доступности подобных инструментов мы можем видеть текущую ситуацию на рынке мобильных игр, где балом правят очень простые и маленькие донатные игрушки, называемыегиперкежуалом.

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

  • Большой вес приложения: При сборке, Unity и UE создают достаточно объёмные пакеты из-за большого количества зависимостей. Таким образом, даже пустой проект может спокойно весить 50-100 мегабайт.

  • Неоптимальная производительность: И у Unity, и у UE очень комплексные и сложные рендереры «под капотом». Если сейчас купить дешевый смартфон за 3-4 тысячи рублей и попытаться на него накатить какой-нибудь 3 в ряд, то нас ждут либо вылеты, либо дикие тормоза.



Лично я для себя приметил ещё один минус — невозможность деплоить игры на устройства с старыми версиями Android, но это, опять же, моя личная хотелка.

Поэтому когда мне в голову пришла мысль сделать игрушку, я решил написать её с нуля — не используя никаких готовых движков, а реализовав всё сам — и игровую логику, и сам «движок» (правильнее сказать фреймворк). Не сказать, что в этом есть что-то очень сложное — в геймдеве есть отдельная каста «отшельников», которые называют себя «движкописателями» и пишут либо движки, либо игры — правда, не всегда хотя-бы одна игра доходит до релиза.

❯ Определяемся с задачами



Перед тем, как садится и пилить игрушку, нужно сразу же определится с целями и поставить перед собой задачи — какой стек технологий мы будет использовать, как будем организовать игровую логику, на каких устройствах игра должна работать и.т.п. Я прикинул и решил реализовать что-то совсем несложное, но при этом достаточно динамичное и забавное… 2D-шутер с видом сверху!

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Игра будет написана полностью на Java — родном языке для Android-приложений. Пустые пакеты без зависимостей весят всего около 20 килобайт — что только нам на руку! Ни AppCompat, ни какие либо ещё библиотеки мы использовать не будем — нам нужен минимальный размер из возможных!

Итак, что должно быть в нашей игре:

  • Основная суть: Вид сверху, человечком по центру экрана можно управлять и стрелять во вражин. Цель заключается в том, чтобы набрать как можно больше очков перед тем, как игрока загрызут. За каждого поверженного врага начисляются баксы, за которые можно купить новые пушки!

  • Оружие: Несколько видов вооружения, в том числе пистолеты, дробовики, автоматы и даже пулеметы! Всё оружие можно купить в внутриигровом магазине за валюту, которую игрок заработал во время игры

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

  • Уровни: Можно сказать, простые декорации — на момент написания статьи без какого либо интерактива.



Поскольку игра пишется с нуля, необходимо сразу продумать необходимые для реализации модули:

  • Графика: Аппаратно-ускоренный рендерер полупрозрачных 2D-спрайтов с возможность аффинных трансформаций (поворот/масштаб/искривление и.т.п). На мобильных устройствах нужно поддерживать число DIP'ов (вызовов отрисовки) как можно ниже — для этого используется техника батчинга. Сам рендерер работает на базе OpenGLES 1.1 — т.е чистый FFP.

  • Ввод: Обработка тачскрина и геймпадов. Оба способа ввода очень легко реализовать на Android — для тачскрина нам достаточно повесить onTouchListener на окно нашей игры, а для обработки кнопок — ловить события onKeyListener и сопоставлять коды кнопок с кнопками нашего виртуального геймпада.

  • Звук: Воспроизведение как «маленьких» звуков, которые можно загрузить целиком в память (выстрелы, звуки шагов и… т.п), так и музыки/эмбиента, которые нужно стримить из физического носителя. Тут практически всю работу делает за нас сам Android, для звуков есть класс — SoundPool (который, тем не менее, не умеет сообщать о статусе проигрывания звука), для музыки — MediaPlayer. Есть возможность проигрывать PCM-сэмплы напрямую, чем я и воспользовался изначально, но с ним есть проблемы.

  • «Физика»: Я не зря взял этот пункт в кавычки :) По сути, вся физика у нас — это один метод для определения AABB (пересечения прямоугольник с прямоугольником). Всё, ни о какой настоящей физике и речи не идет :)



Поэтому, с учетом требований описанных выше, наша игра будет работать практически на любых смартфонах/планшетах/тв-приставках кроме китайских смартфонов на базе чипсета MT6516 без GPU из 2010-2011 годов. На всех остальных устройствах, включая самый первый Android-смартфон, игра должна работать без проблем. А вот и парк устройств, на которых мы будем тестировать нашу игру:

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



С целями определились, самое время переходить к практической реализации игры! По сути, её разработка заняла у меня около дву-трех дней — это с учетом написания фреймворка. Но и сама игра совсем несложная :)

❯ Рендерер



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

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

По сути, в современном мире, 2D — это частный случай 3D, когда рисуются всё те же примитивы в виде треугольников, но вместо перспективной матрицы, используется ортографическая матрица определенных размеров. Во времена актуальности DirectDraw (середина-конец 90х) и Java-телефонов, графику обычно не делали адаптивной, из-за чего при смене разрешения, игровое поле могло растягиваться на всю площадь дисплея. Сейчас же, когда разброс разрешений стал колоссальным, чаще всего можно встретить два подхода к организацию проекции:

  • Установка ортографической матрицы в фиксированные размеры: Если координатная система уже была завязана на пиксели, или по какой-то причине хочется использовать именно её, то можно просто завязать игру на определенном разрешении (например, 480x320, или 480x800). Растеризатор формально не оперирует с пикселями — у него есть нормализованные координаты -1..1 (где -1 — начало экрана, 0 — середина, 1 — конец, это называется clip-space), а матрица проекции как раз и переводит координаты геометрии в camera-space координатах в clip-space — т.е в нашем случае, автоматически подгоняет размеры спрайтов из желаемого нами размера в физический. Обратите внимание, физические движки обычно рассчитаны на работу в метрических координатных системах. Попытки задавать ускорения в пикселях вызывают рывки и баги.

  • Перевод координатной системы с пиксельной на метрическую/абстрактную:
    Сейчас этот способ используется чаще всего, поскольку именно его используют самые популярные движки и фреймворки. Если говорить совсем просто — то мы задаем координаты объектов и их размеры не относительно пикселей, а относительно размеров этих объектов в метрах, или ещё какой-либо абстрактной системы координат. Этот подход близок к обычной 3D-графике и имеет свои плюшки: например, можно выпустить HD-пак для вашей игры и заменить все спрайты на варианты с более высоким разрешением, не переделывая половину игры.



Для совсем простых игр я выбираю обычно первый подход. Самое время реализовать главный метод всего рендерера — рисование спрайтов. В моём случае, спрайты не были упакованы в атласы (одна текстура, содержащая в себе целую анимацию или ещё что-то в этом духе), поэтому и возможность выборки тайла из текстуры я реализовывать не стал. В остальном, всё стандартно:

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост
Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

Всё более чем понятно — преобразуем координаты спрайта из world-space в camera-space, отсекаем спрайт, если он находится за пределами экрана, задаем стейты для GAPI (на данный момент, их всего два), заполняем вершинный буфер геометрией и рисуем на экран. Никакого смысла использовать VBO здесь нет, а на nio-буфферы можно получить прямой указатель без лишних копирований, так что никаких проблем с производительностью не будет. Обратите внимание — вершинный буфер выделяется заранее — аллокации каждый дравколл нам не нужны и вредны.

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

Обратите внимание на вызовы ByteBuffer.order — это важно, по умолчанию, Java создаёт все буферы в BIG_ENDIAN, в то время как большинство Android-устройств — LITTLE_ENDIAN, из-за этого можно запросто накосячить и долго думать «а почему у меня буферы заполнены правильно, но геометрии на экране нет!?».

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



В процессе разработки игры, при отрисовке относительно небольшой карты с большим количеством тайлов, количество вызовов отрисовки возросло аж до 600, из-за чего FPS в игре очень сильно просел. Связано это с тем, что на старых мобильных GPU каждый вызов отрисовки означал пересылку состояния сцены видеочипу, из-за чего мы получали лаги. Фиксится это довольно просто: реализацией батчинга — специальной техники, которая «сшивает» большое количество спрайтов с одной текстурой в один и позволяет отрисовать хоть 1000, хоть 100000 спрайтов в один проход! Есть два вида батчинга, статический — когда объекты «сшиваются» при загрузке карты/в процессе компиляции игры (привет Unity) и динамический — когда объекты сшиваются прямо на лету (тоже привет Unity). На более современных мобильных GPU с поддержкой GLES 3.0 есть также инстансинг — схожая технология, но реализуемая прямо на GPU. Суть её в том, что мы передаём в шейдер параметры объектов, которые мы хотим отрисовать (матрицу, настройки материала и.т.п) и просим видеочип отрисовать одну и ту же геометрию, допустим, 15 раз. Каждая итерация отрисовки геометрии будет увеличивать счетчик gl_InstanceID на один, благодаря чему мы сможем расставить все модельки на свои места! Но тут уж справедливости ради стоит сказать, что в D3D10+ можно вообще стейты передавать на видеокарту «пачками», что здорово снижает оверхед одного вызова отрисовки.

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Для загрузки спрайтов используется встроенный в Android декодер изображений. Он умеет работать в нескольких режимах (ARGB/RGB565 и.т.п), декодировать кучу форматов — в том числе и jpeg, что положительно скажется на финальном размере игры.

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

На этом реализация рендерера закончена. Да, все вот так просто :)
Переходим к двум остальным модулям — звук и ввод.

❯ Звук и ввод



Как я уже говорил, звук я решитл реализовать на базе уже существующей звуковой подсистемы Android. Ничего сложного в её реализацир нет, можно сказать, нам остаётся лишь написать обёртку, необходимую для работы. Изначально я написал собственный загрузчик wav-файлов и хотел использовать AudioTrack — класс для воспрозизведения PCM-звука напрямую, но мне не понравилось, что в нём нет разделения на источники звука и буферы, из-за чего каждый источник вынужден заниматься копированием PCM-потока в новый и новый буфер…

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Полная реализация звукового потока выглядит так. И да, с SoundPool нет возможности получить позицию проигрывания звука или узнать, когда проигрывание закончилось. Увы.

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

Да будет звук! Ну и про ввод не забываем (листинг получился слишком длинный, а на Пикабу нет тега для кода - так что как-то так):

public static final int TOUCH_IDLE = 0; public static final int TOUCH_PRESS - Pastebin.com

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

public class Joystick { private Sprite joySprite; public float Veloc - Pastebin.com

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

Основа для игры есть, теперь переходим к её реализации!

❯ Пишем игру

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



Писать игру я начал с создания первого уровня и реализации загрузчика уровней. В качестве редактора, я выбрал популярный и широко-известный TileEd — удобный редактор с возможностью экспорта карт в несколько разных форматов. Я лично выбрал Json, поскольку в Android уже есть удобный пакет для работы с этим форматом данных.

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

Карта делится на 3 базовые понятия: тайлы — фон, с изображением травы/асфальта/земли и.т.п, пропы — статичные объекты по типу деревьев и кустов и сущности — объекты, участвующие в игровом процессе, т.е игрок, зомби и летящие пули. Система сущностей реализована в виде абстрактного базового класса, который реализовывает логику апдейтов, просчитывает Forward-вектор и выполняет другие необходимые задачи:

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

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

@Override public void update() { super.update(); joyInp - Pastebin.com

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост



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

Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост
Сам написал, сам поиграл: Как я написал 2D-игру для Android полностью с нуля, весом менее 1мб? Gamedev, Инди, Инди игра, Unity, 2D, Android, Разработка, Программирование, Графика, Девайс, Гаджеты, Opengl, Gles, Видео, Без звука, Длиннопост

❯ Что у нас есть на данный момент?



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


Как мы видим, игра (а пока что — proof of concept) работает довольно неплохо на всех устройствах, которые были выбраны для тестирования. Однако это ещё не всё — предстоит добавить конечную цель игры (набор очков), магазин стволов и разные типы мобов. Благо, это всё реализовать уже совсем несложно :)

❯ Заключение



Написать небольшую игрушку с нуля в одиночку вполне реально. Разработка достаточно больших проектов конечно же требует довольно больших человекочасов, однако реализовать что-то своё, маленькое может и самому!

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

Статья подготовлена при поддержке компании TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud, чтобы не пропускать новые статьи каждую неделю!
Но тут я даже чутка навру - на этой неделе вас ждёт сразу две статьи :) Следующая - в четверг, прошлую неделю я отдыхал и работал.

Показать полностью 19 3
[моё] Gamedev Инди Инди игра Unity 2D Android Разработка Программирование Графика Девайс Гаджеты Opengl Gles Видео Без звука Длиннопост
88
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии