اجعله خاصًا بك
الدرس 14 من 14 في دورة لعبة Unity: الثعبان ثلاثي الأبعاد على Coddy.
تبقّت ميزة واحدة: أفضل نتيجة تبقى محفوظة بعد إغلاق اللعبة. تحتفظ بها PlayerPrefs: اقرأها بقيمة افتراضية في Start()، واحفظها عند انتهاء اللعبة إذا تجاوزت النتيجة أفضل نتيجة. تحتفظ لعبة سباق بأفضل لفة بالطريقة المعاكسة، لأن الوقت الأقل أفضل:
if (lapTime < bestLap)
{
bestLap = lapTime;
PlayerPrefs.SetFloat("BestLap", bestLap);
}بعد ذلك، يمكنك ضبط اللعبة كما تريد. تحدد أرقام Snake إحساسها: تجعل قيمة tick 0.25 البداية هادئة، وتجعلها قيمة 0.1 سريعة، وتسرّع speedUp 0.01 حركة الثعبان في وقت أقرب، وتجعل minTick 0.05 نهاية اللعبة محمومة. في هذا الدرس، يكون Inspector الخاص بهذا اللاعب للقراءة فقط، ويترك مشهد الدورة هذه الحقول الثلاثة على القيم الموجودة في الكود، لذا غيّرها في مواضع تعريفها واضغط على Play. في مشروع Unity الخاص بك، غيّرها في مكوّن Snake داخل Inspector: فالقيمة الافتراضية الجديدة في الكود لا تُطبّق على مكوّن موجود بالفعل في أحد المشاهد.
التحدي
صعباحتفظ بأفضل نتيجة بين الجولات، ثم اضبط اللعبة.
- في
GameManager، أضفpublic TMP_Text bestText;وprivate int best; - في
Start()، استخدمbest = PlayerPrefs.GetInt("BestScore", 0);واعرض"Best: " + best. - في
GameOver()، عندما تتجاوز النتيجة أفضل نتيجة، حدّث best واحفظها تحتBestScoreواعرضها. - اضبط
tickوspeedUpوminTickفي مواضع تعريفها في Snake.
اضغط «العب»، وسجّل أفضل نتيجة ثم العب مجددًا: ستبقى أفضل نتيجة في أعلى اليمين. ثم اضغط «تحقق».
جرّب بنفسك
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Snake snake;
public GameObject foodPrefab;
public TMP_Text scoreText;
public GameObject gameOverPanel;
public Button playAgainButton;
private Transform food;
private int score;
void Awake()
{
Instance = this;
}
void Start()
{
scoreText.text = "Score: 0";
playAgainButton.onClick.AddListener(PlayAgain);
food = Instantiate(foodPrefab).transform;
MoveFood();
}
public bool IsFood(Vector3 cell)
{
return cell == food.position;
}
public void Eat()
{
score++;
scoreText.text = "Score: " + score;
MoveFood();
}
public void GameOver()
{
gameOverPanel.SetActive(true);
}
void PlayAgain()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void MoveFood()
{
List<Vector3> free = new List<Vector3>();
for (int x = -snake.edge; x <= snake.edge; x++)
{
for (int z = -snake.edge; z <= snake.edge; z++)
{
Vector3 cell = new Vector3(x, 0f, z);
if (!snake.Occupies(cell))
{
free.Add(cell);
}
}
}
food.position = free[Random.Range(0, free.Count)];
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس لعبة Unity: الثعبان ثلاثي الأبعاد
تدرّب بنفسك: Playground لـ Unity