Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Her ışının ayarlarını tek bir yapı içinde grupla.

  1. Flashlight sınıfının üstünde, public Color color, float range ve float angle alanlarına sahip public struct Beam tanımla. Inspector'da görünmesi için [System.Serializable] ile işaretle.
  2. Dağınık durumdaki altı alanı public Beam wide; ve public Beam focused; ile değiştir.
  3. Apply() içinde ışığın üç değerini focusedOn ? focused : wide ifadesinden 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

Kendi başına pratik yap: Unity playground