Цикл уроков “Unity3D Minecraft”
Для кого они?
- для тех, кто уже знаком с движком Unity3D и знает все основы
Чему вы научитесь?
- многим интересным алгоритмам
- различным приемам работы с Unity3D
- создавать аналог Minecraft
Урок 1. Создание ландшафта
- Создаем новый проект
- Создаем 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”.
Теперь нам следует подумать, как мы будем генерировать ландшафт (выбор алгоритма). Можно будет использовать шум Перлина и его модификации, но для начала можно будет использовать данный алгоритм (http://www.ixbt.com/video/3dterrains-generation.shtml). Ознакомтесь с ним и переходите далее.
- Редактируем скрипт:
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” наш префаб
- Сохраняем проект и тестируем. Возможно проект будет долго запускаться на медленных компьютерах (как у меня=)). Вам придется подождать в данном случае.
Примечания:
- Алгоритм заполнения промежутков можно было бы улучшить, чтобы еще была земная кора, но тогда время запуска увеличится.
Скриншоты:
- 12 февраля 2012, 19:17
Нет, уже нездоровый тренд. И урок не самый лучший, прости.
За что прощение то просишь?))) Ты мне ничего не сделал. А то, что тренд не здоров не значит, что на нем не надо учиться. Да и генерация ландшафта довольно интересная тема (а в будущем я раскрою еще и другие)
«Нездоровый тренд» — это он, наверное, про количество уроков на гамине в последнее время.
Так тут в основном уроки под другие движки. Тем, кто интересуются Unity3D, будет актуально
Ну мало ли, можешь обидеться._.
Просто тут мало, мне кажется, людей, которые оценят труд и которым это было нужно.
Не люблю ни то, ни другое =)))
Вообще не надо быть поваром, что бы сказать что блюдо невкусное!
Ничто не вечно, потерпи)
Свободу слова ограниченную модерацией вроде бы никто не отменял... Или я что-то пропустил?
По поводу цикла, автор не думай бросать дело, не оценят сейчас, оценит кто нибудь другой в будущем кому это поможет и пригодится =)
мне пригодился
Блин, а мне ошибку выдаёт
_Scripts/JSLandscape.js(28,32): BCE0044: unexpected char: 0xFFFD.
найди строку 28 и в конце где "cube"; забери кавички и постав их сам
тоже самое сделай на строке 75
Спасибо большое! А где остальные уроки?
я делаю не Майнкрафт-о-подобную игру, но мне, очень, пригодился этот урок!