Menu
CoddyTech

Jadikan Milikmu

Pelajaran 16 dari 16 dalam kursus Game Unity: Brick Breaker di Coddy.

Fitur terakhir adalah skor terbaik yang tetap tersimpan di antara permainan. PlayerPrefs menyimpan nilai kecil di perangkat pemain: PlayerPrefs.GetInt(key, 0) membaca nilai, dengan nilai 0 jika belum ada yang disimpan, dan PlayerPrefs.SetInt(key, value) menyimpan nilai. Muat skor terbaik saat permainan dimulai, lalu simpan saat permainan berakhir dengan skor yang lebih tinggi. Main Lagi memuat ulang scene, lalu GameManager baru memuat skor terbaik lagi.

Setelah itu, kamu bisa mengatur permainan sesuai keinginanmu. Setiap angka yang menentukan cara permainan berjalan adalah field dengan nilai awal di dalam kode:

  • Ball: speed (9) dan minVertical (0.3).
  • Paddle: speed (14), wideFactor (1.6), dan wideSeconds (8).
  • GameManager: lives (3), dropChance (0.15), dan jarak antarbrick.

Susunan level adalah list levels milik GameManager di Inspector: digit menandakan brick dengan jumlah hit sebanyak digit tersebut, titik menandakan celah, dan / memulai baris berikutnya, seperti 1.3.1/22222. Di proyek Unity-mu sendiri, ubah nilai di Inspector: setelah script dipasang pada object, Inspector menyimpan salinannya sendiri, dan nilai awal baru dalam kode tidak akan diterapkan padanya.

challenge icon

Tantangan

Sulit
  1. Di GameManager, tambahkan public TMP_Text bestText (scene menghubungkan BestText) dan int best. Di Start(), muat best dari PlayerPrefs dengan key BestScore, dan gunakan 0 jika belum ada yang disimpan. ShowHud() juga menampilkan Best: 0 di bestText, dengan nilai terbaik.
  2. Saat permainan berakhir dengan skor yang lebih tinggi daripada best, simpan skor tersebut di best, simpan dengan key BestScore, lalu tampilkan.

Lalu buat game ini sesuai keinginanmu: ubah kecepatannya, jumlah nyawa, peluang item jatuh, dan kekuatan power-up, lalu mainkan sampai terasa pas.

Tekan Play, buat skor terbaik, lalu tekan Periksa.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Brick Breaker