Menu
CoddyTech

Inspector'da Enum'lar

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 20 / 64.

Bir enum alanı Inspector'da açılır liste olarak görünür; bu da tek bir script'i paylaşan nesneleri ayarlamak için kullanışlı bir yol sağlar. Tek bir Pickup prefab'i coin'ler, kalpler ve kalkanlar için kullanılabilir: seviyedeki her kopya türünü açılır listeden alır ve script bu değere göre işlem yapar:

public enum PickupKind { Coin, Heart, Shield }

public class Pickup : MonoBehaviour
{
    public PickupKind kind;
    public int amount = 1;

    void OnTriggerEnter(Collider other)
    {
        if (!other.TryGetComponent(out PlayerStats stats)) return;
        switch (kind)
        {
            case PickupKind.Coin: stats.coins += amount; break;
            case PickupKind.Heart: stats.hp += amount; break;
            case PickupKind.Shield: stats.shielded = true; break;
        }
        Destroy(gameObject);
    }
}

Sahne, her seçimi değerin sayısı olarak kaydeder: Coin 0, Heart 1, Shield 2'dir. Sona bir değer eklemek güvenlidir. { Gem, Coin, Heart, Shield } örneğindeki gibi başa bir değer eklemek her sayıyı kaydırır ve her sahnedeki tüm pickup'ların türü değişir. Bir değeri yeniden adlandırmak güvenlidir, çünkü sayısı aynı kalır. Sayıları açıkça yazmak, Coin = 0, Heart = 1, Shield = 2, kayıtlı seçimleri değiştirmeden adları daha sonra yeniden sıralamanı sağlar.

Bir [System.Flags] enum'u aynı anda birden fazla değer tutar. Açılır listede her değer için bir onay kutusunun yanı sıra Hiçbiri ve Hepsi bulunur. Her değerin kendine ait bir biti olması gerekir; bu nedenle sayılar ikinin kuvvetleridir:

[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }

public Element immuneTo;   // Inspector'da işaretli: Fire ve Poison

public void Hit(int damage, Element element)
{
    if (immuneTo.HasFlag(element)) return;
    hp -= damage;
}

| değerleri birleştirir: Element.Fire | Element.Poison sonucu 5'tir. HasFlag(x), x içindeki her değer ayarlanmışsa true olur ve ToString() ayarlanmış değerleri Fire, Poison biçiminde listeler.

challenge icon

Görev

Kolay

Bir kapının birkaç anahtar kartına ihtiyaç duymasını ve anahtarlıkta birkaç kart bulunmasını sağlayın.

  1. KeyRing.cs içinde, Access üzerine [System.Flags] ekleyin ve değerleri None = 0, Red = 1, Blue = 2, Green = 4 olarak numaralandırın.
  2. Add(Access card), mevcut kartları korur: cards |= card;.
  3. Opens(Access needs), yalnızca anahtarlıkta needs içindeki tüm kartlar bulunduğunda true döndürür.

“Oyna” düğmesine basın ve her iki kartı da alın: Vault açılır. Ardından “Kontrol et” düğmesine basın.

Kendin dene

using UnityEngine;

public enum Access { None, Red, Blue, Green }

public class KeyRing : MonoBehaviour
{
    public Access cards;

    public void Add(Access card)
    {
        // zaten halkada bulunan kartları koruyarak kartı halkaya ekle
    }

    public bool Opens(Access needs)
    {
        // halka needs içindeki tüm kartları içeriyorsa true
        return false;
    }
}

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground