Menu
CoddyTech

التعبيرات Lambda

جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 7 من 60.

تأخذ 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]));
}
challenge icon

التحدي

سهل

اربط لوحة أرقام الخزنة في Start().

  1. كرّر على keys باستخدام for. داخل الحلقة، عرّف int digit = i + 1; واربط keys[i] بـ () => Press(digit).
  2. اربط clearButton بلامبدا واحدة تضبط entered = "" وتستدعي ShowCode().

اضغط «العب» واكتب 3، 1، 2: ستعرض الشاشة Open. ثم اضغط «تحقق».

جرّب بنفسك

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;
    }
}

جميع دروس إنشاء ألعاب حقيقية

تدرّب بنفسك: Playground لـ Unity