Inspector'da Enum'lar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 17 / 50.
Bir enum alanı Inspector'da açılır menü olarak görünür; bu da aynı scripti paylaşan nesneleri yapılandırmak için kullanışlı bir yol sunar. Tek bir Pickup prefab'ı coin, heart ve shield'lar için kullanılır: seviyedeki her kopya türünü açılır menüden alır ve script bu değere göre seçim 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 numarası olarak kaydeder: Coin 0, Heart 1, Shield 2'dir. Sona bir değer eklemek güvenlidir. Baştan bir değer eklemekse, { Gem, Coin, Heart, Shield } örneğinde olduğu gibi, tüm numaraları kaydırır ve her sahnedeki her pickup'ın türü değişir. Bir değeri yeniden adlandırmak güvenlidir, çünkü numarası aynı kalır. Numaraları açıkça yazmak, Coin = 0, Heart = 1, Shield = 2, kaydedilmiş seçimleri değiştirmeden adları daha sonra yeniden sıralamanı sağlar.
Bir [System.Flags] enum'u aynı anda birkaç değer tutar. Açılır menüsünde her değer için bir onay kutusu ile birlikte Hiçbiri ve Tümü seçenekleri bulunur. Her değerin kendine ait bir bite ihtiyacı vardır; bu nedenle numaralar 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 değeri 5'tir. HasFlag(x), x içindeki tüm değerler ayarlanmışsa true döndürür ve ToString() ayarlanmış değerleri Fire, Poison şeklinde listeler.
Görev
KolayÜssün üç kapısı var: Depo için kırmızı anahtar kartı, Laboratuvar için mavi anahtar kartı, Kasaya girmek içinse ikisi de gerekiyor. Her kapının needs değeri ve her kartın card değeri, Inspector'da Access enum'ı kullanılarak ayarlanır; Door.cs ve Keycard.cs hazır. Ok tuşları, aldığı kartları KeyRing'inde tutan Player'ı hareket ettirir. KeyRing.cs dosyasını tamamla:
Access'i, değerleri birleştirilebilen bir enum yap; böylece bir kapı birden fazla kart gerektirebilir ve anahtarlıkta birden fazla kart bulunabilir. Dört adını koru: None, Red, Blue ve Green.Add(Access card), zaten anahtarlıkta bulunan kartları koruyarak bir kartı anahtarlığa ekler.Opens(Access needs), anahtarlıkneedsiçindeki tüm kartları tutuyorsa true döndürür.
Play'e bas, kapıları dene, kartları al, ardından Check'e bas.
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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Unity'de Oyun Mimarisi bölümündeki tüm dersler
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest