Menu
CoddyTech

Gestalte es selbst

Lektion 19 von 19 im Kurs Unity-Spiel: Brick Breaker von Coddy.

Das letzte Feature ist ein Bestwert, der über mehrere Spiele hinweg bestehen bleibt. PlayerPrefs speichert kleine Werte auf dem Gerät des Spielers: PlayerPrefs.GetInt(key, 0) liest einen Wert aus, standardmäßig 0, wenn noch nichts gespeichert wurde, und PlayerPrefs.SetInt(key, value) speichert einen Wert. „Erneut spielen“ lädt die Szene neu, und der neue GameManager lädt wieder den Bestwert.

Jetzt kannst du das Spiel nach deinen Vorstellungen anpassen. Jede Zahl, die festlegt, wie es sich spielt, ist ein Feld mit einem Startwert im Code, und der Inspector des Spielers ist schreibgeschützt. Ändere sie also hier:

  • Ball: speed (9) und minVertical (0.3).
  • Paddle: speed (14), wideFactor (1.6) und wideSeconds (8).
  • GameManager: lives (3) und dropChance (0.15).
challenge icon

Aufgabe

Schwer

Behalte den besten Punktestand zwischen den Spielen und passe anschließend das Spiel an.

  1. Füge in GameManager public TMP_Text bestText; und int best; hinzu; Start() beginnt mit best = PlayerPrefs.GetInt("BestScore", 0);
  2. ShowHud() setzt auch bestText.text = "Best: " + best;
  3. Wenn das letzte Leben bei score > best verloren geht, setze best, PlayerPrefs.SetInt("BestScore", best); und rufe ShowHud() auf.
  4. Passe die Geschwindigkeiten, die Leben und dropChance dort an, wo sie im Code deklariert sind.

Drücke „Spielen“ und stelle einen Bestwert auf: Er bleibt auch nach „Erneut spielen“ erhalten. Drücke dann „Prüfen“.

Probier es selbst

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public string[] levels;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;

    public Ball ball;
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;
    public GameObject gameOverPanel;
    public GameObject[] powerUps;
    public float dropChance = 0.15f;

    int score;
    int level;
    int bricksLeft;
    List<Ball> balls = new List<Ball>();

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        balls.Add(ball);
        BuildLevel(0);
        ShowHud();
    }

    void BuildLevel(int index)
    {
        level = index;
        string[] rows = levels[index].Split('/');
        for (int row = 0; row < rows.Length; row++)
        {
            string line = rows[row];
            float left = -(line.Length - 1) * spacingX / 2f;
            for (int col = 0; col < line.Length; col++)
            {
                char c = line[col];
                if (c == '.') continue;
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(c - '0');
                bricksLeft++;
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
        bricksLeft--;
        ShowHud();
        if (Random.value < dropChance)
        {
            GameObject prefab = powerUps[Random.Range(0, powerUps.Length)];
            Instantiate(prefab, brick.transform.position, Quaternion.identity);
        }
        if (bricksLeft == 0)
        {
            balls[0].ResetToPaddle();
            BuildLevel((level + 1) % levels.Length);
        }
    }

    public void BallLost(Ball lost)
    {
        if (balls.Count > 1)
        {
            balls.Remove(lost);
            Destroy(lost.gameObject);
            return;
        }
        lives--;
        ShowHud();
        if (lives == 0)
        {
            gameOverPanel.SetActive(true);
            lost.gameObject.SetActive(false);
        }
        else lost.ResetToPaddle();
    }

    public void SplitBall()
    {
        Ball source = balls[0];
        Ball left = Instantiate(source, source.transform.position, Quaternion.identity);
        left.Launch(new Vector3(-0.6f, 1f, 0f));
        balls.Add(left);
        Ball right = Instantiate(source, source.transform.position, Quaternion.identity);
        right.Launch(new Vector3(0.6f, 1f, 0f));
        balls.Add(right);
    }

    public void PlayAgain()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void ShowHud()
    {
        scoreText.text = "Score: " + score;
        livesText.text = "Lives: " + lives;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground