Esempio n. 1
0
    // Random bir şekilde düz bir yol oluşturmaya yarayan fonksiyon
    private void YolOlustur(YolContainer c, Vector3 baslangicNoktasi, YolYonu yolYonu)
    {
        // yolun uzunluğunu rastgele olarak belirle
        int yolUzunluk = Random.Range(yolMinimumUzunluk, yolMaksimumUzunluk + 1);

        // yolu oluştur (yola zeminleri dik)
        c.YolOlustur(baslangicNoktasi, yolYonu, yolUzunluk);
        // yola puan objelerini diz
        c.YolaPuanObjeleriDiz(ardArdaDiziliPuanObjesiSayisi);
    }
Esempio n. 2
0
    // Düz yolu oluşturmaya yarayan fonksiyon:
    // - Yolda kullanacağımız zeminleri ve puan objelerini çekmek için havuzu kullanıyoruz
    // - 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(Vector3 baslangicNoktasi, YolYonu yolYonu, int uzunluk)
    {
        // yolYonu'nden yolun ileri yön vektörünü hesapla
        if (yolYonu == YolYonu.Ileri)
        {
            ileriYon = new Vector3(0f, 0f, 1f);
        }
        else if (yolYonu == YolYonu.Sag)
        {
            ileriYon = new Vector3(1f, 0f, 0f);
        }
        else if (yolYonu == YolYonu.Sol)
        {
            ileriYon = new Vector3(-1f, 0f, 0f);
        }
        else
        {
            ileriYon = new Vector3(0f, 0f, -1f);
        }

        // yola dizeceğimiz zemin objelerinin sahip olacağı rotation'ı bulup egim'de depoluyoruz
        Vector3 egim = SonsuzYolScript.YolEgiminiBul(yolYonu);

        for (int i = 0; i < uzunluk; i++)
        {
            // Havuzdan rastgele bir zemin objesi çek
            YolObjesi obje = ObjeHavuzu.Instance.HavuzdanYolObjesiCek();

            // bu zemin klonunun konumunu ve eğimini ayarlıyor, ardından zemini aktif hale getiriyoruz
            obje.transform.localPosition    = baslangicNoktasi;
            obje.transform.localEulerAngles = egim;
            obje.gameObject.SetActive(true);

            // zemini ve zeminin çıktığı prefab'ın index'ini ilgili array'lerimizde depoluyoruz
            yol.Add(obje);

            // bir sonraki zemin klonunu bu zeminin uzunluğu kadar ileride oluşturuyoruz ki
            // sonraki zemin bu zeminin üzerinde oluşmasın
            baslangicNoktasi += ileriYon * obje.ebatlar.z;
        }

        // yolun bitiş noktasını ve yönünü ayarlıyoruz
        bitisNoktasi = baslangicNoktasi;
        yon          = yolYonu;
    }
Esempio n. 3
0
 // Girilen yönde dizilen zemin objelerinin sahip olması gereken eğimi
 // bulmaya yarayan fonksiyon
 public static Vector3 YolEgiminiBul(YolYonu yolYonu)
 {
     if (yolYonu == YolYonu.Ileri)
     {
         return(new Vector3(0f, 0f, 0f));
     }
     else if (yolYonu == YolYonu.Sag)
     {
         return(new Vector3(0f, 90f, 0f));
     }
     else if (yolYonu == YolYonu.Sol)
     {
         return(new Vector3(0f, 270f, 0f));
     }
     else
     {
         return(new Vector3(0f, 180f, 0f));
     }
 }
