Menu
CoddyTech

Zonas letales

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 19 de 71.

Una zona mortal es un activador colocado sobre un lugar al que el jugador no debe llegar: lava, pinchos o el vacío bajo el nivel. Al entrar en ella, el jugador vuelve a un punto de aparición. En este caso, el propio script de la lava lo hace, con el punto de aparición en un campo Transform configurado en el Inspector:

public Transform spawnPoint;

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

other.attachedRigidbody es el Rigidbody al que pertenece el colisionador que entra. Asignar un valor a transform.position teletransporta al jugador, que es lo que se necesita para reaparecer. Sin embargo, un Rigidbody conserva su velocidad durante el salto: un jugador que cayó a 10 unidades por segundo llega al punto de aparición todavía cayendo a 10, y uno que corrió hacia la lava sigue corriendo, directamente hacia ella otra vez. Asignar Vector3.zero a linearVelocity hace que llegue sin moverse. La comprobación de la etiqueta deja en su sitio cualquier otra cosa que caiga en la lava.

challenge icon

Desafío

Fácil

Haz que el jugador reaparezca. Este script está en el jugador, así que mueve transform y body, no other.

  1. En Start(), asigna al campo Vector3 respawn el valor transform.position.
  2. En OnTriggerEnter(Collider other), cuando other.CompareTag("Checkpoint"), asigna respawn = transform.position;.
  3. Cuando other.CompareTag("KillZone"), asigna transform.position = respawn; y body.linearVelocity = Vector3.zero;.

Pulsa «Jugar» y sal caminando del puente. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class Player : MonoBehaviour
{
    public float force = 12f;
    Rigidbody body;
    Vector3 input;
    // reaparición: lugar al que vuelve el jugador

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

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

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

    // Checkpoint: recuerda dónde está el jugador. KillZone: vuelve a ese lugar y se queda quieto.
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity