Serileştirilebilir Sınıflar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 15 / 50.
Çok sayıda ayarı olan bir betik, Inspector'da uzun ve düz bir liste oluşturur. Düz bir C# sınıfı bunları gruplandırabilir: sınıfı [System.Serializable] olarak işaretleyin; bu sınıfın bir alanı, alanın adını taşıyan ve içinde sınıfın alanlarının yer aldığı bir açılır bölüm olarak görünür. Bir sınıf, birden fazla alana ve birden fazla betiğe hizmet edebilir:
[System.Serializable]
public class Stats
{
public float speed = 2f;
public int damage = 10;
}
public class Enemy : MonoBehaviour
{
public Stats normal;
public Stats enraged;
private Stats current;
void Start()
{
current = normal;
}
void Update()
{
transform.Translate(0f, 0f, current.speed * Time.deltaTime);
}
public void Enrage()
{
current = enraged;
}
}Inspector'da her biri Speed ve Damage içeren iki açılır bölüm, Normal ve Enraged, görünür. Her Enemy'nin kendi Inspector'ında doldurulan iki ayrı Stats nesnesi olur ve kod bunları normal.speed şeklinde okur. Unity, betiği yüklediğinde bu nesneleri oluşturur; bu yüzden normal, = new Stats() olmadan da hiçbir zaman null olmaz ve alan başlatıcıları (2 ve 10), yeni bir Enemy'nin başlangıç değerleridir. Bir struct da aynı öznitelikle aynı şekilde çalışır: [System.Serializable] public struct Range { public float min; public float max; }; Vector3 gibi, atandığında kopyalanır.
Bu öznitelik gereklidir çünkü Unity yalnızca kendisine söylenen türleri kaydeder. Bu öznitelik olmadan sınıf Inspector'da görünmez: açılır bölüm olmaz, orada ayarlanan değerler kaydedilmez ve Unity nesneyi oluşturmaz; dolayısıyla normal.speed bir NullReferenceException hatası verir. Sınıfın içinde olağan Inspector kuralları geçerlidir: public alanlar veya [SerializeField] ile işaretlenmiş private alanlar kullanın; asla özellikleri veya static alanları kullanmayın.
Görev
KolayKaşifin el fenerinin iki ışın modu vardır ve Boşluk tuşu bunlar arasında geçiş yapar: çevreyi görmek için geniş, sıcak bir ışın ve mağaranın derinliklerine ulaşan odaklanmış, soğuk beyaz bir ışın. Flashlight.cs, her ışın modunun üç ayarını altı ayrı alanda tutuyor. Sahne, ayarlar her ışın modu için gruplanmış olacak şekilde zaten hazırlandı ve betiğin buna uyması gerekiyor:
- Üç genel alanı olan bir
Beamyapısı tanımla:color(bir Color),rangeveangle(float değerleri). Inspector'da görünmesi gerekiyor. - Altı ayrı alanı,
widevefocusedadlı iki Beam alanıyla değiştir. Sahne, wide için sıcak bir renk, range 6 ve angle 80; focused için soğuk beyaz, range 15 ve angle 25 ayarlarını yapıyor. Apply()metodunun geçerli ışın modunun Beam değerini okumasını ve Light'ıncolor,rangevespotAngledeğerlerini bu değerlerden ayarlamasını sağla. Diğer her şey aynı kalıyor: el feneri geniş ışın moduyla başlıyor ve Boşluk tuşu ışın modları arasında geçiş yapıyor.
Play'e bas, mağaranın uzak ucunu aydınlatmak için Boşluk tuşuna bas, ardından Check'e bas.
Kendin dene
using UnityEngine;
using UnityEngine.InputSystem;
public class Flashlight : MonoBehaviour
{
public Color wideColor = Color.white;
public float wideRange = 5f;
public float wideAngle = 60f;
public Color focusedColor = Color.white;
public float focusedRange = 10f;
public float focusedAngle = 30f;
private bool focusedOn;
private Light lamp;
void Start()
{
lamp = GetComponent<Light>();
Apply();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
focusedOn = !focusedOn;
Apply();
}
}
void Apply()
{
lamp.color = focusedOn ? focusedColor : wideColor;
lamp.range = focusedOn ? focusedRange : wideRange;
lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
}
}
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