اجعله خاصًا بك
الدرس 19 من 19 في دورة لعبة Unity: كاسر الطوب على Coddy.
الميزة الأخيرة هي أفضل نتيجة تستمر بين الألعاب. يحتفظ PlayerPrefs بالقيم الصغيرة على جهاز اللاعب: يقرأ PlayerPrefs.GetInt(key, 0) قيمةً، وتكون 0 عندما لا تكون هناك قيمة محفوظة بعد، ويحفظ PlayerPrefs.SetInt(key, value) قيمةً. يعيد «العب مجددًا» تحميل المشهد، ويحمّل GameManager الجديد أفضل نتيجة مرة أخرى.
بعد ذلك، يمكنك ضبط اللعبة كما تشاء. كل رقم يحدد طريقة اللعب هو حقل له قيمة ابتدائية في الكود، كما أن نافذة Inspector الخاصة باللاعب للقراءة فقط، لذا غيّر القيم هناك:
Ball:speed(9) وminVertical(0.3).Paddle:speed(14) وwideFactor(1.6) وwideSeconds(8).GameManager:lives(3) وdropChance(0.15).
التحدي
صعباحتفِظ بأفضل نتيجة بين الألعاب، ثم اضبط اللعبة.
- في
GameManager، أضِفpublic TMP_Text bestText;وint best;؛ وتبدأ Start() بـbest = PlayerPrefs.GetInt("BestScore", 0); - تضبط ShowHud() أيضًا
bestText.text = "Best: " + best; - عند خسارة آخر حياة مع
score > best، عيّن best، واستدعِPlayerPrefs.SetInt("BestScore", best);ثم استدعِ ShowHud(). - اضبط السرعات والأرواح وdropChance في المواضع التي أُعلن عنها فيها في الشيفرة.
اضغط «العب» وسجّل أفضل نتيجة: ستبقى بعد «العب مجددًا». ثم اضغط «تحقق».
جرّب بنفسك
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;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: كاسر الطوب
تدرّب بنفسك: Playground لـ Unity