Подбираемые предметы
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 17 из 63.
Подбираемый предмет — это триггер с собственным скриптом. Когда в него что-то попадает, предмет проверяет, игрок ли это, передаёт ему свой эффект и уничтожает себя. Скрипт игрока хранит результат и предоставляет для этого открытый метод. Этот аптечный набор лечит любой объект, у которого есть скрипт Health:
// HealthPack.cs
public int amount = 25;
void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out Health health) && health.hp < 100)
{
health.Heal(amount);
Destroy(gameObject);
}
}// Health.cs, у игрока
public int hp = 50;
public void Heal(int amount)
{
hp = Mathf.Min(hp + amount, 100);
Debug.Log("HP: " + hp);
}other.TryGetComponent(out Health health) возвращает false, если в аптечный набор врезается скользящий ящик, поэтому взять его может только объект со скриптом Health, а игрок с полным запасом здоровья оставляет аптечный набор на потом. Аптечный набор находит игрока через other, поэтому ссылку на него не нужно задавать в Inspector, а на уровне может быть пятьдесят таких наборов. Heal — public, потому что его вызывает другой скрипт, а ограничение в 100 находится в Health — единственном месте, где хранится hp. Destroy(gameObject) удаляет аптечный набор; Destroy(other.gameObject) удалил бы игрока.
Задание
ЛегкоИгрок носит Blaster: ammo (4 в начале) и maxAmmo (10). Стрелки перемещают его, а пробел позволяет стрелять; оба действия уже реализованы. Сделай так, чтобы ящики с боеприпасами пополняли их запас:
- В
Blaster.csдобавь публичный методint AddAmmo(int amount). Он берет изamountстолько, сколько помещается доmaxAmmo, выводит в лог новое общее количество, напримерAmmo: 7, и возвращает количество взятых боеприпасов. - В
AmmoCrate.cs, когда игрок входит в ящик, предложи Blaster взять боеприпасы в количествеamountиз ящика и вычти взятое количество. Опустевший ящик удаляется; ящик, в котором еще остались боеприпасы, остается на месте с оставшимся количеством до следующего посещения.
В первом ящике 3 боеприпаса, а во втором — 5. Нажми Play, пройди вправо, сделай несколько выстрелов и вернись во второй ящик, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class AmmoCrate : MonoBehaviour
{
public int amount = 3;
void OnTriggerEnter(Collider other)
{
// Blaster игрока забирает столько, сколько может вместить; остальное остаётся в ящике, который исчезает, когда опустеет
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора