Make It Yours
Lesson 19 of 19 in Coddy's Unity Game: Brick Breaker course.
The last feature is a best score that lasts between games. PlayerPrefs keeps small values on the player's device: PlayerPrefs.GetInt(key, 0) reads one, 0 when nothing is saved yet, and PlayerPrefs.SetInt(key, value) saves one. Play Again reloads the scene, and the new GameManager loads the best again.
Then the game is yours to tune. Every number that sets how it plays is a field with a starting value in the code, and the player's Inspector is read-only, so change them there:
Ball:speed(9) andminVertical(0.3).Paddle:speed(14),wideFactor(1.6) andwideSeconds(8).GameManager:lives(3) anddropChance(0.15).
Challenge
HardKeep a best score between games, then tune the game.
- In
GameManager, addpublic TMP_Text bestText;andint best;; Start() begins withbest = PlayerPrefs.GetInt("BestScore", 0); - ShowHud() also sets
bestText.text = "Best: " + best; - When the last life goes with
score > best, set best,PlayerPrefs.SetInt("BestScore", best);and call ShowHud(). - Tune speeds, lives and dropChance where they are declared in the code.
Press Play and set a best: it stays after Play Again. Then Check.
Try it yourself
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;
}
}
This lesson includes a short quiz. Start the lesson to answer it and track your progress.
All lessons in Unity Game: Brick Breaker
Practice on your own: Unity playground