Minecraft люди воспринимают по-разному. Для сообщества это детский сад, для игровой индустрии — феномен, простой и гениальный. Господин Нотч необычайно умен и сотворил технически шедевральную игру, о внутренностях которой я хочу поведать.

В начале я расскажу о некоторых интересностях генерации игрового мира, чем вызваны и как связаны, а потом опишу непосредственно принцип генерации.

Этот псевдо-рандом используется в огромном количестве игр и эту статью можно считать отправной точкой в мир неслучайных случайностей.

Интересности

Начнем пожалуй с того, что количество вариаций игрового мира не бесконечно, всего 281 триллион вариантов, 281 триллион возможных » seed ов», которые можно указать при генерации карты.

Майнкрафт даже спидранят, для этого раннер просто тренирует и отрабатывает стратегию в определенном мире, а на начало рана вводит его «зерно» — буквенное или численное значение.

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

Полный разбор генерации мира Minecraft

Сам мир тоже не бесконечен, технически. Если вы потратите 2 года реального времени и добежите до координат более 15 миллионов блоков от центра (но все предпочитают телепортироваться), то наткнетесь на так называемые «Далекие земли» :

Связано это с тем, что значение переменной, отвечающей за «границы» игрового мира для генератора, становится больше положенного и старые элементы накладываются поверх новых.

Непосредственно генерация

Начать стоит с того, что мир генерируется не по блоку, существуют так называемые чанки площадью 16 на 16 блоков площади и 256 блоков в высоту, вот как они выглядят :

Прямо с майнкрафт-геймпедии

Прорисовываются и генерируются они на достаточно большой площади от игрока, всё зависит от настройки дальности. Прошу заметить, что блоков в чанке 65 536, такое количество элементов способно содержать в себе 16-битная переменная, отвечающая за свой чанк. Верно полагать каждому блоку полагается координата и его айди, для движка воздух тоже имеет айди, наверно равен он нулю.

Сама геометрия генерируется с помощью шума Перлина . Крайне занятная вещь, которую в майнкрафте применили почти везде. Шум Перлина представляет из себя процедурно-генерируемую псевдо-рандомную черно-белую текстуру :

Что-то вроде этого

Похоже на дым, а в шутерах используется для генерации эффектов дыма, но мы сейчас о майнкрафте. Вообще стандартная восьмибитная палитра содержит в себе 255 градиентов, что между белым и черным, однако из шума Перлина обычно берут 100 значений — от 0 до 1.

Можно использовать получившуюся текстуру для генерации высот карты, здесь можно уловить связь — самый черный цвет имеет значение 255 в палитре, напомнить высоту игрового мира? 256! Однако алгоритм оптимизирован и не позволит сгенерированной горе вырасти так высоко.

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

МОДЖАНГ ЧТО ВЫ СДЕЛАЛИ?! ВОТ ПОЧЕМУ СИД 193462 ОПАСЕН ДЛЯ ИГРОКОВ МАЙНКРАФТ

Читайте также:  Самый большой порт в Майнкрафт

Программисты любят баловаться с шумом Перлина, я говорил о карте высот, взгляньте :

Изначально шум получается уж очень резким и карта может выглядеть вот так :

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

Можно всё же не усреднять, а объединять. Спавним деревенщину шумом Перлина — многовато в одном месте? Стянуть всех сюда и воткнуть город.
Это будет не сглаживание, а наоборот, группировка или уплотнение.
Так же можно нарастить лес.

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

Источник: dzen.ru

Создание Minecraft на Unity3D. Часть вторая. Генерация мира

Обложка: Создание Minecraft на Unity3D. Часть вторая. Генерация мира

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

Добавляем функциональность мыши

Прежде чем мы приступим к программированию, давайте добавим на нашу сцену направленный свет. Нам нужен источник света, чтобы лучше видеть наш 3D-мир.

35_light

Вы можете поменять направление света, если хотите:

scene-light2

Позиционируем источник света

