Пролог. Всем привет. Узнав о Unity3D, я очень обрадовался. Это была вторая вещь в геймдевлопе, которая меня зацепила простотой и интуитивностью (первая Game Maker). Так как я не люблю видеоуроки (сам не знаю почему), в поисках уроков очень сильно напрягался, из-за малого количества текстовых уроков. Поэтому решил написать данный цикл статей, для таких же любителей текстовых уроков как я. Так как этот цикл ориентирован на новичков, попутно будут изучаться возможности Unity3D. Урок 0 или небольшой план.
«Будущее должно быть заложено в настоящем. Это называется планом. Без него ничто в мире не может быть хорошим» Георг Кристоф Лихтенберг
1. Создаем меню с летающей камерой аля Far Cry. 2. Персонаж. Движение и управление. Камера. Меняем позицию и вид камеры. 3. Статы. Часть первая. Опыт, деньги. 4. Квесты. 5. Ai. Искусственный интеллект. Часть первая. Покупка персонажа. 6. Статы. Часть вторая. Жизни, манна. Рисуем HP и MP бары. 7. Ai. Искусственный интеллект. Часть вторая. Мобы. 8. Инвентарь. Магазин. План может дополняться и изменятся. Урок 1. Меню с летающей камерой аля Far Cry. В этом уроке мы узнаем основы создания сцен в Unity3D. Узнаем некоторые стандартные возможности и некоторые дополнительные. Использовано: 1. Terrain Toolkit http://yadi.sk/d/NECQRcVaCEKuT 2. Nature Pack http://yadi.sk/d/m8Qu8ts2CEKyB 3. Real Nature Pack 2 Autumn v2 http://yadi.sk/d/A4IN7tuMCELA3 4. Tropical Nature Pack http://yadi.sk/d/lTMMWzC4CELCf
План: 1. Создание проекта. Импорт необходимых библиотек. 2. Генерация ландшафта. Редактирование. 3. Освещение. Камера. 4. Анимация камеры(полет). 5. Создание меню. Создание проекта. Импорт необходимых библиотек. Запускаем Unity. В «Project wizard» переходим во вкладку «Create New Project». В «Import the following packages» выбираем следующие паки: Skyboxes, Terrain Assets, Water(в зависимости от версии unity3d, я выбрал pro) Заходи в «Assets>>Import package>>Custom package» и переходим в папку где у вас лежат скачанные паки. Выбираем и нажимаем открыть.
Внимание!!! Паки тяжелые по этому Unity может не слабо задуматься не пугайтесь!! Генерация ландшафта. Нажимаем «Terrain>>Create Terrain»
Появился объект «Terrain» Нажимаем «Terrain>>Set Resolution» И устанавливаем размеры нашего ландшафта как на скриншоте. Для сцены меню на большой ландшафт не нужен и дабы не грузить процессор достаточно этих размеров.
В появившемся компоненте «Terrain Toolkit» я выставил все так Советую поиграть с настройками очень часто вылазят такие интересные варианты ландшафта. Итак наш ландшафт готов. Зададим ему текстуру. В инспекторе нажимаем на кисточку а затем Edit Textures. И нажимаем Add Texture. В появившемся окне нажимаем «Select» на Texture
В появившемся окне выбираем текстуру (двойной клик мышью), я выбрал «Grass(Hill)» Нажимаем Add и наш ландшафт перекрашивается. Нажимаем «Raise/Lower terrain» Выбираем кисть, размер(Brush Size) интенсивность(Opacity). И нажимая LBM(Левая кнопка мыши) поднимаем вершину, либо нажимая Shift+LBM опускаем. Нажимая «Smooth Height» (3 кнопка) убираем острые углы. Дальше я нарисовал что типа песчаного пляжа добавив текстуру «Good Dirt». Вот что у меня получилось. Выбираем «Place trees» и нажимаем «Edit trees». В появившемся окне нажимаем кружочек. И аналогично выбору текстуры выбираем дерево. И варируя настройками кисти насаживаем разных деревьев. Аналогично на предпоследней кнопке насаживаем цветов, травы, камней итд. С одним НО для того что бы не грузить процессор мы для травы мы выбираем «Add Grass Texture» а вот для остального «Add Details Mesh». И в последней вкладке можно побаловаться с настройками деревьев, рендера, настройками ветра. Я оставил все стандартно. Создадим воду. В окне «Project» идем в паку «OnQ Nature Pack 2 v2>>Resources Demo>>Standard Assets>>Water(pro only)» и выбираем «Daylight water».
Перетягиваем на сцену и при помощи кнопок трансформации ставим и растягиваем как нам надо.
Вот что у меня получилось. На этом с ландшафтом покончено. Добавим теперь «Skybox». Для Этого идем в «Edit>>Render Settings». И в инспекторе выбираем материал «Skybox» тыкнув на кружок.
Я выбрал «Sunny2 skybox». Освещение и камера. В «GameObject>>Create Other» выберем «Point light». В инспекторе выставляем навстройки. «Position» x=100 y=100 z=100 это выставит наш источник света по центру над «Terrain» на высоте равной 100. «Range» = 150, это радиус освещения вокруг источника. И «Itensity» = 3.3. В итоге получился довольно мягкий свет достающий везде. У нас уже есть стандартно созданная камера «Main Camera». Кликнем на ней в окне Hierarchy. И расположим ей в позиции X=10, Z=10. A Y устанавливаем относительно высоты вашего ландшафта, у меня получилось 45. Что бы уменьшить площадь захватываемой камерой Изменяем настройку «Field of View»(У меня 43). Ориентируясь на окно «Camera Preview» поворачиваем камеру так как нам надо. У меня получилось Rotation X=5, Y=45, Z=0. Анимация камеры (полет) Заходим в «Window>>Animation» или нажимаем Ctrl+6. Нажимаем на стрелочки в пустом поле и выбираем «Create New Clip» Назовем его на пример «CameraFly». Нажмем на палочку на против «Position.x» и нажмем «Add Curves». Установим позицию кадра на 300 и выставляем необходимые координаты следующего положения камеры. У меня получились следующие значения:
Нажмем на кнопочку Play и посмотрим что получилось. И вот наша камера уже летает. Однако пролетев круг она останавливается. Давайте исправим это. Создадим новый C# скрипт (RMB по окну «Project» далее «Create>>C# Script») и назовем его FlyCamera. В нем пишем в методе Update всего одну строчку:
Код
transform.animation.CrossFade ("FlyCamera");
Этим заставляем циклично выполнять анимацию под названием «FlyCamera». Скрипт помещаем на Main Camera. Проверяем и все работает). Создаем меню. Создадим скрипт под названием «Menu». Зададим переменные:
Код
public bool showMenu = true; //Отображать ли меню public int window; //Отображаемое окно
В метод «Start» пишем:
Код
showMenu = true; window = 1;
В метод «Update» пишем:
Код
if(showMenu == true) //Проверяем включно ли меню { curTime += Time.deltaTime; //Если включено, Увеличиваем переменную curTime согласно пройденому времени } if(curTime > lifeTime) //Если время дошло до максимальной точки { showMenu = false; //Отключаем меню window = 0; curTime = 0; //Сбрасываем таймер } if(showMenu == false&Input.anyKeyDown) //Если меню выключено и нажата любая клавиша { showMenu = true; //Включаем меню window = 1; }
Создаем метод «OnGUI» и пишем в него:
Код
if(window == 1) //Если окно 1 { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,220), "Меню"); //Создаем окно с меню
if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-40,180,30), "Новая игра")) { Application.LoadLevel(1); //Загружаем уровень 1 } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-0,180,30), "Настройки")) { window = 2; //открываем окно настроек } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+40,180,30), "Об игре")) { window = 3; //Выводим информацию об Автарах игры } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+80,180,30), "Выход")) { window = 4; //Вызываем окно выхода } }
//Далее все аналогично if(window == 2) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,250), "Настройки"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-40,180,30), "Игра")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-0,180,30), "Аудио")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+40,180,30), "Видео")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+80,180,30), "Управление")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+120,180,30), "Назад")) { window = 1; } }
if(window == 3) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,220), "Об игре"); GUI.Label(new Rect(Screen.width/2-90,Screen.height/2-0, 180, 40), "Инфа о разрабе"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+100,180,30), "назад")) { window = 1; } }
if(window == 4) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-60,200,120), "Выход?"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-20,180,30), "Да")) { Application.Quit(); //Выход из игры } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+20,180,30), "Нет")) { window = 1; } }
if(window == 0) //Если это окно то выключаем меню { useGUILayout=false; } }
Скрипт перемещаем на Main Camera.
Сохраним сцену под названием menu.unity
Полный код скрипта menu
Код
using UnityEngine; using System.Collections;
public class Menu : MonoBehaviour { public bool showMenu; //Отображать ли меню public int window; //Отображаемое окно public float lifeTime = 5.0f; //Максимальное время отображения меню private float curTime; //Текущие время отображения меню
void Start () { showMenu = true; window = 1; }
void Update () { if(showMenu == true) //Проверяем включно ли меню { curTime += Time.deltaTime; //Если включено, Увеличиваем переменную curTime согласно пройденому времени } if(curTime > lifeTime) //Если время дошло до максимальной точки { showMenu = false; //Отключаем меню window = 0; curTime = 0; //Сбрасываем таймер } if(showMenu == false&Input.anyKeyDown) //Если меню выключено и нажата любая клавиша { showMenu = true; //Включаем меню window = 1; } }
void OnGUI () { if(window == 1) //Если окно 1 { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,220), "Меню"); //Создаем окно с меню
if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-40,180,30), "Новая игра")) { Application.LoadLevel(1); //Загружаем уровень 1 } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-0,180,30), "Настройки")) { window = 2; //открываем окно настроек } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+40,180,30), "Об игре")) { window = 3; //Выводим информацию об Автарах игры } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+80,180,30), "Выход")) { window = 4; //Вызываем окно выхода } }
//Далее все аналогично if(window == 2) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,250), "Настройки"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-40,180,30), "Игра")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-0,180,30), "Аудио")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+40,180,30), "Видео")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+80,180,30), "Управление")) { } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+120,180,30), "Назад")) { window = 1; } }
if(window == 3) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-80,200,220), "Об игре"); GUI.Label(new Rect(Screen.width/2-90,Screen.height/2-0, 180, 40), "Инфа о разрабе"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+100,180,30), "назад")) { window = 1; } }
if(window == 4) { GUI.Box (new Rect (Screen.width/2-100,Screen.height/2-60,200,120), "Выход?"); if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2-20,180,30), "Да")) { Application.Quit(); //Выход из игры } if(GUI.Button (new Rect (Screen.width/2-90,Screen.height/2+20,180,30), "Нет")) { window = 1; } }
if(window == 0) //Если это окно то выключаем меню { useGUILayout=false; } } }
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3D. Создание RPG. Урок 1. Создание меню», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
Полезно для новичков вроде меня)). Уроки созданные для ознакомленных с Unity3D пригодятся далеко не сразу. Буду следить за вашими статьями, надеюсь доведете дело до конца. Благодарю за то, что пишете эти уроки. Успехов)
От одного урока конечно, толку мало, но если цикл будет доведен до конца, будет круто! Я так понимаю, данный курс будет переработанным курсом от Огасода (который в свою очередь переводил курс какого то забугорного чувака) ? Вообщем удачи, автор молодец!
По этим простым вещам уже куча уроков на английском и, как минимум, три русских команды сделали видео уроки. может хватит писать про раскрашивание террейна и размещение кнопок?
Это только первый урок. А на счет видио я уже написал что я не люблю видеоуроки, и в первую очередь пишется для людей которые так же не любят видеоуроки.
Да будет тебе известно, что больше 90% всех уроков которые пишутся по юнити пишутся для людей уже знакомых с интерфесом редактори и умеющим с ним маломальски работать! И ненадо писать "Созадние РПГ", потому что ты все равно не напишишь ничего толкового! АБСОЛЮТНО НИЧЕГО!
Во вторых, напишу я что толковое или нет не тебе судить так как у само за душой ни чего нет, кроме змейки. Да и высказывания надо делать после того как сам что ни будь полезное сделаешь для сообщества. И спецом для тебя могу в перед уроков доделать то что в итоге получится, или дождешься вместе со всеми окончания цикла статей?
ты что, ясновидящий? Если тебе не нужны эти уроки, не смотри эту тему, всего делов. Если кому то пригодится - будет хорошо. Парень же расписал план, сообщил о том что будет дальше. Материал, который он (переработанный) выкладывает, есть в виде видеуроков у двух людей - в сжатом ввиде у Огосоды (который тот так и не закончил), и на английском языке у чувака с ютуба. Оба варианта - видеоуроки, а наш парень делает эту тему для людей предпочитающих текстовый формат, которых, кстати, много (мой брат например). Что тоже достойно уважения.
Спасибо за поддержку) Кстати план уроков не много изменился, в 3 уроке выложу как и по чему. И теперь это будет не просто переработка уроков Огосоды, А больше направляться к моим личным наблюдениям и реализациям. и в некоторых моментах это возможно будет чистая импровизация.
Давай, дерзай ) Огасода в свое время отказался от этого курса, потому что оригинальный автор слишком много уходил в наследование, тогда как можно было сделать быстрее и проще. В целях освоения основ ООП этот курс будет полезен, расписано там толково
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]