Unity C# kod hatası

Hazeyn_44

Hectopat
Katılım
23 Nisan 2020
Mesajlar
266
Yer
Ankara
Daha fazla  
Sistem Özellikleri
Casper Excalibur G770
İşlemci:11th Gen Intel(R) Core(TM) i5-11400H @ 2.70GHz, 2688 Mhz, 6 Çekirdek, 12 Mantıksal İşlemci
Ram: 16GB 3200MHz DDR4 CL16 Dual Channel
Ekran Kartı: Nvidia Geforce GTX 1650 4GB GDDR6
SSD: 500GB M.2 SSD PCle 3.0 (PCle; Okuma: 2300MB/s - Yazma: 1800MB/s)
İşletim Sistemi: Microsoft Windows 11 Pro Insider Preview
Ekran: 15.6" FHD IPS 144HZ 3ms 45% 250NIT
Cinsiyet
Erkek
Meslek
Öğrenci
Unity ile flappy bird oyunu yapıyordum, arka arkaya gelen borular için bir script yazıyordum, scripti yazdım, gerekli ayarları yaptım ama oyunu çalıştırınca sadece 1 boru geliyor. Arka arkaya borular spawn olmuyor.

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawner : MonoBehaviour
{
    public birdcontroller Birdscript;

    public GameObject Borular;

    public float height;

    private void start()
    {
        StartCoroutine(SpawnObject());
    }

    public IEnumerator SpawnObject()
    {
        Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);
       
        yield return new WaitForSeconds(2f);

    }

}
 
Unity ile flappy bird oyunu yapıyordum, arka arkaya gelen borular için bir script yazıyordum, scripti yazdım, gerekli ayarları yaptım ama oyunu çalıştırınca sadece 1 boru geliyor. Arka arkaya borular spawn olmuyor.

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawner : MonoBehaviour
{
    public birdcontroller Birdscript;

    public GameObject Borular;

    public float height;

    private void start()
    {
        StartCoroutine(SpawnObject());
    }

    public IEnumerator SpawnObject()
    {
        Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);
      
        yield return new WaitForSeconds(2f);

    }

}

start() metodunun içine yazdığınızdan dolayı böyle. Start() başta bir kere çalışır sonra durur.
update veya fixedUpdate metodlarından birisine yazmanız gerekiyor, aşağıdaki gibi;

C#:
private void update()
    {
        StartCoroutine(SpawnObject());
    }
 
start() metodunun içine yazdığınızdan dolayı böyle. Start() başta bir kere çalışır sonra durur.
update veya fixedUpdate metodlarından birisine yazmanız gerekiyor, aşağıdaki gibi;

C#:
private void update()
    {
        StartCoroutine(SpawnObject());
    }
Hocam bu ciddi anlamda belleği şişirebilir, böyle daha mantıklı

C#:
    public IEnumerator SpawnObject()
    {
        while (true)
        {
            Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);
      
            yield return new WaitForSeconds(2f);
        }
    }
 
Hocam bu ciddi anlamda belleği şişirebilir, böyle daha mantıklı

C#:
 public IEnumerator SpawnObject()
 {
 while (true)
 {
 Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);

 yield return new WaitForSeconds(2f);
 }
 }

Doğrudur Unity kullanmayalı uzun zaman oldu, gerçi belleği şişirmemesi için bir süre sonra borunun silinmesi de bir çözüm sayılabilir.
 
Start içerisinde çağıracaksanız spawn objecti şu şekilde değiştirin

C#:
    public IEnumerator SpawnObject()
    {
        Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);
   
        yield return new WaitForSeconds(2f);
        StartCoroutine(SpawnObject());

    }
Bu şekilde her 2 saniyede bir spawn objecti çağıracaksınız. Fonksiyon çağrılıp bittikten sonra 2 saniye sonra tekrar kendini çağıracak ve sonsuz döngüye girecek

Bu arada üstteki arkadaşın söylediği daha doğru bir yaklaşım aslında. While döngüsü içerisinde çağırırsanız startCoroutine'in yarattığı bellek kullanımını azaltmış olursunuz.
 
Son düzenleme:
Son komut bu ama yine çalışmıyor.
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawner : MonoBehaviour
{
    public birdcontroller Birdscript;

    public GameObject Borular;

    public float height;

    private void update()
    {
        StartCoroutine(SpawnObject());
    }

    public IEnumerator SpawnObject()
    {
        while (true)
        {
            Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);

            yield return new WaitForSeconds(2f);
        }
    }

}
 
