Menu
CoddyTech

Lambda İfadeleri

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 7 / 60.

AddListener hiçbir parametresi olmayan bir metot alır. Bir tıklamanın renk alan Paint(Color.red) metodunu çağırmasını sağlamak için metodu doğrudan yazın: () => Paint(Color.red). Buna lambda denir; adı olmayan bir metottur. () parametrelerini içerir; burada hiç parametre yoktur. => işaretinden sonra gövdesi gelir: tek bir ifade ya da birden fazla ifade için { } içinde bir blok:

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

Tek bir Paint metodu her iki renk düğmesi için de kullanılır; her lambda kendi rengini iletir. Bir lambda, kullandığı değişkenleri yakalar: değerlerini kopyalamaz, çalıştığı sırada okur. Sıfırlama lambdası, Start() sona erdikten çok sonra bile her tıklandığında changes alanını sıfırlar.

Döngüde bu durum başınıza iş açar. swatches[i].onClick.AddListener(() => Paint(colors[i])); kullanıldığında her lambda aynı i değişkenini yakalar ve biri tıklayana kadar döngü bitmiş, i de colors.Length değerini almış olur: her renk örneği IndexOutOfRangeException hatası verir. Döngü içinde tanımlanan bir değişken her yinelemede yenidir; bu yüzden i değerini bu değişkenlerden birine kopyalayın ve kopyayı yakalayın:

for (int i = 0; i < swatches.Length; i++)
{
    int index = i;
    swatches[i].onClick.AddListener(() => Paint(colors[index]));
}
challenge icon

Görev

Kolay

Kasadaki tuş takımını Start() içinde bağla.

  1. for ile keys üzerinde döngü yap. Döngüde int digit = i + 1; tanımla ve keys[i] öğesini () => Press(digit) ifadesine bağla.
  2. clearButton öğesini, entered = "" değerini atayan ve ShowCode() çağıran tek bir lambda'ya bağla.

“Oyna” düğmesine bas ve 3, 1, 2'yi yaz: ekranda Open yazar. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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();
        // Her bir tuşu kendi rakamıyla Press'e, clearButton'ı ise kodu temizleme işlevine bağla
    }

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

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground