У этого поста есть дубликат: http://pikabu.ru/story/delaem_tuntsa_1_4487033 - было бы здорово, наверное, если бы админы его удалили. Я вчера просто забыл прикрепить пост к сообществу, но всё таки он должен быть именно здесь, в Лиге.
Ну что же, раз два человека высказали заинтересованность, как и обещал, пишу пост о том, как сделать на Unity3D простенькую игру, вроде того самого Тунца, который, кстати, уже зарелизился не только для Андроида, но и для Виндовсфона, вот ссылки:
https://play.google.com/store/apps/details?id=com.FRN.tuna
https://www.microsoft.com/ru-ru/store/p/tuna/9nblggh4td3k
На этом хватит саморекламы, перейдем к тому, что, возможно, будет интересно тем пикабушникам, которые хотят начать делать игры на Unity3D, но не знают как, не знают, с чего начать, не знают, где искать обучающие материалы. Тем же, кто имеет опыт создания игр, вряд ли будет интересно читать дальнейшее, ну разве что покритикуете меня и расскажете мне, глупому, как же надо делать на самом деле. :)
Для меня это первый опыт написания каких-то примеров, уроков по Юнити, так что пинайте меня ногами, тыкайте меня носом в мои ошибки (но не слишком больно).
Будем делать так: я создам в Юнити новый проект и заново сделаю игру. Правда, у меня уже заготовлены и скрипты и префабы и графика, так что я всё сделаю быстро. Вам же я не дам заготовок, ибо считаю, что намного полезнее самому набрать код, создать объекты и всё настроить, чем взять готовенький архивчик и оп-ля - урок пройден. Дело не обойдется одной статьей, хотя игра простенькая и маленькая. Будет их 3 или 4. А может и 5. Вообще первый будет рассказывать о том, как сделать скроллинг фонов в игре и будет он пробным, понравится ли, может быть что-то по-другому делать, всё по другому делать или вообще прекратить - жду отзывов и критики, короче говоря. Итак:
1. Идея
Будем считать, что Юнити у нас уже есть, установлено, мы зарегистрированы и т.д. и т.п., то есть можем запускать среду разработки и разрабатывать. Но, конечно же, игра начинается с идеи, с желания сделать что-то определенное, в определенном жанре. С Тунцом у меня всё было просто - еще на этапе первоначального знакомства захотелось сделать что-то вроде Корявой Птички, но немного другое, чтобы надо было не только уворачиваться, но и ловить, чтобы объекты на экране были не статичные, а движущиеся и... и... и еще что-нибудь, в результате раздумий над этим что-нибудь родилась идея перенести действия игры из воздуха под воду и единственным действием персонажа сделать не взлёт, а нырок.
2. Реализация
Как уже говорилось выше, я не стану рассказывать, где скачать и как установить Unity3D.
Мы сразу создаем 2D-проект и начнем делать игру. С чего же начать? Ну раз наш персонаж и все прочие в этой игре плывут в море, то очевидно, что с воды, дна и самого персонажа. Вам нужно нарисовать текстуры для воды и дна и спрайт для персонажа. Итак, у нас созданы текстуры, я импортировал их в Юнити (просто бросайте файлы драг-н-дропом в Assets и потом переключайте у них Texture Type со Sprite на Texture) и расположил эти текстуры на сцене.
Красота! Но наш персонаж будет постоянно плыть по морю, то есть волны должны двигаться, да и песок на дне. Поэтому придется сделать скроллинг нашим текстурам.
Для этого создаем на сцене объект типа Quad:
Однако, волны так никуда и не плывут. Нужно продолжать. Берем мышкой одну из текстур и тащим ее на список компонентов нашего Quad, а точнее на компонент MeshRenderer и бросаем там. Получается вот что:
Пожалуй, стоит удалить текстуры, которые мы набросали до этого в сцену. Без ниж картина следующая:
Мелко как-то получилось, ну так возьмем и увеличим, поменяем значения Scale у нашего Quad (кстати, значение Scale по y на картинке у меня слишком большое, я его потом поменял на 10):
Ох, страсть то какая, ужасно выглядит, наверное, нужно сменить шейдер. Меняем шейдер со стандартного на Sprites-Diffuse:
И получаем уже что-то более-менее похожее на море и волны, а теперь проделываем всё это для второй текстуры волн и песка и видим уже что-то прямо таки похожее на сцену игры:
Небольшое пояснение: у нас будут волны, которые как бы между персонажем и нами и волны, которые за персонажем. А так же песок, до которого персонаж сможет опускаться. Нам нужно расположить песок на переднем плане, волны которые между персонажем и нами - за песком, а уже за ними - еще одни волны. А персонаж наш окажется между волнами. Для этого мы просто меняем координату Z в Position у компонента Transform нашего Quad. Песку поставим, например, 1, вторым волнам 1, а у первых волн пусть остается 0. Пора бы бросить в это море нашего тюленя!
Выбираем наш Quad и видим, что в нем есть некоторые компоненты. Нам не понадобится компонент Mesh Collider, поэтому удаляем его:
И вот я импортировал спрайт и бросил его в сцену, но тюленя не видно. Вода его полностью закрывает. Сделаем воду достаточно прозрачной, чтобы тюлень был виден - для этого идем у волн в компонент Shader и в нем жмем в Tint и меняем значение альфа-канала:
Итак, мы сделали воду достаточно прозрачной и тюлень стал виден, когда он всплывёт на поверхность, будет видна граница воды на его тельце, а так же дальние волны у нас отличаются оттенком от передних. Отлично. Теперь нужно сделать, чтобы волны двигались. Для этого создаем в Quad новый компонент - скрипт:
Называем скрипт WaterController. Открываем его и вводим такой код:
using UnityEngine;
using System.Collections;
public class WaterController : MonoBehaviour {
public float scrollSpeed;
private Vector2 savedOffset;
private Material mat;
private float offset = 0f;
void Start () {
mat = GetComponent<Renderer> ().material;
savedOffset = mat.GetTextureOffset ("_MainTex");
}
void Update () {
float rate = scrollSpeed * Time.deltaTime;
offset = offset + rate;
if (offset <= -1f || offset >= 1f) {
offset = 0f;
rate = 0f;
}
mat.mainTextureOffset = new Vector2 (offset, savedOffset.y);
}
}
Пожалуйста, озаботьтесь табуляцией самостоятельно, пикабу ее почему-то "съедает".
Сохраняем скрипт. Что происходит в нашем скрипте? В методе Start() определяется наш материал, который использует наш Quad и offset нашего материала. В методе Update() каждый кадр offset меняется и таким образом создается эффект скроллинга текстуры.
Запускаем наш проект... Тюлень в воде висит, но ничего никуда не двигается. Смотрим тогда на наш компонент Скрипт (или в код) и видим, что есть public переменная scrollSpeed. Делаем скорость, скажем, 0.2. И еще один нюанс: идем в наши текстуры и меняем Wrap Mode с Clamp на Repeat, чтобы скроллинг был закольцован. Теперь добавляем наш скрипт (уже не надо создавать новый) ко вторым волнам и к песку и выставляем им скорость , скажем пусть у дальних волн она будет 0.1, у ближних 0.2, а у песка - 0.3 (не забываем так же и про Wrap) и... Всё прекрасно работает!
На сегодня всё, пишите, ругайте, ставьте минусы и плюсы. Завтра или продолжим и заставим нашего тюленя качаться на волнах и нырять ко дну или перепишем этот урок, если вышло всё совсем плохо и непонятно.