Menu
CoddyTech

Mach es zu deinem eigenen

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

Die letzte Funktion ist ein Bestwert, der über mehrere Spiele hinweg erhalten bleibt. PlayerPrefs speichert kleine Werte auf dem Gerät des Spielers: PlayerPrefs.GetInt(key, 0) liest einen Wert aus und gibt 0 zurück, wenn noch nichts gespeichert wurde, und PlayerPrefs.SetInt(key, value) speichert einen Wert. Lade den Bestwert, wenn das Spiel startet, und speichere ihn, wenn ein Spiel mit einem höheren Punktestand endet. „Erneut spielen“ lädt die Szene neu, und der neue GameManager lädt den Bestwert erneut.

Danach kannst du das Spiel nach deinen Vorstellungen anpassen. Jede Zahl, die festlegt, wie es sich spielt, ist ein Feld mit einem Anfangswert im Code:

  • Ball: speed (9) und minVertical (0.3).
  • Paddle: speed (14), wideFactor (1.6) und wideSeconds (8).
  • GameManager: lives (3), dropChance (0.15) und der Abstand zwischen den Steinen.

Die Layouts sind die levels-Liste des GameManager im Inspector: Eine Ziffer steht für einen Stein mit entsprechend vielen Treffern, ein Punkt für eine Lücke und / beginnt die nächste Zeile, zum Beispiel 1.3.1/22222. Ändere in deinem eigenen Unity-Projekt die Werte im Inspector: Sobald ein Skript einem Objekt zugewiesen ist, speichert der Inspector eine eigene Kopie, und ein neuer Anfangswert im Code wird nicht mehr übernommen.

challenge icon

Aufgabe

Schwer
  1. Füge in GameManager public TMP_Text bestText hinzu (die Szene verknüpft BestText) sowie ein int best. Lade in Start() best aus PlayerPrefs unter dem Schlüssel BestScore; wenn nichts gespeichert ist, verwende 0. ShowHud() zeigt in bestText auch Best: 0 zusammen mit dem Bestwert an.
  2. Wenn das Spiel mit einem Punktestand endet, der höher als best ist, speichere ihn in best, speichere ihn unter BestScore und zeige ihn an.

Gestalte das Spiel dann nach deinen Vorstellungen: Ändere die Geschwindigkeiten, die Leben, die Drop-Chance und die Stärke der Power-ups und spiele, bis es sich richtig anfühlt.

Drücke Play, stelle einen Bestwert auf und klicke dann auf Check.

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