Теперь мы можем перейти к написанию нашего первого скрипта. Мы хотим реализовать функционал добавления нового экземпляра куба около стороны, на которую мы щелкаем правой кнопкой мыши, и удаления существующего блока по нажатию левой клавиши. Во вкладке Project перейдите в папку Code и создайте два C#-скрипта.

33_newscript

Добавляем в проект C#-скрипт

Мы назовем их WorldGenerator и ClickOnFaceScript.

34_scripts

Прежде чем мы продолжим, вам крайне рекомендуется ознакомиться со скриптингом в Unity.

Теперь откройте WorldGenerator.cs в MonoDevelop (которая уже установлена вместе с Unity) двойным щелчком по нему и введите следующий код:

Мы используем статический метод, чтобы создать клон нашего куба. Unity позволяет нам задать имя и позицию клона. Больше информации о методе Instantiate вы можете получить здесь.

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

Откройте ClickOnFaceScript.cs и введите туда этот код:

/* Andrei Jifcovici * In2GPU.com */ using UnityEngine; using System.Collections; public class ClickOnFaceScript : MonoBehaviour < // Эта функция вызывается, когда курсор находится над GameObject, на котором этот скрипт расположен void OnMouseOver() < // Если нажата левая клавиша мыши if (Input.GetMouseButtonDown(0)) < // Выводим сообщение в консоль Debug.Log(«Left click!»); >// Если правая клавиша нажата if (Input.GetMouseButtonDown(1)) < // Выводим сообщение Debug.Log(«Right click!»); >> >

Читайте также:  Топ 100 секретов Майнкрафт

Теперь переместите скрипт на каждую из шести сторон куба на сцене.

36_dragscript2

Применяем скрипт к GameObject

Скрипт должен появиться на каждой стороне во вкладке Inspector.

37_inspector_script1

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

39_test

Тестируем нажатия кнопок мыши

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

Теперь у нас есть все что нужно, чтобы создавать новые кубы по клику правой клавишей мыши. Мы должны определить точную позицию нового GameObject, который будет появляться при клике. На нашей сцене расстояние между центрами двух соседних блоков равно единице.

Для простоты мы назовем центр куба, по которому кликают, буквой C, а центр блока, который должен появиться — N. Мы рассматриваем эти центры как позиции в 3D-пространстве.

  • Если мы кликаем на верхнюю грань: N = C + (0, 1, 0);
  • На нижнюю: N = C + (0, -1, 0);
  • На правую: N = C + (1, 0, 0);
  • На левую: N = C + (-1, 0, 0);
  • На переднюю: N = C + (0, 0, 1);
  • На заднюю: N = C + (0, 0, -1).

Мы можем обобщить сказанное выше в простую формулу: N = C + delta, где delta — это смещение, требуемое для расчета центра нового блока. Каждая из шести сторон содержит свой экземпляр ClickOnFaceScript и разное значение delta.

Мы должны изменить ClickOnFaceScript.cs, чтобы реализовать функционал, описанный выше. Откройте скрипт и измените файл таким образом:

/* Andrei Jifcovici * In2GPU.com */ using UnityEngine; using System.Collections; public class ClickOnFaceScript : MonoBehaviour < // Значения публичных полей можно поменять прямо из редактора // Хранит смещение, требуемое для расчета позиции нового объекта public Vector3 delta; // Эта функция вызывается, когда курсор находится над GameObject, на котором этот скрипт расположен void OnMouseOver() < // Если нажата левая клавиша мыши if (Input.GetMouseButtonDown(0)) < // Выводим сообщение в консоль Debug.Log(«Left click!»); // Уничтожаем блок, по которому кликнули Destroy(this.transform.parent.gameObject); >// Если правая клавиша нажата if (Input.GetMouseButtonDown(1)) < // Выводим сообщение в консоль Debug.Log(«Right click!»); // Вызываем метод из класса WorldGenerator WorldGenerator.CloneAndPlace(this.transform.parent.transform.position + delta, // N = C + delta this.transform.parent.gameObject); // Родительский GameObject >> >

Вернитесь в редактор и поменяйте значения delta в соответствии с картинками:

40_values

