Unity3D. Создание RPG. Урок 1. Создание меню




«Будущее должно быть заложено в настоящем. Это называется планом. Без него ничто в мире не может быть хорошим» Георг Кристоф Лихтенберг 1. Создаем меню с летающей камерой аля Far Cry. 2. Персонаж. Движение и управление. Камера. Меняем позицию и вид камеры. 3. Статы. Часть первая. Опыт, деньги. 4. Квесты. 5. Ai. Искусственный интеллект. Часть первая. Покупка персонажа. 6. Статы. Часть вторая. Жизни, манна. Рисуем HP и MP бары. 7. Ai. Искусственный интеллект. Часть вторая. Мобы. 8. Инвентарь. Магазин. План может дополняться и изменятся. Урок 1. Меню с летающей камерой аля Far Cry. В этом уроке мы узнаем основы создания сцен в Unity3D. Узнаем некоторые стандартные возможности и некоторые дополнительные. Использовано: 1. Terrain Toolkit https://yadi.sk/d/NECQRcVaCEKuT 2. Nature Pack https://yadi.sk/d/m8Qu8ts2CEKyB 3. Real Nature Pack 2 Autumn v2 https://yadi.sk/d/A4IN7tuMCELA3 4. Tropical Nature Pack https://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» И устанавливаем размеры нашего ландшафта как на скриншоте. Для сцены меню на большой ландшафт не нужен и дабы не грузить процессор достаточно этих размеров. Тыкаем «Set Resolution» Нажимаем «Component>>Terrain>>Terain Toolkit» В появившемся компоненте «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 и выставляем необходимые координаты следующего положения камеры. У меня получились следующие значения: Код Переменная/номер кадра 300 | 600 | 900 | 1200 | 1500| 1800 Position.x 90 | 10 | 190 | 120 | 190 | 10 Position.y 45 | 45 | 45 | 45 | 45 | 45 Position.z 90 | 190 | 190 | 100 | 10 | 10 Rotation.x 5 | 45 | 15 | 15 | 15 | 15 Rotation.y 45 | 94 | 240 | 140 | 270 | 405 Rotation.z 0 | 0 | 0 | 0 | 0 | 0 Нажмем на кнопочку 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; } } } Компилированная сцена https://yadi.sk/d/f5pFI0_pCG7YC

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-23 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: