Serileştirilebilir Sınıflar
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 18 / 64.
Çok sayıda ayarı olan bir betik, Inspector'da uzun ve düz bir liste oluşturur. Sade bir C# sınıfı bunları gruplayabilir: sınıfı [System.Serializable] olarak işaretle; bu sınıfın bir alanı, alanın adını taşıyan ve içinde sınıfın alanlarının bulunduğu 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 birinde Speed ve Damage bulunan iki açılır bölüm, Normal ve Enraged, görünür. Her Enemy'nin kendi Inspector'ında doldurulan iki Stats nesnesi olur ve kod bunlara normal.speed şeklinde erişir. Unity, betiği yüklediğinde bu nesneleri oluşturur; bu nedenle normal, = new Stats() olmasa bile hiçbir zaman null olmaz. Alan başlatıcıları (2 ve 10), yeni bir Enemy'nin başlangıç değerleridir. Bir struct da bu ö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, burada ayarlanan değerler kaydedilmez ve Unity nesneyi oluşturmaz; bu yüzden normal.speed bir NullReferenceException hatası verir. Sınıfın içinde alışılmış Inspector kuralları geçerlidir: public alanlar veya [SerializeField] ile işaretlenmiş private alanlar kullanılır; property'ler ya da static alanlar asla kullanılmaz.
Görev
KolayHer ışının ayarlarını tek bir yapı içinde grupla.
Flashlightsınıfının üstünde, publicColor color,float rangevefloat anglealanlarına sahippublic struct Beamtanımla. Inspector'da görünmesi için[System.Serializable]ile işaretle.- Dağınık durumdaki altı alanı
public Beam wide;vepublic Beam focused;ile değiştir. Apply()içinde ışığın üç değerinifocusedOn ? focused : wideifadesinden ayarla.
“Oyna”'ya ve Space tuşuna bas: ışın kristale ulaşır. Ardından “Kontrol et”'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;
}
}
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