Как сделать майнкрафт на юнити 3д
See the Trello board here
I want to recreate the vanilla Minecraft client in Unity to a degree that the game is mostly playable. The idea is you can connect to a server and play with your friends like normal, and have a very close to vanilla experience. I might also add in some client-side modifications in the future ;)
Adding some screenshots to better explain where the project is at right now:
And if you click here you can see a GIF
About
Создание Minecraft на Unity3D. Часть вторая. Генерация мира
Это вторая часть руководства по созданию собственной Minecraft-подобной игры. В ней мы напишем генератор мира и добавим персонажа, который сможет перемещаться по миру, ставить и удалять блоки. В предыдущей части мы создали куб с текстурой.
Добавляем функциональность мыши
Прежде чем мы приступим к программированию, давайте добавим на нашу сцену направленный свет. Нам нужен источник света, чтобы лучше видеть наш 3D-мир.
Вы можете поменять направление света, если хотите:
Позиционируем источник света
Мы назовем их WorldGenerator и ClickOnFaceScript.
Прежде чем мы продолжим, вам крайне рекомендуется ознакомиться со скриптингом в Unity.
Теперь откройте WorldGenerator.cs в MonoDevelop (которая уже установлена вместе с Unity) двойным щелчком по нему и введите следующий код:
Мы используем статический метод, чтобы создать клон нашего куба. Unity позволяет нам задать имя и позицию клона. Больше информации о методе Instantiate вы можете получить здесь.
В Minecraft, если вы находитесь достаточно близко к кубу и кликаете по нему левой кнопкой мыши, он исчезает и появляется в вашем инвентаре. Когда вы кликаете правой клавишей на любую из сторон куба, новый экземпляр появится на той стороне, по которой вы кликнули, в случае, если у вас достаточно материала в инвентаре. В данном уроке мы не будем ставить перед собой ограничения, так что у нас будет бесконечное количество кубов и бесконечная дистанция клика.
15 октября в 17:00, Онлайн, Беcплатно
Откройте ClickOnFaceScript.cs и введите туда этот код:
Теперь переместите скрипт на каждую из шести сторон куба на сцене.
Применяем скрипт к GameObject
Скрипт должен появиться на каждой стороне во вкладке Inspector.
Тестируем нажатия кнопок мыши
Запомните! В режиме игры любые изменения, которые вы произвели с элементами во вкладке 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, чтобы реализовать функционал, описанный выше. Откройте скрипт и измените файл таким образом:
Вернитесь в редактор и поменяйте значения delta в соответствии с картинками:
Вся необходимая информация обведена
Проверьте, что все работает. Запустите игру несколько раз, задавая разные позиции камере (изменяя ее Transform во вкладке Inspector), чтобы проверить, что введенные нами значения delta верны.
Настраиваем позицию камеры и нажимаем на стороны кубов
Создаём персонажа
Если все работает, как задумано, мы можем перейти к созданию персонажа, чтобы мы могли свободно двигаться в нашей игре. К счастью для нас, Unity предоставляет готовый пакет с контроллером персонажа от первого лица, так что нам не нужно будет создавать его с нуля. Перейдите в Assets → Import Package и выберите Character Controller.
Импортируем пакет Character Controller
В окне Importing package выберите следующее:
Во вкладке Project перейдите в Standard Assets → Character Controllers, выберите First Person Controller.prefab и перетащите его во вкладку Hierarchy.
Заготовка First Person Character Controller
Расположите его близко к центру сцены.
Настраиваем местоположение заготовки
Мы должны защитить нашего персонажа от падения, прежде чем перейти к тестированию. Мы вернем значение обратно, когда закончим алгоритм генерации мира.
Гравитация не нужна!
Проверьте, что все работает.
Отключаем главную камеру
Мы почти закончили! Откройте скрипт WorldGenerator.cs и модифицируйте его:
Скрипт будет запускаться только тогда, когда он прикреплен к какому-нибудь GameObject на сцене. Создайте пустой Empty GameObject и перетащите WorldGenerator.cs на него.
Перетаскиваем WorldGenerator.cs на новый GameObject
Перетащите объект Voxel на соответствующее поле в скрипте. Эта версия алгоритма генерации мира хранит все блоки в памяти, так что не рекомендуется задавать большие значения полям Size X, Size Y и Size Z, иначе вам грозит низкая производительность или, что еще хуже, Unity может вылететь.
Размеры больше указанных выставлять не стоит
И всё-таки гравитация важна
Готово! Нажмите и веселитесь!
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Цикл уроков “Unity3D Minecraft”
- Создаем новый проект
- Создаем Skybox для камеры (Component -> Rendering -> Skybox -> Выбераем “Custom Skybox”)
- Создаем источник света (Directional Light). Rotation = (45, 45, 0)
Shadow Type – Soft Shadows
Resolution – High Resolution
Bias – 0.15
- Создаем пустой объект нажатием клавиш Ctrl+Shift+N. Назовем его “landscape”
- Импортируем package, который называется Character Controller (Assets -> Import Package).
- Добавляем 3rd Person Controller. Пусть его позиция будет (0, 100, 0). Измените величину Step Offset скрипта Character Controller на 1.0
- Создаем куб (GameObject -> Create Other -> Cube), создаем материал, добавляем у нему текстуру травы, присваиваем материал кубу
- Создаем префаб и называем его “cube”. Перетаскиваем наш куб на этот префаб. Теперь он будет синим
- Создаем новый скрипт, который будет генерировать ландшафт. Назовем его “jsLandscape”. Назначаем его объекту “landscape”.
private var _field: GameObject[,,]; // наш ландшафт (является трехмерным массивом)
private var _height: int[,]; // высота данного места ландшафта
private var _maxSize: int = 32; // максимальная ширина ландшафта
private var _maxH: int = 64; // максимальная высота ландшафта
private var _maxR: int = 16; // максимальный радиус сферы
private var _spheresCount: int = 16; // количество сфер
var _prefabCube: GameObject; // префаб куба
function Start ()
// Инициализация массивов
_field = new GameObject[_maxSize, _maxH, _maxSize];
_height = new int[_maxSize, _maxSize];
// Создание поля (высота равна 0)
var i: int;
var j: int;
for (i = 0; i<_maxSize; i++)
for (j = 0; j<_maxSize; j++)
_height[i,j] = 0;
var _pos: Vector3 = Vector3(i-_maxSize/2, _height[i,j], j-_maxSize/2);
_field[i,0,j] = Instantiate(_prefabCube, _pos, Quaternion.identity);
_field[i,0,j].transform.parent = transform;
_field[i,0,j].transform.name = “cube”;
>
>
// Изменение ландшафта по изученному алгоритму
for (i = 0; i<_spheresCount; i++)
_pos = Vector3(Random.Range(0, _maxSize), 0, Random.Range(0, _maxSize));
var _r: int = Random.Range(1, _maxR);
for (var _x: int = _pos.x-_r; _x<_pos.x+_r; _x++)
for (var _z: int = _pos.z-_r; _z<_pos.z+_r; _z++)
var _inc: int = Mathf.Pow(_r, 2)-(Mathf.Pow(_x-_pos.x, 2)+Mathf.Pow(_z-_pos.z, 2));
if (_inc > 0 && _x>=0 && _z>=0 && _x<_maxSize && _z<_maxSize)
_inc = Mathf.Round(Mathf.Sqrt(_inc));
_height[_x,_z] = _height[_x,_z]+_inc;
_field[_x,0,_z].transform.position.y = _height[_x,_z];
>
>
>
>
// Нормализация (я не использовал)
// Заполнение промежутков между соседними платформами
for (i = 1; i<_maxSize-1; i++)
for (j = 1; j<_maxSize-1; j++)
var _minH: int = _height[i,j];
_minH = Mathf.Min(_minH, _height[i-1, j-1]);
_minH = Mathf.Min(_minH, _height[i, j-1]);
_minH = Mathf.Min(_minH, _height[i+1, j-1]);
_minH = Mathf.Min(_minH, _height[i-1, j]);
_minH = Mathf.Min(_minH, _height[i+1, j]);
_minH = Mathf.Min(_minH, _height[i-1, j+1]);
_minH = Mathf.Min(_minH, _height[i, j+1]);
_minH = Mathf.Min(_minH, _height[i+1, j+1]);
for (_z = 1; _z <= _height[i,j]-_minH; _z++)
_pos = Vector3(i-_maxSize/2, _height[i,j]-_z, j-_maxSize/2);
_field[i,_z,j] = Instantiate(_prefabCube, _pos, Quaternion.identity);
_field[i,_z,j].transform.parent = transform;
_field[i,_z,j].transform.name = “cube”;
>
>
>
>
- На объекте “landscape” присваиваем переменной “_prefabCube” наш префаб
- Сохраняем проект и тестируем. Возможно проект будет долго запускаться на медленных компьютерах (как у меня=)). Вам придется подождать в данном случае.
Примечания:
- Алгоритм заполнения промежутков можно было бы улучшить, чтобы еще была земная кора, но тогда время запуска увеличится.
Программист воссоздал Minecraft на движке Unity за 14 часов
Программист Сэм Хоган устроил челлендж, в рамках которого он поставил цель создать Minecraft на движке Unity за 24 часа. По его словам, достигнуть этого результата удалось за 14 часов. Видео с демонстрацией рабочего процесса опубликовано на YouTube.
Хоган отметил, что одним из условий челленджа стал запрет на использование интернета, а также каких-либо учебных материалов и уроков. Он использовал сеть только для того, чтобы скачать нужные для программирования библиотеки.
Автор ролика рассказал, что занимался разработкой поэтапно, в ходе чего сталкивался с проблемами. Одной из главных трудностей стала оптимизация игры. Хоган отметил, что ему так и не удалось окончательно решить этот вопрос без помощи интернета.
Читайте также: