Menu
CoddyTech

Подбираемые предметы

Часть раздела Физика и игровой процесс путешествия по 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) удалил бы игрока.

challenge icon

Задание

Легко

Игрок носит 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 игрока забирает столько, сколько может вместить; остальное остаётся в ящике, который исчезает, когда опустеет
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс