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.
Görev
KolayBir kapının birkaç anahtar kartına ihtiyaç duymasını ve anahtarlıkta birkaç kart bulunmasını sağlayın.
KeyRing.csiçinde,Accessüzerine[System.Flags]ekleyin ve değerleriNone = 0, Red = 1, Blue = 2, Green = 4olarak numaralandırın.Add(Access card), mevcut kartları korur:cards |= card;.Opens(Access needs), yalnızca anahtarlıktaneedsiç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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground