Menu
CoddyTech

Veri Olarak Dalgalar

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 22 / 50.

Bir seviyenin dalgaları bir listedir: üç er, ardından iki iri düşman, sonra bir bölüm sonu canavarı. Bir dalga oluşturucunun kodunda yazıldığında her seviyenin kendine ait kodu gerekir. Veri olarak yazıldığında liste bir varlığa konur; her seviye için bir varlık olur ve tek bir dalga oluşturucu betiği kendisine verilen varlığı okur. Her girdi bir [System.Serializable] sınıfıdır, böylece varlığın Inspector'ı listeyi gösterir:

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Wave
{
    public GameObject enemy;
    public int count = 1;
    public float spacing = 1f;
}

[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
    public List<Wave> waves;
    public float restBetweenWaves = 3f;
}

Bunların tümü tek bir dosyadadır: WaveSet.cs: ScriptableObject kendi adıyla bir dosyada bulunmalıdır ve sıradan Wave sınıfı onun yanında yer alabilir. Bir WaveSet varlığı seçtiğinde Inspector, Boyutuyla birlikte Waves'i ve her biri Enemy, Count ve Spacing içeren Element 0, Element 1 satırlarını gösterir; + düğmesi bir dalga ekler. Dalga oluşturucu, coroutine içinde listede ilerler:

public class WaveSpawner : MonoBehaviour
{
    public WaveSet waveSet;

    void Start()
    {
        StartCoroutine(SendWaves());
    }

    IEnumerator SendWaves()
    {
        foreach (Wave wave in waveSet.waves)
        {
            for (int i = 0; i < wave.count; i++)
            {
                Instantiate(wave.enemy, transform.position, Quaternion.identity);
                yield return new WaitForSeconds(wave.spacing);
            }
            yield return new WaitForSeconds(waveSet.restBetweenWaves);
        }
        Debug.Log("Last wave sent");
    }
}

Level1'de aralarında 0.5 saniye olacak şekilde 3 er ve ardından 2 iri düşman bulunduğunda, erler 0, 0.5 ve 1. saniyelerde gelir; son erden sonraki bekleme aralığı ve 3 saniyelik dinlenme süresi geçer, ilk iri düşman ise 4.5 saniyede gelir. Level 2'nin dalga oluşturucusu, daha zorlu dalgaların bulunduğu bir Level2 varlığı alır ve betik aynı kalır.

challenge icon

Görev

Orta

Blok Yağmuru: bloklar gökyüzünden ritim eşliğinde düşer ve sen oklara basarak onlardan kaçarsın. Dropper, lanes dizisinin her şeridine bir blok bırakır; her seferinde 1 saniye bekler. Ritmi veriye dönüştür, böylece her şarkı bir varlık olabilir:

  • DropPattern.cs dosyasında, [System.Serializable] sınıfı Drop'u yaz; lane (bir int: -1 sol, 0 orta, 1 sağ) ve delay (bir float: bu düşüşten önce beklenecek saniye sayısı) adlı public alanları olsun. Altına, [CreateAssetMenu] özelliğine ve blockPrefab (bir GameObject), laneWidth (bir float) ve drops (bir List<Drop>) adlı public alanlara sahip bir ScriptableObject olan DropPattern'ı yaz.
  • Dropper içinde, her iki alanı da DropPattern türünde bir public alan olan pattern ile değiştir. Her düşüşü sırayla ele al: delay süresi kadar bekle, ardından desenin bloğunu Dropper'ın konumundan x boyunca lane çarpı laneWidth kadar kaydırılmış konuma bırak. Son düşüşten sonra Pattern done mesajını günlüğe yaz.

Projede bir Song1 varlığı bulunuyor: şerit genişliği 2 ve dört düşüş. Inspector bunu Dropper'ın pattern alanına yerleştiriyor. Oynat'a basıp kaçın, ardından Kontrol Et'e bas.

Kendin dene

using System.Collections.Generic;
using UnityEngine;

// Drop (tek bir blok: bulunduğu şerit ve öncesindeki bekleme süresi) ile DropPattern (varlık) buraya gelir
quiz iconKendini test et

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