void Start()
    {
        if (ileriYolObjeleri.Length != ileriYolObjeleriUzunluklar.Length)
        {
            // Eğer her bir zemin prefab'ının uzunluğu tek tek girilmemişse hata mesajı verip
            // component'i objeden at (yani oyunu oynanmaz hale getir)
            Debug.LogError("HATA: SonsuzYolScript'teki Duz Yol Objeleri ile " +
                           "Duz Yol Objeleri Uzunluklar'ın boyutu (size) " +
                           "aynı olmak zorundadır.");

            Destroy(this);
        }
        else
        {
            // Havuzu (pool) doldur
            havuz = GetComponent <ObjeHavuzu>();

            int havuzdakiObjeSayisi = yolMaksimumUzunluk / 3;
            havuz.HavuzuDoldur(ileriYolObjeleri, solaDonus, sagaDonus,
                               ikiYoneDonus, puanPrefab, havuzdakiObjeSayisi,
                               ardArdaDiziliPuanObjesiSayisi);
            // Havuzu doldurduk!

            // Rastgele bir yol oluştur
            ileriYol = new YolContainer();
            sagYol   = new YolContainer();
            solYol   = new YolContainer();

            YolOlustur(ileriYol, Vector3.forward * -314.6f, Vector3.forward);
            DonemecOlustur(ileriYol.BitisNoktasi(), ileriYol.Yon());
        }
    }
    // Bu yolu yok ederken (oyuncu artık bu yolda koşmayı bitirip başka yola saptığında)
    // çağrılan ve yoldaki puan objeleri ile zemin objelerini havuza geri eklemeye yarayan
    // fonksiyon (yani Destroy yapmıyoruz)
    public void YoluYokEt(ObjeHavuzu havuz)
    {
        if (yol != null)
        {
            // zemin objelerini deaktif et ve havuza ekle (bu esnada hangi zemin objesi klonunun
            // hangi prefab'tan çıktığını dikkate al (yolIndexler vasıtasıyla)
            for (int i = 0; i < yol.Length; i++)
            {
                Transform obje = yol[i];
                obje.gameObject.SetActive(false);
                havuz.HavuzaYolObjesiEkle(yolIndexler[i], obje);
            }

            // puan objelerini deaktif et ve havuza ekle
            while (puanObjeleri.Count > 0)
            {
                Transform obje = puanObjeleri[0];
                obje.gameObject.SetActive(false);
                puanObjeleri.RemoveAt(0);
                havuz.HavuzaPuanObjesiEkle(obje);
            }

            // yolu yok et
            yol = null;
        }
    }
Esempio n. 3
0
    // - HAVUZ -

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else if (this != Instance)
        {
            Destroy(this);
            return;
        }

        // Oyunun en başında havuzları hatırı sayılır miktarda objeyle doldur
        puanObjeleriHavuzu = new List <Transform>(puanHavuzuBoyutu);
        HavuzuDoldur(puanObjeleriHavuzu, puanPrefablari, puanHavuzuBoyutu);

        ileriYolObjeleriHavuzu = new List <YolObjesi>(ileriYolHavuzuBoyutu);
        HavuzuDoldur(ileriYolObjeleriHavuzu, ileriYolPrefablari, ileriYolHavuzuBoyutu);

        solDonemecHavuzu = new List <YolObjesi>(solDonemecHavuzuBoyutu);
        HavuzuDoldur(solDonemecHavuzu, solDonemecPrefablari, solDonemecHavuzuBoyutu);

        sagDonemecHavuzu = new List <YolObjesi>(sagDonemecHavuzuBoyutu);
        HavuzuDoldur(sagDonemecHavuzu, sagDonemecPrefablari, sagDonemecHavuzuBoyutu);

        solVeSagDonemecHavuzu = new List <YolObjesi>(solVeSagDonemecHavuzuBoyutu);
        HavuzuDoldur(solVeSagDonemecHavuzu, solVeSagDonemecPrefablari, solVeSagDonemecHavuzuBoyutu);
    }
    // Düz yola puan objeleri dizmeye yarayan fonksiyon:
    // - puan objelerini havuzdan çekiyoruz
    // - kaç puan objesi dizileceği bilgisini birDizidekiPuanObjesiSayisi vasıtasıyla dışarıdan alıyoruz
    public void YolaPuanObjeleriDiz(ObjeHavuzu havuz, int birDizidekiPuanObjesiSayisi)
    {
        // üzerinde çalıştığımız diziye dizilmiş puan objesi sayısını sıfırlıyoruz
        int diziliPuanObjesi = 0;
        // iki dizi arasında kaç zeminlik aralık olacağını belirliyoruz
        int puanObjeleriArasiAralik = 1;
        // 0- sol
        // 1- sağ
        // puan objelerinin yolun hangi tarafına dizileceğini belirleyen değişken
        int yon = Random.Range(0, 2);

        for (int i = 0; i < yol.Length; i++)
        {
            int       puanSpawnNoktasiSayisi;
            Transform parentObje;

            // yolun puan objesi dizilebilecek noktalarını (spawn noktalarını) alıyoruz
            if (yon == 0)
            {
                parentObje = yol[i].Find("PuanSpawnPointSol");
            }
            else
            {
                parentObje = yol[i].Find("PuanSpawnPointSag");
            }

            // bu zeminde yer alan puan spawn noktası sayısını değişkende tutuyoruz
            puanSpawnNoktasiSayisi = parentObje.childCount;

            // Spawn noktalarının sonuna ulaşmadığımız ve bir dizi puan objesi dizmediğimiz müddetçe:
            for (int j = 0; j < puanSpawnNoktasiSayisi &&
                 diziliPuanObjesi < birDizidekiPuanObjesiSayisi; j++)
            {
                // havuzdan bir puan objesi klonu çekiyoruz
                Transform obje = havuz.HavuzdanPuanObjesiCek();

                // puan objesini spawn noktasına konumlandırıyor ve aktif hale getiriyoruz
                obje.position = parentObje.GetChild(j).position;
                obje.gameObject.SetActive(true);

                // puan objesini ilgili list'e ekliyoruz
                puanObjeleri.Add(obje);

                // bu dizideki puan objesi sayısını 1 artırıyoruz
                diziliPuanObjesi++;
            }

            // eğer ki diziyi tamamlamışsak
            if (diziliPuanObjesi == birDizidekiPuanObjesiSayisi)
            {
                // diziyi sıfırla, puanObjeleriArasiAralik kadar zemini atla ve
                // yeni dizideki puanların spawn olacağı yönü tekrar rastgele bir şekilde seç
                diziliPuanObjesi = 0;
                i  += puanObjeleriArasiAralik;
                yon = Random.Range(0, 2);
            }
        }
    }
    // Düz yolu oluşturmaya yarayan fonksiyon:
    // - Yolda kullanacağımız zeminleri ve puan objelerini çekmek için havuzu kullanıyoruz.
    // - objeUzunluklar array'i her bir zemin prefab'ının kaç metre uzunluğunda olduğunu depolar.
    // - baslangicNoktasi yolun hangi koordinattan başlayacağını belirler
    // - ileriYon yolun hangi yönde gideceğini belirler
    // - uzunluk yolun kaç zemin klonundan oluşacağını belirler
    public void YolOlustur(ObjeHavuzu havuz, float[] objeUzunluklar,
                           Vector3 baslangicNoktasi, Vector3 ileriYon, int uzunluk)
    {
        yol          = new Transform[uzunluk];
        yolIndexler  = new int[uzunluk];
        puanObjeleri = new List <Transform>();



        // yola dizeceğimiz zemin objelerinin sahip olacağı rotation'ı bulup egim'de depoluyoruz
        Vector3 egim = SonsuzYolScript.EgimiBul(ileriYon);
        int     i;

        for (i = 0; i < uzunluk; i++)
        {
            // Rastgele bir zemin prefab'ı seçiyor ve o prefab'ın bir klonunu havuzdan çekiyoruz
            int       randomIndex = Random.Range(0, objeUzunluklar.Length);
            Transform obje        = havuz.HavuzdanYolObjesiCek(randomIndex);

            // bu zemin klonunun konumunu ve eğimini ayarlıyor, ardından zemini aktif hale getiriyoruz
            obje.position = baslangicNoktasi;

            obje.eulerAngles = egim;
            obje.gameObject.SetActive(true);

            // zemini ve zeminin çıktığı prefab'ın index'ini ilgili array'lerimizde depoluyoruz
            yol[i]         = obje;
            yolIndexler[i] = randomIndex;

            // bir sonraki zemin klonunu bu zeminin uzunluğu kadar ileride oluşturuyoruz ki
            // sonraki iki zemin objesi üst üste binmesin

            baslangicNoktasi += ileriYon * objeUzunluklar[randomIndex];
        }

        // yolun bitiş noktasını ve yönünü ayarlıyoruz
        bitisNoktasi = baslangicNoktasi;
        yon          = ileriYon;
    }