اجعله خاصًا بك
الدرس 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;(يُعيّنه المشهد إلى BestText، في أعلى اليمين) وprivate int best;. - في
Start()، حمّلbestمن المفتاحBestScore، واجعل قيمته 0 إذا لم يكن هناك شيء محفوظ، واعرضه على شكلBest: 0. - في
GameOver()، عندما تتجاوزscoreقيمةbest، اجعلها أفضل نتيجة، واحفظها تحت المفتاحBestScoreواعرضها.
اضغط Play، ثم اضغط Check. بعد ذلك العب، واضبط tick وspeedUp وminTick حتى تشعر أن اللعبة مناسبة لك.
جرّب بنفسك
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)];
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.