Menu
CoddyTech

Überleben und Punkte sammeln

Teil des Abschnitts Grundlagen des Scripting in Unity der Unity-Journey von Coddy. Lektion 64 von 67.

challenge icon

Aufgabe

Mittel

Letzter Schritt: eine Punktzahl und ein Spiel, das schwieriger wird. Behalte alles aus den vorherigen Schritten bei und ergänze:

  • Ein float namens score, der die überlebten Sekunden zählt: Addiere bei jedem Frame, während das Spiel läuft, die Zeit des Frames dazu.
  • Ein Feld speedUp, dessen Wert im Inspector festgelegt wird (0.2). fallSpeed erhöht sich jede Sekunde um speedUp, in jedem Frame ein kleines bisschen, sodass die Blöcke immer schneller fallen.
  • Gib bei einem Treffer Game over! Score: 12 statt Game over aus, mit der Anzahl der vollen Sekunden von score (wandle den Wert in ein int um).

Drücke Play und übertriff deine Punktzahl, dann Check.

Probier es selbst

using System.Collections.Generic;
using UnityEngine;

public class Runner : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    [SerializeField] private float laneEdge = 4f;
    [SerializeField] private GameObject blockPrefab;
    [SerializeField] private float spawnEvery = 1f;
    [SerializeField] private float fallSpeed = 5f;

    private List<GameObject> blocks = new List<GameObject>();
    private float timer;

    void Update()
    {
        Vector3 p = transform.position;
        p.x += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
        p.x = Mathf.Clamp(p.x, -laneEdge, laneEdge);
        transform.position = p;

        timer += Time.deltaTime;
        if (timer >= spawnEvery)
        {
            timer = 0f;
            Vector3 spot = new Vector3(Random.Range(-laneEdge, laneEdge), 10f, 0f);
            blocks.Add(Instantiate(blockPrefab, spot, Quaternion.identity));
        }

        for (int i = blocks.Count - 1; i >= 0; i--)
        {
            blocks[i].transform.position += Vector3.down * fallSpeed * Time.deltaTime;
            Vector3 b = blocks[i].transform.position;
            if (Mathf.Abs(b.x - transform.position.x) < 1f && Mathf.Abs(b.y - transform.position.y) < 1f)
            {
                Debug.Log("Game over");
                enabled = false;
                return;
            }
            if (b.y < -1f)
            {
                Destroy(blocks[i]);
                blocks.RemoveAt(i);
            }
        }
    }
}

Alle Lektionen in Grundlagen des Scripting in Unity