Найти тему
ElandGames

Основы языка C# для создания игр #1: Типы данных, условия и методы

Оглавление

Для создания игры нам понадобится куча всяких данных: количество здоровья, имена персонажей, длина маршрута, время действия эликсира и многое другое. Давайте разберёмся где и как нам всё это хранить при использовании языка C# и Unity.

В языке C# много типов данных, но как правило при создании игры мы будем пользоваться только несколькими основными, а потому не будем забивать голову тем, что нам скорее всего не понадобится. :) Понадобятся нам как правило только bool, int, float и string.

1. Переменная типа bool

Переменная типа bool может хранить в себе только значение true или false (истина или ложь). Например, переменная "естьТопор" может нам поведать есть он у главного героя или нет. Ответы типа "есть, но только обух" или "топора нет, но есть кувалда" не принимаются! Только конкретика!

Причем, язык программирования C# тоже очень чёткий и конкретный - если мы объявляем переменную, например isAxe, то должны перед её названием указать её тип и ничего другого, кроме данных этого типа, переменная хранить уже не сможет.

class - это можно сказать отдельная программа, в данном случае по имени Lesson, и внутри этой программы в фигурных скобках объявляются переменные, а перед переменными пишется их тип. Можем даже после знака равенства задать им начальное значение. Если его не задать, то по умолчанию будет false.
class - это можно сказать отдельная программа, в данном случае по имени Lesson, и внутри этой программы в фигурных скобках объявляются переменные, а перед переменными пишется их тип. Можем даже после знака равенства задать им начальное значение. Если его не задать, то по умолчанию будет false.

Булевые переменные принято именовать с приставкой "is", но это не является непререкаемым правилом, просто так удобно читать. Кто-то добавляет префиксы в виде символа подчеркивания или дополнительных букв, вкладывая в них какие-то смыслы (_isAxe или b_isAxe), но я лично люблю краткость и лаконичность.

Переменные/поля принято писать с маленькой буквы, но каждое последующее слово выделять заглавной: areYouUnderstandMe = true;

Наведя мышку на имя переменной в редакторе Visual Studio можно всегда увидеть к какому типу данная переменная относиться, а заодно и узнать, что переменные в языке C# принято называть "поле"
Наведя мышку на имя переменной в редакторе Visual Studio можно всегда увидеть к какому типу данная переменная относиться, а заодно и узнать, что переменные в языке C# принято называть "поле"

Что ещё можно сохранить в такой переменной? Жив ли главный герой, находится ли он в прыжке, пройден ли уровень, открыта ли дверь, понят ли смысл булевой переменной...

Функции и методы в С#

Смысл понятен, но как нам это пригодится? Вызываем пояснительную бригаду с примерами! Внутри программы (класса) кроме переменных (они же поля) есть ещё и функции (они же методы), которые эти переменные могут использовать для своих корыстных целей. Идентификатор void и скобки () после названия UseAxe нам намекают на то, что мы имеем дело с таким методом.

Названия методов принято писать с заглавной буквы
Названия методов принято писать с заглавной буквы

Условный оператор if (если)

В фигурных скобках метода ниже мы видим условную конструкцию if (), которая при выполнении условия в скобках, выполнит то, что будет написано уже в её теле (фигурных скобках). А написан там сейчас просто комментарий, который вообще не является частью программы, а служит только для нас пояснением "что тут вообще происходит" или напоминанием "что мы тут собирались сделать". Всё что написано после двух косых черт // - не считается!

Читается логично: Если топор есть, то достаём его и используем, а если нет, то ничего не делаем
Читается логично: Если топор есть, то достаём его и используем, а если нет, то ничего не делаем

Так вот условный оператор if как раз работает с булевыми значениями (true или false). И если значение true, то начинает выполнять то, что внутри его скобок, а если false, то даже с дивана не встанет.

2. Переменная типа int (integer)

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

Объявляем целочисленную переменную, которая будет в себе хранить количество землекопов и сразу задаём ей значение 7. По умолчанию переменная типа int имеет значение 0.
Объявляем целочисленную переменную, которая будет в себе хранить количество землекопов и сразу задаём ей значение 7. По умолчанию переменная типа int имеет значение 0.

Теперь давайте создадим метод ManageDiggers() и будем управлять количеством землекопов.

Точно также, заменив плюс на минус можно землекопов увольнять
Точно также, заменив плюс на минус можно землекопов увольнять

