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) undminVertical(0.3).Paddle:speed(14),wideFactor(1.6) undwideSeconds(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.
Aufgabe
Schwer- Füge in
GameManagerpublic TMP_Text bestTexthinzu (die Szene verknüpft BestText) sowie einint best. Lade inStart()bestaus PlayerPrefs unter dem SchlüsselBestScore; wenn nichts gespeichert ist, verwende 0.ShowHud()zeigt inbestTextauchBest: 0zusammen mit dem Bestwert an. - Wenn das Spiel mit einem Punktestand endet, der höher als
bestist, speichere ihn inbest, speichere ihn unterBestScoreund 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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.