// 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; }
// Bir yol objesini ilgili havuza eklemeye yarayan fonksiyon public void HavuzaYolObjesiEkle(YolObjesi obje) { if (obje.yolTuru == YolTuru.DuzYol) { ileriYolObjeleriHavuzu.Add(obje); } else if (obje.yolTuru == YolTuru.SagDonemec) { sagDonemecHavuzu.Add(obje); } else if (obje.yolTuru == YolTuru.SolDonemec) { solDonemecHavuzu.Add(obje); } else { solVeSagDonemecHavuzu.Add(obje); } }
// 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() { // 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.Count; i++) { YolObjesi obje = yol[i]; obje.gameObject.SetActive(false); ObjeHavuzu.Instance.HavuzaYolObjesiEkle(obje); } // puan objelerini deaktif et ve havuza ekle for (int i = 0; i < puanObjeleri.Count; i++) { Transform obje = puanObjeleri[i]; obje.gameObject.SetActive(false); ObjeHavuzu.Instance.HavuzaPuanObjesiEkle(obje); } // List'lerin içini boşalt yol.Clear(); puanObjeleri.Clear(); }
// 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; } }