Вся необходимая информация обведена

Проверьте, что все работает. Запустите игру несколько раз, задавая разные позиции камере (изменяя ее Transform во вкладке Inspector), чтобы проверить, что введенные нами значения delta верны.

41_tempcam

Настраиваем позицию камеры и нажимаем на стороны кубов

Создаём персонажа

Если все работает, как задумано, мы можем перейти к созданию персонажа, чтобы мы могли свободно двигаться в нашей игре. К счастью для нас, Unity предоставляет готовый пакет с контроллером персонажа от первого лица, так что нам не нужно будет создавать его с нуля. Перейдите в Assets → Import Package и выберите Character Controller.

Читайте также:  Как зажечь фонарь в Майнкрафте

42_addcc

Импортируем пакет Character Controller

В окне Importing package выберите следующее:

43_importcc

Во вкладке Project перейдите в Standard Assets → Character Controllers, выберите First Person Controller.prefab и перетащите его во вкладку Hierarchy.

44_firstpersoncontroller

Заготовка First Person Character Controller

Расположите его близко к центру сцены.

45_positioncc

Настраиваем местоположение заготовки

Мы должны защитить нашего персонажа от падения, прежде чем перейти к тестированию. Мы вернем значение обратно, когда закончим алгоритм генерации мира.

46_gravityoff

Гравитация не нужна!

Проверьте, что все работает.

47_test

У First Person Controller на нашей сцене есть Camera, прикрепленная, как дочерний GameObject. Когда мы запустим игру, эта камера станет главной на сцене, так что нам больше не нужна другая. Каждая камера содержит компонент AudioListener. Это и есть причина, по которой сообщение «There are 2 audio listeners in the scene.

Please ensure there is always exactly one audio listener in the scene.» появляется во вкладке Console. Отключите объект Main Camera во вкладке Hierarchy.

48_disablecamera

Отключаем главную камеру

Мы почти закончили! Откройте скрипт WorldGenerator.cs и модифицируйте его:

Скрипт будет запускаться только тогда, когда он прикреплен к какому-нибудь GameObject на сцене. Создайте пустой Empty GameObject и перетащите WorldGenerator.cs на него.

49_dragndrop

Перетаскиваем WorldGenerator.cs на новый GameObject

Перетащите объект Voxel на соответствующее поле в скрипте. Эта версия алгоритма генерации мира хранит все блоки в памяти, так что не рекомендуется задавать большие значения полям Size X, Size Y и Size Z, иначе вам грозит низкая производительность или, что еще хуже, Unity может вылететь.

50_values

Размеры больше указанных выставлять не стоит

Прежде чем мы увидим нашу разработку в действии, не забудьте поправить поле Gravity в скрипте, прикрепленном к Character Controller.

51_cc_valback

И всё-таки гравитация важна

Готово! Нажмите и веселитесь!

Источник: tproger.ru

Worldmaker — программа необычной генерации мира

Worldmaker - программа необычной генерации мира

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

Worldmaker - программа необычной генерации мира

После запуска программы, вы сможете выбрать тип генерации, а так же настроить по своему желанию.

Посмотрим на новые миры:

Mystical Islands — волшебные необычные острова в небе.

Worldmaker - программа необычной генерации мира

Vastwood — лес гигантских деревьев, большие грибы, многие ископаемые находятся на деревьях.

Worldmaker - программа необычной генерации мира

Planetoids — мир из сотен маленьких планет из разного материала.

Worldmaker - программа необычной генерации мира

Primordial Desert — пустыня с дюнами, оазисами, вулканами, очень сложна для выживания.

Worldmaker - программа необычной генерации мира

Dungeon Adventure — вы появляетесь в каньоне, вы зайдете в опасное подземелье, если дойдете до конца то попадете в портал ведущий в другой мир, каждый мир имеет новое подземелье, всего существует до 4 миров.

Worldmaker - программа необычной генерации мира
Worldmaker - программа необычной генерации мира

Woolpocalypse — мир состоящий из травы, овец, шерсти.

Источник: ru-minecraft.ru