Menu
CoddyTech

Зоны смерти

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

Зона гибели — это триггер, расположенный над местом, куда игрок не должен попасть: лавой, шипами или пустотой под уровнем. При попадании в неё игрок возвращается в точку появления. Здесь за это отвечает собственный скрипт лавы, а точка появления задаётся в поле 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 единиц в секунду, окажется в точке появления всё ещё падая со скоростью 10, а тот, кто вбежал в лаву, продолжит бежать и снова попадёт в неё. Присваивание linearVelocity значения Vector3.zero приводит к тому, что игрок появляется неподвижно. Проверка тега оставляет всё остальное, что упадёт в лаву, на месте.

challenge icon

Задание

Легко

Добавь игроку возрождение. Этот скрипт находится на игроке, поэтому он перемещает transform и body, а не other.

  1. В Start() присвой полю Vector3 respawn значение transform.position.
  2. В OnTriggerEnter(Collider other), когда other.CompareTag("Checkpoint"), присвой respawn = transform.position;.
  3. Когда other.CompareTag("KillZone"), присвой transform.position = respawn; и body.linearVelocity = Vector3.zero;.

Нажми «Играть» и сойди с моста. Затем нажми «Проверить».

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

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: вернуть его в эту точку без движения.
}

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

Потренируйтесь самостоятельно: Песочница Unity