Menu
CoddyTech

Зоны гибели

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 18 из 63.

Зона поражения — это триггер над областью, куда игрок не должен попадать: лавой, шипами или пустым пространством под уровнем. При входе в неё игрок возвращается в точку появления. Здесь это делает собственный скрипт лавы, а точка появления задаётся в поле Transform в Inspector:

public Transform spawnPoint;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        other.transform.position = spawnPoint.position;
        other.attachedRigidbody.linearVelocity = Vector3.zero;
    }
}

other.attachedRigidbody — это Rigidbody, которому принадлежит вошедший коллайдер. Установка transform.position телепортирует игрока — именно это и нужно для возрождения. Однако Rigidbody сохраняет скорость после прыжка: игрок, упавший со скоростью 10 единиц в секунду, появится в точке появления и продолжит падать с той же скоростью, а тот, кто вбежал в лаву, продолжит бежать и сразу снова попадёт в неё. Установка linearVelocity в значение Vector3.zero позволяет появиться на месте. Проверка тега оставляет всё остальное, что упадёт в лаву, на месте.

challenge icon

Задание

Легко

Игрок пересекает узкий мост над пустотой, его толкают силы, приложенные клавишами со стрелками; эта часть уже написана. Триггер с тегом KillZone заполняет пространство внизу, а флаг с тегом Checkpoint, тоже являющийся триггером, стоит посередине моста. Добавь в скрипт игрока точки возрождения:

  • Когда игра начинается, точка возрождения находится там, где стоит игрок.
  • Прикосновение к Checkpoint делает позицию игрока в этот момент новой точкой возрождения.
  • При входе в KillZone игрок возвращается в точку возрождения и останавливается.

Нажми Play и сойди с моста, затем нажми Check.

Попробуйте сами

using UnityEngine;

public class Player : MonoBehaviour
{
    public float force = 12f;
    Rigidbody body;
    Vector3 input;
    // respawn: место, где игрок появляется снова

    void Start()
    {
        body = GetComponent<Rigidbody>();
    }

    void Update()
    {
        input = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"));
    }

    void FixedUpdate()
    {
        body.AddForce(input * force);
    }

    // Checkpoint: запомнить местоположение игрока. KillZone: вернуть его туда и остановить.
}
quiz iconПроверьте себя

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

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