// 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); }
// 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; }
// 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)); } }
// 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; } }
// 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); } } }