Son komut bu ama yine çalışmıyor.
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawner : MonoBehaviour
{
    public birdcontroller Birdscript;

    public GameObject Borular;

    public float height;

    private void update()
    {
        StartCoroutine(SpawnObject());
    }

    public IEnumerator SpawnObject()
    {
        while (true)
        {
            Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);

            yield return new WaitForSeconds(2f);
        }
    }

}

Kod:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class spawner : MonoBehaviour

{

    public birdcontroller Birdscript;



    public GameObject Borular;



    public float height;



    private void Start()

    {

        StartCoroutine(SpawnObject());

    }



    public IEnumerator SpawnObject()

    {

            Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);



            yield return new WaitForSeconds(2f);

           StartCoroutine(SpawnObject());

    }



}

Bu şekilde yapın.
 
Kod:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class spawner : MonoBehaviour.

{

 public birdcontroller Birdscript;

 public GameObject Borular;

 public float height;

 private void Start()

 {

 StartCoroutine(SpawnObject());

 }

 public IEnumerator SpawnObject()

 {

 Instantiate(Borular, new Vector3(3, Random.Range(-height, height), 0), Quaternion.identity);

 yield return new WaitForSeconds(2f);

 StartCoroutine(SpawnObject());

 }

}

Bu şekilde yapın.

Kod çalışıyor ama geçen borular da silinirse iyi olur. Onu nasıl yapabilirim?
 
Kod çalışıyor ama geçen borular da silinirse iyi olur. Onu nasıl yapabilirim?
Bunu yapmanız çok işinize yarayacaktır. Oluşturduğunuz boruları bir listede tutun. Ekranınızda maksimum kaç tane boru gözüktüğüne bakın ve bundan 1 fazlasını garanti olsun diye ekranda bırakalım. Şu şekilde yapacağız
C#:
private List<GameObject> createdPipes = new();

private int maximumPipeCount = 7; //Ekranda max 6 tane pipe gözükecek varsayalım. 1 tane de garanti olsun fazladan tutalım



private IEnumerator CreatePipes()
{
    var pipe = Instantiate(pipePrefab,pipePosition,pipeRotation);
    createdPipes.Add(pipe);
    
    if(createdPipes.Count >= maximumPipeCount)
    {
        Destroy(createdPipes[0]);
        createdPipes.RemoveAt(0);
    }
    
    yield return new WaitForSeconds(2);
    StartCoroutine(CreatePipe());
}

Bunun yapılabilecek daha iyi bir versiyonu da var. O da şu. En başta toplam 7 tane boru oluşturup en soldaki boru ekrandan silindikten sonra onu en sağa tekrar çizerseniz toplamda sadece 7 tane boru kullanıp bunları döndürerek bellekten çok büyük bir tasarruf etmiş olursunuz. Buna Object Pooling denir. Araştırırsanız çok iyi şeyler öğrenebilirsiniz. Bu problem için biraz araştırın yapamazsanız onu da beraber yaparız
 
Bunu yapmanız çok işinize yarayacaktır. Oluşturduğunuz boruları bir listede tutun. Ekranınızda maksimum kaç tane boru gözüktüğüne bakın ve bundan 1 fazlasını garanti olsun diye ekranda bırakalım. Şu şekilde yapacağız.
C#:
private List<GameObject> createdPipes = new();

private int maximumPipeCount = 7; //Ekranda max 6 tane pipe gözükecek varsayalım. 1 tane de garanti olsun fazladan tutalım.

private IEnumerator CreatePipes()
{
 var pipe = Instantiate(pipePrefab,pipePosition,pipeRotation);
 createdPipes.Add(pipe);

 if(createdPipes.Count >= maximumPipeCount)
 {
 Destroy(createdPipes[0]);
 createdPipes.RemoveAt(0);
 }

 yield return new WaitForSeconds(2);
 StartCoroutine(CreatePipe());
}

Bunun yapılabilecek daha iyi bir versiyonu da var. O da şu. En başta toplam 7 tane boru oluşturup en soldaki boru ekrandan silindikten sonra onu en sağa tekrar çizerseniz toplamda sadece 7 tane boru kullanıp bunları döndürerek bellekten çok büyük bir tasarruf etmiş olursunuz. Buna object pooling denir. Araştırırsanız çok iyi şeyler öğrenebilirsiniz. Bu problem için biraz araştırın yapamazsanız onu da beraber yaparız.

Tamamdır reis araştırayım ben yapamazsan söylerim.
 

Geri
Yukarı