Esempio n. 4
0
    // Kavşak ve bu kavşağa bağlı düz yollar oluşturmaya yarayan fonksiyon
    private void DonemecOlustur(Vector3 baslangicNoktasi, YolYonu yolYonu)
    {
        // Kavşak objesinin sahip olacağı rotation değerini bul
        Vector3 egim = YolEgiminiBul(yolYonu);

        // [0-2] aralığında rastgele bir integer döndürülür ve:
        // 0- sol kavşak oluşturulur
        // 1- sağ kavşak oluşturulur
        // 2- iki yönlü kavşak oluşturulur
        switch (Random.Range(0, 3))
        {
        case 0:
            // sadece sola dönemeç oluştur
            // sol kavşak objesini havuzdan çek ve oyun alanına yerleştir
            kavsakObjesi = ObjeHavuzu.Instance.HavuzdanSolDonemecObjesiCek();
            kavsakObjesi.transform.localPosition    = baslangicNoktasi;
            kavsakObjesi.transform.localEulerAngles = egim;
            kavsakObjesi.gameObject.SetActive(true);

            // sola dön
            if (yolYonu == YolYonu.Ileri)
            {
                yolYonu           = YolYonu.Sol;
                baslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.x / 2, 0, kavsakObjesi.ebatlar.z / 2);
            }
            else if (yolYonu == YolYonu.Sol)
            {
                yolYonu           = YolYonu.Geri;
                baslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.z / 2, 0, -kavsakObjesi.ebatlar.x / 2);
            }
            else if (yolYonu == YolYonu.Geri)
            {
                yolYonu           = YolYonu.Sag;
                baslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.x / 2, 0, -kavsakObjesi.ebatlar.z / 2);
            }
            else
            {
                yolYonu           = YolYonu.Ileri;
                baslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.z / 2, 0, kavsakObjesi.ebatlar.x / 2);
            }

            // kavşağın ucunda yeni bir düz yol oluştur
            YolOlustur(solYol, baslangicNoktasi, yolYonu);
            break;

        case 1:
            // sadece sağa dönemeç oluştur
            // sağ kavşak objesini havuzdan çek ve oyun alanına yerleştir
            kavsakObjesi = ObjeHavuzu.Instance.HavuzdanSagDonemecObjesiCek();
            kavsakObjesi.transform.localPosition    = baslangicNoktasi;
            kavsakObjesi.transform.localEulerAngles = egim;
            kavsakObjesi.gameObject.SetActive(true);

            // sağa dön
            if (yolYonu == YolYonu.Ileri)
            {
                yolYonu           = YolYonu.Sag;
                baslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.x / 2, 0, kavsakObjesi.ebatlar.z / 2);
            }
            else if (yolYonu == YolYonu.Sol)
            {
                yolYonu           = YolYonu.Ileri;
                baslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.z / 2, 0, kavsakObjesi.ebatlar.x / 2);
            }
            else if (yolYonu == YolYonu.Geri)
            {
                yolYonu           = YolYonu.Sol;
                baslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.x / 2, 0, -kavsakObjesi.ebatlar.z / 2);
            }
            else
            {
                yolYonu           = YolYonu.Geri;
                baslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.z / 2, 0, -kavsakObjesi.ebatlar.x / 2);
            }

            // kavşağın ucunda yeni bir düz yol oluştur
            YolOlustur(sagYol, baslangicNoktasi, yolYonu);
            break;

        case 2:
            // hem sola hem sağa dönemeç oluştur
            // iki yönlü kavşak objesini havuzdan çek ve oyun alanına yerleştir
            kavsakObjesi = ObjeHavuzu.Instance.HavuzdanSolVeSagDonemecObjesiCek();
            kavsakObjesi.transform.localPosition    = baslangicNoktasi;
            kavsakObjesi.transform.localEulerAngles = egim;
            kavsakObjesi.gameObject.SetActive(true);

            // hem sol hem de sağ yönü birer değişkende depola
            YolYonu tersYolYonu;
            Vector3 tersYolBaslangicNoktasi = baslangicNoktasi;
            if (yolYonu == YolYonu.Ileri)
            {
                yolYonu                  = YolYonu.Sol;
                tersYolYonu              = YolYonu.Sag;
                baslangicNoktasi        += new Vector3(-kavsakObjesi.ebatlar.x / 2, 0, kavsakObjesi.ebatlar.z / 2);
                tersYolBaslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.x / 2, 0, kavsakObjesi.ebatlar.z / 2);
            }
            else if (yolYonu == YolYonu.Sol)
            {
                yolYonu                  = YolYonu.Geri;
                tersYolYonu              = YolYonu.Ileri;
                baslangicNoktasi        += new Vector3(-kavsakObjesi.ebatlar.z / 2, 0, -kavsakObjesi.ebatlar.x / 2);
                tersYolBaslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.z / 2, 0, kavsakObjesi.ebatlar.x / 2);
            }
            else if (yolYonu == YolYonu.Geri)
            {
                yolYonu                  = YolYonu.Sag;
                tersYolYonu              = YolYonu.Sol;
                baslangicNoktasi        += new Vector3(kavsakObjesi.ebatlar.x / 2, 0, -kavsakObjesi.ebatlar.z / 2);
                tersYolBaslangicNoktasi += new Vector3(-kavsakObjesi.ebatlar.x / 2, 0, -kavsakObjesi.ebatlar.z / 2);
            }
            else
            {
                yolYonu                  = YolYonu.Ileri;
                tersYolYonu              = YolYonu.Geri;
                baslangicNoktasi        += new Vector3(kavsakObjesi.ebatlar.z / 2, 0, kavsakObjesi.ebatlar.x / 2);
                tersYolBaslangicNoktasi += new Vector3(kavsakObjesi.ebatlar.z / 2, 0, -kavsakObjesi.ebatlar.x / 2);
            }

            // kavşağın iki ucunda da yeni birer düz yol oluştur
            YolOlustur(solYol, baslangicNoktasi, yolYonu);
            YolOlustur(sagYol, tersYolBaslangicNoktasi, tersYolYonu);
            break;
        }
    }
Esempio n. 5
0
    // Düz yola puan objeleri dizmeye yarayan fonksiyon:
    // - puan objelerini havuzdan (pool) çekiyoruz
    // - artarda kaç puan objesi dizileceği bilgisini birDizidekiPuanObjesiSayisi vasıtasıyla dışarıdan alıyoruz
    public void YolaPuanObjeleriDiz(int birDizidekiPuanObjesiSayisi)
    {
        // iki dizi arasında kaç zeminlik aralık olacağını belirliyoruz
        // (aslında bu değeri de dışarıdan parametre olarak almam uygun olurdu)
        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);

        int diziliPuanObjesi = 0;

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

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

            // 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 (pool) bir puan objesi klonu çekiyoruz
                Transform obje = ObjeHavuzu.Instance.HavuzdanPuanObjesiCek();

                // puan objesini spawn noktasına konumlandırıyor ve aktif hale getiriyoruz
                obje.localPosition    = parentObje.GetChild(j).position;
                obje.localEulerAngles = new Vector3(0f, 0f, 0f);
                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 (artarda birDizidekiPuanObjesiSayisi kadar
            // puan objesi spawn etmişsek):
            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);
            }
        }
    }