أعلى نتيجة
جزء من قسم بناء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 24 من 56.
أعلى نتيجة هي أفضل نتيجة في كل لعبة تم لعبها، لذا تُحفظ في PlayerPrefs، ولا تتغير إلا عندما تتجاوزها نتيجة لعبة. يتحقق جدول البينبول هذا عند تصريف الكرة الأخيرة:
void GameOver()
{
int best = PlayerPrefs.GetInt("PinballBest", 0);
if (score > best)
{
PlayerPrefs.SetInt("PinballBest", score);
PlayerPrefs.Save();
Debug.Log("New high score: " + score);
}
}المقارنة هي ما يجعلها أعلى نتيجة. من دونها، ستُحفظ نتيجة 300 بعد أفضل نتيجة قدرها 5000، وسيضيع الرقم القياسي. قارن النتيجة بأفضل نتيجة محفوظة، لا بشيء يبدأ من 0 في كل لعبة: فالحقل الذي لم يُحمّل أي قيمة يكون 0 بعد كل إعادة تشغيل، لذا تتجاوزه أي نتيجة. تحافظ score > best على الرقم القياسي القديم عند التعادل، بينما تعتبر score >= best التعادل أعلى نتيجة جديدة.
لعرض أعلى نتيجة أثناء اللعب، حمّلها في حقل ضمن Start() واعرض قيمة ذلك الحقل. عندما تتجاوزها نتيجة لعبة، حدّث الحقل وPlayerPrefs والنص معًا، حتى لا تختلف الشاشة أبدًا عن القيمة المحفوظة.
التحدي
متوسطمضخة البالون: اضغط مطولًا على Space لضخ الهواء في البالون، بمعدل 20 نقطة في الثانية، ثم اتركه لتحصيل النقاط. إذا تجاوز الضخ 100، سينفجر البالون وتكون النتيجة 0 نقطة. تمّت كتابة عملية الضخ والانفجار والنقاط، وعند انتهاء الجولة يتم استدعاء EndRound() مرة واحدة، وتكون نتيجة الجولة في points. أضف أعلى نتيجة، واحفظها باستخدام المفتاح BestPoints:
- في
Start()، حمّل أعلى نتيجة إلىbest(القيمة 0 للاعب جديد)، لكي تعرضهاShowBest(). - في
EndRound()، عندما تتجاوزpointsأعلى نتيجة، احفظها واعرضها، وأظهرnewBestText. الجولة التي لا تتجاوز أعلى نتيجة لا تغيّر شيئًا.
اضغط Play واضخّ الهواء في بعض البالونات (Stop ثم Play لبدء جولة جديدة)، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
using TMPro;
public class BalloonPump : MonoBehaviour
{
public TMP_Text pointsText;
public TMP_Text bestText;
public GameObject newBestText;
public float pumpRate = 20f;
private float air;
private int points;
private int best;
private bool roundOver;
void Start()
{
ShowBest();
}
void Update()
{
if (roundOver) return;
if (Input.GetKey(KeyCode.Space))
{
air += pumpRate * Time.deltaTime;
transform.localScale = Vector3.one * (1f + air / 50f);
pointsText.text = "Points: " + Mathf.FloorToInt(air);
if (air > 100f)
{
points = 0;
pointsText.text = "Pop! Points: 0";
GetComponent<Renderer>().enabled = false;
roundOver = true;
EndRound();
}
}
else if (Input.GetKeyUp(KeyCode.Space))
{
points = Mathf.FloorToInt(air);
pointsText.text = "Points: " + points;
roundOver = true;
EndRound();
}
}
void EndRound()
{
// احفظ رقمًا قياسيًا جديدًا هنا
}
void ShowBest()
{
bestText.text = "Best: " + best;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك