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

Если вы пропустили часть 2, нажмите здесь.

Чтобы ознакомиться с моим планом обучения, нажмите здесь.

Эта неделя была немного более сложной, я думаю, что в целом это хорошо. Расчет стал немного сложнее. Я начал понимать, что моя память о триггерах, полиномах и основных графиках немного туманна. Так что я откладываю вычисления на второй план и просматриваю Книгу Экслера по предварительному исчислению.

На прошлой неделе я закончил читать «Визуальное повествование игр» и «Основные принципы C#» от Pullasight, поэтому на этой неделе основное внимание было уделено продолжению изучения C# с помощью второго курса по равенству/желтой книге C# и продолжению изучения разработки двухмерных игр на Unity.

Создание боевой системы

В книге по разработке 2D-игр основное внимание в последних нескольких главах уделялось созданию боевой системы. Одним из ключевых выводов из этого раздела было использование системы анимации Unity для управления игровыми состояниями. Честно говоря, последние несколько глав было немного сложно осмыслить, поэтому я постараюсь изо всех сил объяснить, как мы создавали боевую систему.

  1. Сначала мы настроим нашу сцену битвы. Используя анимацию и многое другое, мы создали вступительный экран, заполнив экран врагами и создав пользовательский интерфейс.
  2. Перед всем этим важно, чтобы мы конкретизировали, как будет выглядеть наша боевая система, и решили, какие действия может выполнять игрок. Для этого это была пошаговая система, в которой игрок мог атаковать, использовать предмет или бежать.
  3. Таким образом, чтобы управлять всеми состояниями битвы (например: боевая нагрузка, вступление, движение игрока, атака игрока, смена управления, атака противника, выход из битвы), нам нужен пустой игровой объект, который будет служить нашим менеджером битвы.
  4. После этого мы переходим на экран анимации и настраиваем боевые состояния и различные триггеры, которые будут переходить из одного состояния в другое.
  5. Нам нужны некоторые дополнительные скрипты, такие как атака игрока и управление противником, с которыми будет взаимодействовать боевой менеджер.
  6. Таким образом, в основном, когда битва начинается, менеджер битвы инициирует загрузку сцены битвы, а затем переходит к ходу игрока. Затем игрок выбирает действие, запуская анимацию своей атаки и передавая контроль противнику. Затем противник также совершит действие, которое затем вызовет возвращение под контроль игрока. Написание этого на самом деле кажется довольно простым, да? Тогда у вас будут дополнительные ловушки, где, если врагов больше нет, то битва окончена.
  7. Одной из вещей, представленных в книге на этом этапе, было использование эффектов частиц для анимации атак.

Честно говоря, этот раздел был очень длинным, поэтому, несмотря на то, что все звучит относительно просто, очевидно, что в него входит много вещей.

С# Равенство

Этот класс мне сейчас не очень нравится в связи с курсом основ C#. Большинство курсов представляют собой что-то вроде кода, но этот курс даже не кажется таким. Первые два раздела представляют собой обзор функций равенства dotnet и равенства C#. Третий показывает вам, как переопределить эти методы, но предоставленный код на самом деле является просто готовым продуктом. Мне пришлось удалить материал, чтобы я мог следовать за ним. Но тем не менее, есть некоторые хорошие инсайты из курса.

  1. Почему равенство C# может быть сложным? C# не предоставляет никакого синтаксического способа различения равенства ссылок и равенства значений.
  2. dotnet предоставляет несколько дополнительных методов для проверки равенства. Есть obj1.Equals(obj2), object.Equals(obj1,obj2) и object.ReferenceEquals(obj1, obj2). Как правило, равенство объектов осуществляется по ссылке, а равенство значений — по значению. Одним заметным исключением является строка, которая оценивается по значению, а не по ссылке. Использование object.Equals() будет работать, если obj1 имеет значение null, тогда как obj1.Equals() вызовет ошибку.
  3. Во всех трех случаях объекты приводятся к классу объектов, что означает, что ни один из них не является типобезопасным, что может привести к проблемам с производительностью. Если у вас есть тип книги и тип автомобиля, они никак не могут быть равны, но точечные методы все равно приведут их к общим объектам.

Здесь типы значений означают не примитивные типы, а такие вещи, как struct. Бокс означает размещение вещей в общих типах объектов, в то время как отражение означает доступ к проверке классов, полей, методов во время выполнения, а не во время компиляции. И последнее, вы можете себе представить, если у вас есть тип объекта, для которого вы хотите использовать настраиваемое равенство. Скажем, вы хотите сказать, что равные означают, что они имеют одно и то же поле имени или что-то еще, а не КАЖДОЕ отдельное поле. Итак, чтобы обойти равенство, вам нужно сделать 5 вещей.

В основном вы хотите, чтобы все методы/операторы equals делали одно и то же. Как ты это делаешь?

Основной процесс для типов значений выглядит следующим образом:

  1. Реализуйте IEquatable‹T›, который является тестом на равенство, безопасным для типов.
  2. Затем сделайте оператор object.Equals и ==, чтобы указать на этот метод. != может просто вернуть противоположное ==.
  3. Затем вам нужно переопределить .GetHashCode(). Почему? GetHashCode возвращает 32-битное целое число, представляющее этот объект. Одно важное требование к хэш-кодам заключается в том, что если два объекта равны, то их хэш-коды тоже должны быть одинаковыми.

После этого все готово. Следующий блок будет о том, как переопределить это для типов объектов, потому что процесс, по-видимому, немного отличается.

С# Желтый

Последние несколько разделов посвящены обработке ошибок и потокам. Материал обработки ошибок был довольно общим, используйте try catch finally, но многопоточность была довольно интересной. Это то, с чем я не знаком или что было возможно в javascript.

Клон летающей птицы

На этой неделе я чувствовал себя немного менее продуктивным, чем в предыдущие недели. Материалы Pluralsight не заставляют вас заниматься своими делами или пробовать что-то новое. Это весь код вместе с вещами. Дизайн игр Unity 2D немного помогает, но вначале я ничего не расширял, так что теперь я фактически отложил последние несколько глав и вернулся к этому курсу udemy.

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

Последние мысли

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