Merhabalar,

Unity‘deki coroutine‘lerde yield return new WaitForSeconds(1f); veya yield return new WaitForSecondsRealtime(1f); sıklıkla kullanılan komutlardır. Ancak bu satırlar her çalıştığında yeni bir WaitForSeconds objesi için bellek ayrılır (allocation). Bunun önüne geçmek için, obje havuzu pattern’inden faydalanan basit bir script yazdım.

Yapmanız gereken, projenizde BetterWaitForSeconds adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/5cd2681d0cfdbf6ed4a369e1664cfb98

Ardından coroutine’lerinizde yield return BetterWaitForSeconds.Wait(1f); veya yield return BetterWaitForSeconds.WaitRealtime(1f); satırlarını kullanarak, otomatik olarak obje havuzundan faydalanan WaitForSeconds objeleri ile çalışabilirsiniz.

Diğer derslerde görüşmek üzere!

Yasir Sarıbaş için bir cevap yazın Cevabı iptal et


8 yanıt

  1. MT Avatar

    Time.timeScale = 0f;
    yield return new WaitForSecondsRealtime(f);
    Time.timeScale = 1f;

    Bununla oldu. Hızlı cevabınız ve çözümünüz için Çok Teşekkürler ♥

  2. Murat Avatar

    Merhaba,
    Oyunda düşen objeler var bu yüzden Ödüllü reklam sonrası 2-3 saniye beklesin, sonra başlasın istiyorum. Ancak sanırım Abmod Time.timeScale’i 0 ve 1f yaptığı için bizim 3 saniye durdurma olayımız işlemiyor.

    reklamDurumu şeklinde bool bir değişken ile waitforseconds kullanarak yapayım dedim ama olmadı.

    Reklam sonrası bekleme için ne tavsiye edersiniz?

    public void OdulluReklamKazanildi(object sender, Reward args)
    {
    reklamDurum = false;
    string type = args.Type;
    double amount = args.Amount;
    MonoBehaviour.print( “Odul alindi: ” + amount.ToString() + ” ” + type);

    tm.text = “Odul : ” + amount.ToString();

    }

    1. yasirkula Avatar

      OdulluReklamKazanildi’nın içinde StartCoroutine yapıp o coroutine’de 3 saniye bekleyince olmuyor mu yani? Hiç beklemiyor mu yoksa sonsuza dek mi bekliyor?

      1. MT Avatar

        public void OdulluReklamKazanildi(object sender, Reward args)
        {
        reklamDurum = false;
        string type = args.Type;
        double amount = args.Amount;
        MonoBehaviour.print( “Odul alindi: ” + amount.ToString() + ” ” + type);

        tm.text = “Odul : ” + amount.ToString();

        StartCoroutine ( Bekle(3f) );

        }

        IEnumerator Bekle(float f)
        {
        print(“beklenecek”);
        yield return new WaitForSeconds(f);
        Time.timeScale = 1f;
        }

        bu şekilde denedim ama olmadı.
        Hemen devam ediyor.

        yield return kısmını While içine alıp denedim bu sefer de hiç devam etmedi.

        IEnumerator Bekle(float f)
        {
        print(“beklenecek”);
        while (f>0) {
        yield return new WaitForSeconds(1);
        f = f-1f;
        }
        Time.timeScale = 1f;
        }

      2. yasirkula Avatar

        Bu nasıl:

        IEnumerator Bekle(float f)
        {
        print(“beklenecek”);
        Time.timeScale = 0f;
        yield return new WaitForSecondsRealtime(f);
        Time.timeScale = 1f;
        }

  3. Yasir Sarıbaş Avatar
    Yasir Sarıbaş

    Hocam konu başlığından alakasız olacak fakat bir sorum var. Rigidbody ile hareket ettirdiğim iki objem var ve bunlar aynı yolu izlemelerine rağmen girdikleri çekim alanlarında(içerisine giren objelere kuvvet uygulayan collider’lar) farklı oranlarda itmeye maruz kalıyorlar yani aynı rotayı izlemiyorlar. Objelerden biri v hızında t timescale’inde (oyun akışı hızında) ve f kadar kuvvete maruz kalırken diğeri 500 v hızında 0.1 t’de ve 500 f kuvvete maruz kalıyor. Rigidbody’ dynamic şeylerini felan aktif ettim yada az kuvvete maruz kalan objemin kuvvet kodlarını döngülere koyarak tekrarlı yaptım (frame başına tek 100f yerine 5 kere 20 f) fakat işe yaramadı. Sorun programda mı yoksa bende midir bi fikriniz var mı? Teşekkür ederim.

    1. Yasir Sarıbaş Avatar
      Yasir Sarıbaş

      Yada fiziksel kurallara maruz kalacak bir objenin harekete geçmeden izleyeceği yolu tespit etmenin farklı bir yolur var mıdır?

    2. yasirkula Avatar

      Objenin izleyeceği yolu bulmak için Unity’nin sağladığı bir yöntem var (1, 2) ama bu yöntem sizin güç alanlarınızdan etkilenir mi onu bilmiyorum.