Реализация одного очень интересного тестового задания:
##ТЗ: Реализовать игру «Шарики» с использованием Unity3D (версия 4+).
###Уровень сложности 1: Целью игрока является набор очков за счет «хлопанья» шариков, двигающихся сверху вниз экрана. «Хлопанье» происходит простым нажатием на экран в зону круга, после чего он пропадает. Шарики двигаются без ускорения, с постоянной скоростью, которая зависит от его размера (чем он меньше, тем быстрее падает).
За «хлопанье» каждого шарика дается определенное колво очков, которое так же зависит от его размера (чем меньше он – тем больше очков). Таким образом, маленькие шарики игроку «хлопать» тяжелее, но очков за них дается больше. Скорость и размер шарика генерируется при его создании. Размер генерируется случайным образом в некотором промежутке. На основе размера уже формируется скорость и количество даваемых за очков «хлопанье» шарика.
Игровой экран представлен фоном на ваше усмотрение, в левом нижнем углу счетчик очков и таймер. Шарики начинают падать сверху вниз сразу после старта приложения (т.е. интерфейс старта или окончания игры не обязателен, но может быть сделан по желанию), при этом падают они не с какойто конкретной точки, а появляются случайным образом вдоль всей верхней границы экрана, но с условием, что круг полностью вмещается в экран. При достижении нижней границы экрана шарики исчезают, не давая очков. Так же необходимо, чтоб шарики генерировались случайного цвета и со временем их появлялось все больше, и базовые скорости увеличивались (как в тетрисе, т.е. имеет место повышение уровня сложности).
Необходимым условием является получение игрового контента из бандлов.
Сами шарики, эффекты, возможные звуки/музыка для игры должны выкачиваться из сети в бандлах (Unity bundles) с использованием класса WWW. Допустимо выкачивание из папки в директории игры, т.к. сути это не меняет. Логического завершения игра не имеет, т.е. условия проигрыша и выигрыша не установлены. Скорость генерации, скорость падения, размеры и спектр цветов кругов остаются на ваше усмотрение.
###Уровень сложности 2: Суть задания остается той же. Разница состоит в том, что шарики должны содержать генерируемые в режиме реального времени текстуры. Генерации подлежат размер и цвет текстуры (необходимый минимум - заливка. Градиент или рисунок по желанию, будет зачтен как плюс к заданию). Допустимые разрешения 32х32, 64х64, 128х128 и 256х256. Текстуры большего разрешения должны присваиваться кружкам большего размера и наоборот. Основная сложность заключается в том, что текстуры должны не только динамически создаваться, но и корректно отгружаться, освобождая память, когда становятся ненужными т.е. необходимо реализовать менеджер ресурсов, который будет последовательно генерировать текстуры, использовать в кружках определенные цвета и размеры, после чего удалять их и создавать новые сеты текстур взамен старых. Создавать текстуры стоит постепенно прямо во время игрового уровня, но в момент смены уровня сложности на следующий реализовывать подмену одного сета на другой, с отгрузкой предыдущего. Таким образом будут минимизированы возможные тормоза.
#Реализация: Проявил немного самодеятельности. Из тех бонусов, что не видны снаружи:
- Всё объекты в игре (даже новый UI) сгенерированы и настроены процедурно, кроме 2 текстур, что я загружаю из ассетбандлов, согласно ТЗ. Я раньше, не работал с генерацией объектов из кода, так что решил, что это замечательный вариант, для устранения пробелов.
- Реализован пул для шариков и хватает всего 16-ти. Попадая в очередь, шарики заново обновляют свои рандомные параметры: генерация текстур и координат по оси x и z в пределах квадрата. От z зависит скорость. А размер на экране уменьшается сам-собой за счёт перспективы, так что все они одного размера.
- От rigitbody отказался за ненадобностью (что очевидно) и от всех лишних коллайдеров и коллизий тоже (кроме, конечно, рейкаста по шарам)
- постарался все параметры вытянуть в главный скрипт, избавиться от лишних констант с помощью зависимостей
- сильно заморочился на разработке архитектуры (на это ушли первые 6 часов с момента получения ТЗ), но результат мне нравится.
- в генерации наборов текстур, также планирую добавить пул