1. Введение в Unity и базовые понятия C#
Введение в Unity и базовые понятия C#
Представь ситуацию: твой персонаж приходит в себя после крушения вертолета. Вокруг густой лес, в руках только топор, а вдалеке слышен пугающий крик. Ты нажимаешь кнопку на клавиатуре, герой делает шаг, рубит дерево, и в инвентаре появляются бревна для постройки укрытия. Внезапно из кустов выбегает монстр и начинает преследование.
Вся эта магия — движение, добыча ресурсов, поведение врагов — не появляется сама по себе. За каждым действием на экране стоит строгий набор правил. Чтобы создать собственную игру про выживание, похожую на Sons of the Forest, нужно научиться устанавливать эти правила. Именно для этого нам понадобятся две вещи: среда, где мы будем строить мир, и язык, на котором мы будем объяснять этому миру, как работать.
Игровой движок Unity: Ваша цифровая мастерская
Игровой движок — это огромная программа, которая берет на себя самую сложную и скучную работу по созданию игр. Тебе не нужно с нуля писать формулы гравитации, чтобы срубленное дерево упало на землю, или программировать то, как свет от костра отражается от листьев.
Unity предоставляет готовый трехмерный мир. Это похоже на съемочную площадку: здесь есть камеры, освещение, декорации (деревья, камни) и актеры (твой персонаж и монстры). Но без режиссера актеры будут просто стоять на месте.
Чтобы понять разделение обязанностей, посмотрим на таблицу:
| Задача в игре | Что делает Unity | Что делает программист (ты) | |---|---|---| | Падение дерева | Рассчитывает физику падения и столкновение с землей | Пишет код: «Если игрок ударил топором 5 раз, дерево должно упасть» | | Внешний вид монстра | Отрисовывает 3D-модель, текстуры кожи и анимацию бега | Пишет код: «Если игрок подошел ближе чем на 10 метров, монстр бежит за ним» | | Инвентарь | Показывает картинки яблок и палок на экране | Пишет код: «При подборе яблока увеличить счетчик еды на 1» |
Язык C#: Голос создателя
Чтобы стать тем самым режиссером на съемочной площадке Unity, нужно выучить язык, который понимают «актеры». В Unity используется язык программирования C# (читается как Си-шарп).
Файлы с кодом называются скриптами. Скрипт — это текстовый документ с инструкциями. Когда ты пишешь скрипт, ты буквально создаешь правила жизни для конкретного объекта.
> Программирование — это не магия и не высшая математика. Это просто умение очень точно и последовательно объяснять компьютеру, что именно ты от него хочешь. > > Билл Гейтс
Чтобы начать писать скрипты, нужно разобраться с четырьмя главными кирпичиками языка C#. Без них не обходится ни одна игра.
1. Переменные: Рюкзак для данных
Переменная — это коробка, в которой хранится какая-то информация. У каждой коробки есть имя, чтобы мы могли ее найти, и содержимое.
В игре про выживание нам нужно постоянно что-то считать: сколько у героя осталось здоровья, сколько бревен он несет, хочет ли он пить. Для всего этого создаются переменные.
Например, мы создали переменную для здоровья и положили в нее число 100. Если монстр бьет героя, мы достаем значение из коробки, отнимаем от него урон и кладем обратно. Если урон равен 20, то математика проста: . Теперь в коробке лежит число 80.
2. Типы данных: Что лежит в коробке?
Компьютер не очень догадлив. Ему нужно заранее сказать, коробку какой формы мы создаем. Для этого существуют типы данных:
int (integer*) — целые числа. Подходит для того, что нельзя разделить на части. Например, количество камней в инвентаре (5 камней) или максимальное здоровье (100).
* float — дробные числа. Используется там, где нужна точность. Например, скорость бега персонажа может быть 4.5 метра в секунду, или время до наступления ночи — 120.5 секунд.
bool (boolean*) — логический тип. У этой коробки может быть только два состояния: true (правда/да) или false (ложь/нет). Например, горит ли сейчас костер? Жив ли главный герой?
* string — текст. Используется для имен, названий предметов или диалогов. Например, название предмета «Ржавый топор».
Вот как выглядит создание переменных в коде C#:
3. Методы: Действия персонажей
Если переменные отвечают на вопрос «Что у нас есть?», то методы (или функции) отвечают на вопрос «Что мы делаем?».
Метод — это блок кода, который выполняет конкретное действие. Представь, что у тебя есть рецепт крафта копья. Тебе не нужно каждый раз придумывать, как его делать. Ты просто говоришь: «Сделай копье», и игра выполняет заготовленный список действий (забрать 2 палки, забрать 1 камень, добавить копье в инвентарь).
Пример метода, который заставляет героя получать урон:
Если мы вызовем этот метод и передадим ему число 15, здоровье персонажа уменьшится ровно на 15 единиц.
4. Классы: Чертежи для выживания
Класс — это чертеж, по которому создаются объекты в игре.
Допустим, ты хочешь добавить в игру племя каннибалов. Тебе не нужно писать отдельный код для каждого из 50 врагов в лесу. Ты создаешь один класс (чертеж) под названием Enemy (Враг).
В этом чертеже ты указываешь:
Когда чертеж готов, Unity может создать по нему хоть одного, хоть тысячу монстров. У каждого из них будет свое здоровье, но вести себя они будут по одним и тем же правилам, описанным в классе.
Как Unity и C# работают вместе
В Unity все предметы, которые ты видишь на экране (деревья, камни, игрок, земля), называются GameObject (Игровой объект). Сам по себе GameObject — это просто пустышка, невидимая точка в пространстве.
Чтобы точка стала деревом, на нее нужно повесить Component (Компонент). Компоненты — это детали конструктора.
* Вешаешь компонент Mesh Filter — объект приобретает форму ствола и веток.
* Вешаешь компонент Collider — объект становится твердым, сквозь него нельзя пройти.
А теперь самое главное: каждый скрипт C#, который ты пишешь — это тоже компонент!
Ты создаешь скрипт TreeHealth (Здоровье дерева), пишешь в нем, что у дерева 5 жизней, и просто перетаскиваешь этот скрипт мышкой на 3D-модель дерева в Unity. С этого момента дерево «оживает» и начинает подчиняться твоим правилам.
Математика в играх: Как монстр находит игрока
В программировании игр часто используется базовая школьная математика. Например, как монстр понимает, что ты подошел слишком близко и пора атаковать? Игра постоянно измеряет расстояние между точкой, где стоит монстр, и точкой, где стоишь ты.
Для этого движок использует теорему Пифагора, рассчитывая расстояние между двумя точками в пространстве:
Где: * — итоговое расстояние между объектами. * и — координаты монстра на карте. * и — координаты твоего персонажа.
Если рассчитанное расстояние (меньше или равно 10 метрам), скрипт монстра запускает метод Attack(). Тебе не придется писать эту формулу вручную — в Unity уже есть встроенная команда Vector3.Distance, которая делает этот расчет за доли секунды, но важно понимать, как это работает внутри.
Итоги
* Unity — это визуальная среда и физический движок, который берет на себя графику, гравитацию и освещение. * C# — это язык программирования, с помощью которого мы пишем скрипты (правила логики) для нашей игры. * Переменные хранят данные (здоровье, ресурсы), а типы данных определяют, что именно мы храним (числа, текст, логику). * Методы заставляют объекты действовать (бегать, рубить, получать урон). * Скрипты в Unity работают как компоненты: мы пишем код и «прикрепляем» его к 3D-моделям, чтобы они начали взаимодействовать с игроком.