С умножением немного поменьше вариантов

Точно также мы можем и делить количество землекопов на определённое число
Точно также мы можем и делить количество землекопов на определённое число

А вот с делением есть нюанс!

7 делить на 2 - это конечно же 3,5, но дробное число запихнуть в переменную типа int не получится и значение округлится до меньшего. Поэтому 3.
7 делить на 2 - это конечно же 3,5, но дробное число запихнуть в переменную типа int не получится и значение округлится до меньшего. Поэтому 3.

Ну и давайте сделаем условную конструкцию с целыми числами и переменными, чтобы проверить достаточно ли у нас землекопов.

Если землекопов меньше чем 100, то сделать так, чтобы их было 100
Если землекопов меньше чем 100, то сделать так, чтобы их было 100

Но что если настанет зомби-апокалипсис и нам всё таки приспичит распилить одного землекопа? Тогда нам потребуется тип данных float!

3. Переменная типа float

Переменная типа float может хранить в себе дробные числа, как со знаком плюс, так и со знаком минус. Тут уже можно хранить всё делимое и всё, что требует особой точности, например зомби-землекопов, которые в любой комплектации спокойно себе ползают и чего-то копают. А также время, объём пива в кружке, координаты любимого трактира и даже степень того, насколько ты преисполнился в своём сознании, что все тебе теперь уже понятно.

Объём пинты пива в 0,568 литров величина постоянная, но мы можем ее хранить в переменной!
Объём пинты пива в 0,568 литров величина постоянная, но мы можем ее хранить в переменной!

Дробные числа на языке C# пишутся во-первых через точку, а во вторых с приставкой f. И никак иначе!

А вот и поучительный пример подъехал. Метод WeekEnd() вызывает метод DrinkBeer(), который на вход принимает значение типа int и использует его как внутреннюю переменную beer.

Переменная beer имеет тип int и в неё результат типа float записать нельзя - ошибка!
Переменная beer имеет тип int и в неё результат типа float записать нельзя - ошибка!

Целые числа сохранять в дробные переменные можно, а вот наоборот нельзя, иначе мы теряем ценные миллилитры пива!

А вот сравнивать дробные и целые числа можно без проблем!

Знак неравенства != тоже активно используется в условных конструкциях
Знак неравенства != тоже активно используется в условных конструкциях

4. Переменная типа string (строка)

Переменная типа string может хранить в себе символы, например, имя персонажа, название оружия, наименование товара или серийный номер алмазного меча.

Значение типа string должно быть в кавычках, чтобы программа поняла, что это символы, а не имена переменных. Оно может содержать буквы, цифры, пробелы, символы и даже быть пустым.
Значение типа string должно быть в кавычках, чтобы программа поняла, что это символы, а не имена переменных. Оно может содержать буквы, цифры, пробелы, символы и даже быть пустым.

Строковые переменные можно складывать между собой и даже сравнивать.

Знак = в языке C# это присвоение значения, а вот чтобы сравнить, равно ли одно значение другому,  используется оператор ==
Знак = в языке C# это присвоение значения, а вот чтобы сравнить, равно ли одно значение другому, используется оператор ==

Условный оператор может содержать дополнение в виде else (иначе). Else содержит свою часть кода, которая выполнится в случае, если условие в скобках у if ложно.

Кроме того может содержать и множество условий else if (иначе если), истинность которых будет проверяться по очереди, если предыдущие условия ложные.

Если переменная isGameOver не ложна (! - восклицательный знак означает НЕ, т.е. отрицание), то проверяется второе условие - равен ли уровень 100. Если оба условия ложны, то выполняется тело оператора else.
Если переменная isGameOver не ложна (! - восклицательный знак означает НЕ, т.е. отрицание), то проверяется второе условие - равен ли уровень 100. Если оба условия ложны, то выполняется тело оператора else.

Привести числовое значение к строковому можно с помощью метода ToString(). Привести дробное число к целому, отбросив дробную часть, можно добавив (int) перед переменной.

Вот такая база! 4 основных типа переменных, методы, математические операции и условный оператор - это то, что нам нужно в первую очередь. Если статья была для вас полезна, то не поскупитесь поставить лайк и оставить комментарий. :) А если хотите продолжения, то подписывайтесь на канал и заглядывайте в подборку статей по разработке игры на Unity - там тоже много интересного!

Учимся делать игры и программировать на C# | Сергей Эланд | Дзен