Menu
CoddyTech

Lambda İfadeleri

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

AddListener, parametresi olmayan bir metot alır. Tıklamanın, bir renk alan Paint(Color.red) metodunu çağırmasını sağlamak için metodu yerinde yaz: () => Paint(Color.red). Bu bir lambda, yani adı olmayan bir metottur. () parametrelerini içerir; burada hiç parametre yoktur ve => sonrasında 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 geçirir. Bir lambda, kullandığı değişkenleri kapsar: değerlerini kopyalamaz, çalıştığında okur. Sıfırlama lambdası, Start() sona erdikten çok sonra bile her tıklamada changes alanını sıfırlar.

Döngüde bu durum başına iş açar. swatches[i].onClick.AddListener(() => Paint(colors[i])); ile her lambda aynı i değişkenini kapsar ve biri tıklayana kadar döngü i değeri colors.Length olacak şekilde sona ermiş olur: her renk örneği IndexOutOfRangeException hatası verir. Döngünün içinde tanımlanan bir değişken her yinelemede yeni bir değişkendir; bu yüzden i değerini bir değişkene kopyala ve kopyayı kapsa:

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

Görev

Kolay

Kasa üç haneli bir kodla açılır. Keypad.cs dosyasında zaten, ekrandaki koda bir rakam ekleyen ve üç rakam girildikten sonra kapıyı açan veya Wrong gösteren Press(int digit) ve şimdiye kadar yazılanları gösteren ShowCode() bulunuyor. Düğmeleri Start() içinde bağla:

  • keys, sırayla dört rakam düğmesini tutar: keys[0] 1'i, keys[1] 2'yi, keys[2] 3'ü ve keys[3] 4'ü yazar. Bunları, her biri Press metodunu çağıran bir lambda içeren for döngüsüyle bağla.
  • Tek bir lambda kullanarak clearButton ile şimdiye kadar yazılan kodu (entered) temizle ve ShowCode() ile göster.

Kod 312. Play'e bas, kasayı aç, ardından Check'e 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 tuşu kendi rakamıyla Press'e, clearButton'ı da kodu temizleme işlemine 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;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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