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]));
}Görev
KolayKasa üç 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'ü vekeys[3]4'ü yazar. Bunları, her biriPressmetodunu çağıran bir lambda içerenfordöngüsüyle bağla.- Tek bir lambda kullanarak
clearButtonile şimdiye kadar yazılan kodu (entered) temizle veShowCode()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;
}
}
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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi4Sahneler ve Bölümler
Bir Sahne YüklemeBölümü Yeniden BaşlatmaSonraki BölümSahneler Arasında SaklamaTekrar: Bölüm Seçimi10Proje: 3D Platform Oyunu
ParkurHareketli Platformlar2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki Paralar