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