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.
Aufgabe
Mittel- Füge in
GameManagerpublic TMP_Text messageText;undpublic bool over;hinzu. - Füge
public void GameOver()hinzu: Wennoverbereits true ist, gib die Funktion zurück; andernfalls setzeover = true,speed = 0fundmessageText.text = "Game over". - Füge am Anfang von Update in GameManager
if (over) return;ein. - Suche in
Runnerin Start nach dem GameManager, lies die Tasten nur, solange!game.overgilt, und füge wie obenOnTriggerEnterhinzu.
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