Menu
CoddyTech

Kendine Göre Uyarla

Coddy'nin Unity Oyunu: Tuğla Kırma kursunda ders 16 / 16.

Son özellik, oyunlar arasında kalıcı olan en yüksek skordur. PlayerPrefs, oyuncunun cihazında küçük değerleri saklar: PlayerPrefs.GetInt(key, 0) bir değeri okur; henüz kayıtlı bir şey yoksa 0 değerini döndürür ve PlayerPrefs.SetInt(key, value) bir değer kaydeder. Oyun başladığında en yüksek skoru yükle ve oyun daha yüksek bir skorla bittiğinde kaydet. Tekrar Oyna sahneyi yeniden yükler ve yeni GameManager en yüksek skoru tekrar yükler.

Artık oyunu dilediğin gibi ayarlayabilirsin. Oyunun nasıl oynandığını belirleyen her sayı, kodda başlangıç değeri olan bir alandır:

  • Ball: speed (9) ve minVertical (0.3).
  • Paddle: speed (14), wideFactor (1.6) ve wideSeconds (8).
  • GameManager: lives (3), dropChance (0.15) ve tuğlalar arasındaki boşluk.

Düzenler, Inspector'daki GameManager'ın levels listesindedir: bir rakam, o kadar vuruşta kırılan bir tuğlayı; bir nokta, bir boşluğu; / ise sonraki satırın başlangıcını belirtir. Örneğin 1.3.1/22222. Kendi Unity projenizde değerleri Inspector'dan değiştirin: bir betik bir nesneye eklendiğinde Inspector kendi kopyasını saklar ve koddaki yeni bir başlangıç değeri artık bu kopyaya aktarılmaz.

challenge icon

Görev

Zor
  1. GameManager içinde public TMP_Text bestText ekle (sahne BestText'i bağlar) ve bir int best ekle. Start() içinde best değerini PlayerPrefs'ten BestScore anahtarıyla yükle; kayıtlı bir değer yoksa 0 kullan. ShowHud() da bestText içinde en iyi skoru göstererek Best: 0 değerini gösterir.
  2. Oyun best değerinden yüksek bir skorla bittiğinde, skoru best içine kaydet, BestScore anahtarıyla sakla ve göster.

Ardından oyunu kendine göre düzenle: hızları, can sayısını, düşme şansını ve güçlendiricilerin etkisini değiştir, doğru hissettirene kadar oyna.

Play'e bas, en iyi skoru belirle, sonra Check'e bas.

Kendin dene

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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity Oyunu: Tuğla Kırma bölümündeki tüm dersler