Основы C# и Unity: Создание 3D-игры про выживание с нуля

Этот курс разработан специально для начинающих, желающих создать свою первую 3D-игру в жанре выживания на популярном движке Unity [artean.ru](https://artean.ru/blog/igri/kak-stat-razrabotchikom-igr-na-unity-s-nulja/). Шаг за шагом мы изучим основы программирования на C#, оживим главного героя, запрограммируем поведение монстров и создадим систему крафта, делая сложные вещи простыми и понятными [tproger.ru](https://tproger.ru/articles/programmirovanie-na-c-v-unity-besplatnye-videouroki-dlja-detej-i-podrostkov).

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 (Враг).

В этом чертеже ты указываешь:

  • Переменные: здоровье (100), скорость бега (5.0), урон (10).
  • Методы: ИскатьИгрока(), Кричать(), Атаковать().
  • Когда чертеж готов, Unity может создать по нему хоть одного, хоть тысячу монстров. У каждого из них будет свое здоровье, но вести себя они будут по одним и тем же правилам, описанным в классе.

    Как Unity и C# работают вместе

    В Unity все предметы, которые ты видишь на экране (деревья, камни, игрок, земля), называются GameObject (Игровой объект). Сам по себе GameObject — это просто пустышка, невидимая точка в пространстве.

    Чтобы точка стала деревом, на нее нужно повесить Component (Компонент). Компоненты — это детали конструктора. * Вешаешь компонент Mesh Filter — объект приобретает форму ствола и веток. * Вешаешь компонент Collider — объект становится твердым, сквозь него нельзя пройти.

    А теперь самое главное: каждый скрипт C#, который ты пишешь — это тоже компонент!

    Ты создаешь скрипт TreeHealth (Здоровье дерева), пишешь в нем, что у дерева 5 жизней, и просто перетаскиваешь этот скрипт мышкой на 3D-модель дерева в Unity. С этого момента дерево «оживает» и начинает подчиняться твоим правилам.

    Математика в играх: Как монстр находит игрока

    В программировании игр часто используется базовая школьная математика. Например, как монстр понимает, что ты подошел слишком близко и пора атаковать? Игра постоянно измеряет расстояние между точкой, где стоит монстр, и точкой, где стоишь ты.

    Для этого движок использует теорему Пифагора, рассчитывая расстояние между двумя точками в пространстве:

    Где: * — итоговое расстояние между объектами. * и — координаты монстра на карте. * и — координаты твоего персонажа.

    Если рассчитанное расстояние (меньше или равно 10 метрам), скрипт монстра запускает метод Attack(). Тебе не придется писать эту формулу вручную — в Unity уже есть встроенная команда Vector3.Distance, которая делает этот расчет за доли секунды, но важно понимать, как это работает внутри.

    Итоги

    * Unity — это визуальная среда и физический движок, который берет на себя графику, гравитацию и освещение. * C# — это язык программирования, с помощью которого мы пишем скрипты (правила логики) для нашей игры. * Переменные хранят данные (здоровье, ресурсы), а типы данных определяют, что именно мы храним (числа, текст, логику). * Методы заставляют объекты действовать (бегать, рубить, получать урон). * Скрипты в Unity работают как компоненты: мы пишем код и «прикрепляем» его к 3D-моделям, чтобы они начали взаимодействовать с игроком.

    2. Как понимать и писать свой первый код

    Как понимать и писать свой первый код

    Представь, что перед тобой чистый лист бумаги. У тебя есть идея: ты хочешь, чтобы главный герой твоей игры проснулся в лесу, нашел палку, соединил ее с камнем и получил топор. А если из кустов выскочит мутант, герой должен уметь от него убежать. В твоей голове это выглядит как захватывающий фильм. Но компьютер — это не человек. Он не умеет фантазировать и не понимает человеческую речь.

    Чтобы превратить фантазию в настоящую игру вроде Sons of the Forest, нужно перевести свои мысли на язык, который понимает машина. Этот процесс перевода и называется программированием. Сегодня мы разберем, как читать код, словно обычную книгу, и как написать свои первые правила для игрового мира.

    Анатомия скрипта: Читаем код как книгу

    Когда ты создаешь новый файл для кода в Unity (он называется скрипт), движок автоматически заполняет его базовым текстом. Для новичка этот текст выглядит как шифр из «Матрицы», но на самом деле это просто шаблон, пустая анкета, которую тебе нужно заполнить.

    Вот как выглядит абсолютно пустой скрипт на языке C#:

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

  • using UnityEngine; — это команда подключения библиотеки. Представь, что ты собираешься чинить велосипед. Прежде чем начать, ты достаешь ящик с инструментами. Эта строчка говорит компьютеру: «Достань ящик с инструментами Unity, они мне сейчас понадобятся». Без нее код не поймет, что такое 3D-модель или освещение.
  • public class PlayerSurvival : MonoBehaviour — это создание чертежа. Слово class означает «чертеж», а PlayerSurvival — это имя, которое мы ему дали (Выживание Игрока). Все, что находится внутри этого чертежа, будет относиться к нашему главному герою.
  • void Start() — это метод (действие), который срабатывает ровно один раз в самом начале. Как только ты нажимаешь кнопку «Играть», Unity читает то, что написано внутри Start, и выполняет это. Здесь удобно задавать начальные условия: например, выдать игроку 100 единиц здоровья при рождении.
  • void Update() — это сердце твоей игры. Этот метод срабатывает каждый кадр. Если твоя игра работает со скоростью 60 кадров в секунду (FPS), то код внутри Update будет выполняться 60 раз за одну секунду! Здесь мы пишем то, что должно происходить постоянно: проверка нажатия кнопок на клавиатуре, падение уровня сытости, гравитация.
  • > Компьютер делает ровно то, что вы ему приказываете, а не то, что вы хотите, чтобы он делал. Поэтому инструкции должны быть предельно точными. > > Codecademy

    Правила грамматики C#

    Как и в русском языке, в C# есть своя пунктуация. Если ты забудешь поставить запятую в диктанте, учитель снизит оценку. Если ты забудешь знак в коде, игра просто не запустится.

    * Точка с запятой ; — это точка в конце предложения. Каждая законченная мысль в коде должна заканчиваться этим знаком. Например: health = 100;. * Фигурные скобки { } — это коробки. Они показывают, где начинается и где заканчивается определенный блок кода. Обрати внимание на пример выше: у класса есть свои большие скобки, а внутри них лежат скобки поменьше для Start и Update. * Двойной слеш // — это комментарий. Все, что написано после двух косых черт, компьютер игнорирует. Это твои личные заметки на полях. Например: // Здесь я пишу код для прыжка.

    Главный герой: Учим персонажа жить

    Давай оживим нашего персонажа. В игре про выживание у героя всегда есть показатели, за которыми нужно следить. Создадим переменные для здоровья и жажды.

    Что здесь произошло? Мы создали две коробки (переменные). В коробку health положили число 100. В коробку thirst положили дробное число 100.0.

    В методе Update мы сказали игре: каждый кадр бери текущее значение жажды, отнимай от него 0.01 и клади обратно. Так как Update работает десятки раз в секунду, показатель жажды будет плавно ползти вниз, заставляя игрока искать воду.

    Логика принятия решений: Основы крафтинга

    Игра была бы скучной, если бы в ней ничего не менялось. Чтобы игра реагировала на действия игрока, используются условные операторы. Самый главный из них — это if (если).

    Логика if работает точно так же, как в реальной жизни. Если на улице дождь, то я беру зонт. Иначе я иду в кепке.

    Давай напишем базовую систему крафтинга копья. Для копья нам нужны 2 палки и 1 камень.

    Разберем магические символы внутри скобок if: * >= означает «больше или равно». Мы проверяем, есть ли у нас 2 палки или больше. * && означает логическое «И». Это значит, что для успеха должны выполниться оба условия: и палок должно хватать, И камней.

    | Знак в C# | Значение | Пример из жизни | |---|---|---| | == | Равно | if (key == 1) — Если у игрока есть ключ номер 1 | | != | Не равно | if (weather != "rain") — Если погода НЕ дождливая | | > | Строго больше | if (money > 100) — Если денег больше 100 | | && | И (оба верны) | if (hasWood && hasFire) — Если есть дрова И есть огонь | | || | ИЛИ (хотя бы одно) | if (isPoisoned || isBleeding) — Если отравлен ИЛИ истекает кровью |

    Важное замечание: один знак равно = используется, когда мы кладем что-то в коробку (присваиваем значение). Два знака равно == используются, когда мы сравниваем две вещи.

    Создание монстра: Математика охоты

    Теперь перейдем к самому интересному — врагам. Как каннибал в лесу понимает, что пора бежать за тобой? У него нет глаз, он не видит картинку на мониторе. Вместо этого он использует математику.

    У каждого объекта в 3D-мире есть свои координаты в пространстве. Игра постоянно измеряет расстояние между координатами монстра и координатами игрока.

    Для этого используется простое математическое условие:

    Где: * — это текущая дистанция (расстояние) между монстром и тобой. * — это радиус зрения монстра (например, 15 метров).

    Если дистанция становится меньше или равна радиусу , монстр «замечает» тебя и меняет свое поведение. В коде это выглядит так:

    А как монстр понимает, что догнал тебя и пора наносить урон? Точно так же, через условный оператор if, только дистанция для атаки будет гораздо меньше, например, 2 метра.

    Атака тоже подчиняется математике. Если монстр бьет героя, мы проверяем здоровье игрока:

    Где — это текущее здоровье главного героя. Если после удара здоровье опускается до нуля или уходит в минус, игра запускает анимацию падения и показывает экран «Вы погибли».

    Как научиться писать код самостоятельно

    Главная ошибка новичков — пытаться вызубрить код наизусть. Программирование — это не стих по литературе. Это конструктор Lego. Тебе не нужно помнить, как выглядит каждая деталька в мире, тебе нужно понимать, как они соединяются друг с другом.

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

  • Если игрок нажимает кнопку «E» рядом с костром.
  • И если у игрока есть сырое мясо.
  • То забрать сырое мясо.
  • Подождать 10 секунд.
  • Выдать жареное мясо.
  • Когда логика расписана по шагам, перевести ее на язык C# с помощью переменных и операторов if становится делом техники. Ты просто берешь словарь (документацию Unity) и ищешь нужные слова для своих действий.

    Итоги

    * Скрипт — это текстовый файл с инструкциями для Unity. Компьютер читает его строго сверху вниз. * Метод Start выполняется один раз при запуске, а метод Update работает постоянно, каждый кадр игры. * В C# строгие правила пунктуации: команды заканчиваются точкой с запятой ;, а блоки кода оборачиваются в фигурные скобки { }. * Условный оператор if — это главный инструмент логики. Он позволяет игре принимать решения в зависимости от ситуации (например, разрешать крафт только при наличии ресурсов). * Поведение врагов строится на математических проверках: игра постоянно сравнивает расстояние между объектами, чтобы понять, когда монстру нужно атаковать.