التعبيرات Lambda
جزء من قسم بناء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 7 من 56.
تأخذ AddListener أسلوبًا بلا معاملات. لجعل النقر يستدعي Paint(Color.red)، الذي يأخذ لونًا، اكتب الأسلوب مباشرةً: () => Paint(Color.red). هذا هو التعبير اللامبدا، وهو أسلوب بلا اسم. يحتوي () على معاملاته، ولا توجد معاملات هنا، ويأتي جسمه بعد =>: تعليمة واحدة، أو كتلة بين { } إذا كان هناك عدة تعليمات:
public Button redButton;
public Button blueButton;
public Button resetButton;
public Renderer lamp;
private int changes;
void Start()
{
redButton.onClick.AddListener(() => Paint(Color.red));
blueButton.onClick.AddListener(() => Paint(Color.blue));
resetButton.onClick.AddListener(() =>
{
changes = 0;
lamp.material.color = Color.white;
});
}
void Paint(Color color)
{
lamp.material.color = color;
changes++;
}يخدم الأسلوب Paint كلا زري اللون، ويمرر كل تعبير لامبدا اللون الخاص به. يلتقط تعبير لامبدا المتغيرات التي يستخدمها: فهو لا ينسخ قيمها، بل يقرأها عند تشغيله. يضبط تعبير لامبدا إعادة الضبط الحقل changes عند كل نقرة، بعد انتهاء Start() بوقت طويل.
قد يوقعك ذلك في مشكلة داخل حلقة. مع swatches[i].onClick.AddListener(() => Paint(colors[i])); يلتقط كل تعبير لامبدا المتغير i نفسه، وبحلول وقت نقر أي شخص، تكون الحلقة قد انتهت وi تساوي colors.Length: لذلك ترمي كل عينة لونية الاستثناء IndexOutOfRangeException. المتغير المعرّف داخل الحلقة يكون متغيرًا جديدًا في كل دورة، لذا انسخ i إليه والتقط النسخة:
for (int i = 0; i < swatches.Length; i++)
{
int index = i;
swatches[i].onClick.AddListener(() => Paint(colors[index]));
}التحدي
سهلتُفتح الخزنة برمز مكوّن من ثلاثة أرقام. يحتوي Keypad.cs بالفعل على Press(int digit)، التي تضيف رقمًا إلى الرمز المعروض على الشاشة، وبعد إدخال ثلاثة أرقام تفتح الباب أو تعرض Wrong، وعلى ShowCode()، التي تعرض ما أُدخل حتى الآن. اربط الأزرار في Start():
- يحتوي
keysعلى أزرار الأرقام الأربعة بالترتيب: يُدخلkeys[0]الرقم 1، ويُدخلkeys[1]الرقم 2، ويُدخلkeys[2]الرقم 3، ويُدخلkeys[3]الرقم 4. اربطها باستخدام حلقةfor، مع تعبير لامبدا لكل زر يستدعيPress. - اجعل
clearButton، باستخدام تعبير لامبدا واحد، يمسح الرمز المُدخل حتى الآن (entered) ويعرضه باستخدامShowCode().
الرمز هو 312. اضغط Play، وافتح الخزنة، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Keypad : MonoBehaviour
{
public Button[] keys;
public Button clearButton;
public TMP_Text codeText;
public GameObject door;
public string secret = "312";
private string entered = "";
void Start()
{
ShowCode();
// اربط كل مفتاح بالدالة Press مع الرقم الخاص به، واربط clearButton بمسح الرمز
}
void Press(int digit)
{
entered += digit;
ShowCode();
if (entered.Length == 3)
{
if (entered == secret)
{
door.SetActive(false);
codeText.text = "Open";
}
else
{
codeText.text = "Wrong";
}
entered = "";
}
}
void ShowCode()
{
codeText.text = "Code: " + entered;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك