Menu
CoddyTech

Zusammenstoß

Lektion 11 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.

Die Hindernisse sind Trigger: Sie erkennen den Läufer, ohne ihn wegzustoßen. Wenn der CharacterController des Läufers und ein Trigger aufeinandertreffen, ruft Unity OnTriggerEnter in den Skripten des Läufers auf und übergibt den Collider des Triggers:

void OnTriggerEnter(Collider other)
{
    if (game.over) return;
    if (other.CompareTag("Obstacle"))
    {
        game.GameOver();
    }
}

GameOver beendet den Lauf: over wird zu true, die Geschwindigkeit wird auf 0 gesetzt, sodass die Straße anhält, und die Meldung in der Bildschirmmitte zeigt das an. Solange over true ist, zählt der GameManager die zurückgelegte Strecke nicht weiter und der Runner liest die Tasten nicht mehr aus.

challenge icon

Aufgabe

Mittel
  1. Füge in GameManager public TMP_Text messageText; und public bool over; hinzu.
  2. Füge public void GameOver() hinzu: Wenn over bereits true ist, gib die Funktion zurück; andernfalls setze over = true, speed = 0f und messageText.text = "Game over".
  3. Füge am Anfang von Update in GameManager if (over) return; ein.
  4. Suche in Runner in Start nach dem GameManager, lies die Tasten nur, solange !game.over gilt, und füge wie oben OnTriggerEnter hinzu.

Probier es selbst

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;
    public float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;
    private float slide;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
        if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
        bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
        if (jump && controller.isGrounded)
        {
            fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
            StopSlide();
        }
        if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
        {
            slide = slideTime;
            Resize(0.5f);
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }

    void StopSlide()
    {
        if (transform.localScale.y < 1f) Resize(1f);
        slide = 0f;
    }

    void Resize(float height)
    {
        controller.enabled = false;
        transform.position += Vector3.up * (height - transform.localScale.y);
        transform.localScale = new Vector3(1f, height, 1f);
        controller.enabled = true;
    }
}

Alle Lektionen in Unity-Spiel: Himmelsbahnen

Übe selbstständig: Unity-Playground