Titel und erneut spielen
Lektion 20 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Zum Schluss bekommt das Spiel einen Anfang und ein Ende. Es startet mit einem Titelbildschirm: dem Namen, dem Bestwert und der Aufforderung, zum Starten zu springen. Die Straße bleibt stehen und die Tasten bewirken nichts, bis eine Sprungtaste (Leertaste oder W) den Lauf startet.
Dafür braucht es neben over einen zweiten Zustand: running. GameOver beendet den Lauf, und wenn du danach eine Sprungtaste drückst, wird die Szene erneut geladen. Dadurch wird alles auf den Anfangszustand zurückgesetzt:
if (over && (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)))
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}Der Bestwert wird in PlayerPrefs gespeichert, sodass er das erneute Laden übersteht.
Aufgabe
Mittel- Füge in
GameManagerusing UnityEngine.SceneManagement;undpublic bool running;hinzu. Start setztspeed = 0fund die Titelmeldung. - In Update: Leertaste oder W startet den Lauf, wenn das Spiel weder läuft noch beendet ist (
running = true, leere Meldung); Leertaste oder W lädt nach einem Game Over die Szene erneut; und wenn das Spiel nicht läuft, wird die Ausführung beendet. - GameOver kehrt jetzt zurück, wenn das Spiel nicht läuft, setzt
running = falseund beendet die Meldung mit"\nJump to run again". - Lies in
Runnerdie Tasten und Trigger nur aus, wenngame.runninggilt.
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 float magnetTime = 8f;
public int lane;
public float magnet;
public bool shield;
private CharacterController controller;
private GameManager game;
private Renderer body;
private float fallSpeed;
private float slide;
private Color color;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
body = GetComponent<Renderer>();
color = body.material.color;
}
void Update()
{
if (!game.over)
{
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 (magnet > 0f) magnet -= Time.deltaTime;
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);
body.material.color = shield ? new Color(0.3f, 0.9f, 1f) : color;
ShowPower();
}
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;
}
void ShowPower()
{
string text = "";
if (magnet > 0f) text = "Magnet " + Mathf.CeilToInt(magnet);
if (shield) text += (text == "" ? "" : " ") + "Shield";
game.powerText.text = text == "" ? " " : text;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
if (shield)
{
shield = false;
Destroy(other.gameObject);
return;
}
game.GameOver();
}
else if (other.CompareTag("Coin"))
{
game.AddCoin();
Destroy(other.gameObject);
}
else if (other.CompareTag("Magnet"))
{
magnet = magnetTime;
Destroy(other.gameObject);
}
else if (other.CompareTag("Shield"))
{
shield = true;
Destroy(other.gameObject);
}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground