Теперь, когда у нас есть игровой мир и мы улучшили его взаимодействие с персонажем, пришло время сделать игровой процесс интересным. Давайте добавим в игру коллекционные предметы, которые Ruby может собирать.
Хорошим примером для демонстрации коллекционных предметов являются "аптечки", восполняющие здоровье персонажа. Но прежде чем мы сможем пополнять здоровье Ruby, давайте зададим ему начальное значение этого здоровья.
Для этого нам необходимо в скрипте определить переменную, которая будет отвечать за текущее значение здоровья:
int currentHealth;
А также переменную, с помощью которой мы легко можем задать максимальное количество здоровья, которое может иметь Ruby (для начала оно будет равно 5):
public int maxHealth = 5;
Тип переменной int сообщает компьютеру, что требуется сохранить целое число. У Ruby не может быть 4,325 здоровья, только целое число.
Префикс public означает, что переменная общедоступная и можно получить доступ к ее значению извне скрипта. В этом случае Unity отобразит их внутри компонента скрипта в инспекторе.
В методе Start инициализируйте текущее здоровье максимальным здоровьем, чтобы когда игра началась, ваш персонаж имел полное здоровье:
currentHealth = maxHealth;
А теперь давайте добавим собственный метод, который будет изменять здоровье персонажа:
void ChangeHealth(int amount)
{
currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
Debug.Log(currentHealth + "/" + maxHealth);
}
Давайте подробно рассмотрим этот метод. Первая строка называется объявлением функции и очень похоже на функции Start и Update. Слово void в этой строке void означает «ничего», потому что функция не возвращает никакого значения, она просто изменяет здоровье. Затем идет название метода - ChangeHealth. И в отличие от функций Start и Update, далее внутри скобок находится переменная, которая является параметром метода. Параметр представляет собой количество единиц здоровья, на которое нужно изменить текущее значение здоровья. При использовании этого метода в качестве параметра задается любое целое число, например. 2 или -1. Если нам необходимо увеличить здоровье, то мы используем положительное число, а если нужно уменьшить текущее здоровье, то используем отрицательное число.
Внутри фигурных скобок написано тело метода, которое состоит из 2 строк.
Сначала разберем метод встроенной математической функции Mathf.Clamp. Если вы попытаетесь добавить значение 2 к здоровью, когда Ruby уже имеет полное здоровье, оно превысит максимальное значение здоровья. Точно так же, если у Ruby осталось 1 количество здоровья, а вы попытаетесь удалить 2, то здоровье Руби станет отрицательным.
Функция Mathf.Clamp гарантирует, что первый параметр (currentHealth + amount) никогда не будет ниже второго параметра (здесь 0 ) и никогда не превысит третий параметр (здесь maxHealth).
Таким образом, если мы попытаемся отнять от 1 единицы здоровья еще две, то текущее здоровье станет равным не -1, а 0. И здоровье Ruby всегда будет оставаться между 0 и maxHealth.
Вторая строка при помощи встроенного метода Debug.Log выведет на консоль значение вычисленного здоровья в окне консоли. В нашей игре пока нет графики или текста, показывающих состояние здоровья Ruby, поэтому мы будем использовать вывод в консоль, чтобы убедиться, что все работает правильно.
Чтобы вывод двух значений сделать удобным, при формировании строки вывода используется косую черту (/) между currentHealth и maxHealth для объединения двух значений в удобочитаемую строку.
Проверьте свой скрипт:
Сохраните скрипт и вернитесь в редактор Unity. Выберите в иерархии объект Ruby и в инспекторе в компоненте скрипта вы увидите новое свойство Max Health, так как для этой переменной мы добавили модификатор «public»:
Сейчас значение в этом поле равно 5, так как мы установили его в скрипте при определении переменной. Если вы введете в это поле значение 10, то когда функция Start выполнится при запуске игры, строка
currentHealth = maxHealth;
установит текущее здоровье на 10.
В качестве упражнения попробуйте определить новую переменную, чтобы иметь возможность изменять скорость вашего персонажа, вместо использования значения 3.0f , которое вы указываем непосредственно в коде в предыдущей части:
public float speed = 3.0f;
И замените эти значения на новую переменную:
position.x = position.x + speed * horizontal * Time.deltaTime;
position.y = position.y + speed * vertical * Time.deltaTime;
Проверьте скрипт и обратите внимание, что методы Start, Update и ChangeHealth я не удалила, а просто свернула для удобства демонстрации кода:
Сохраните скрипт и изменения в проекте.