Unity Çerez Ders: WaitForSeconds Objelerini Yeniden Kullanmak (Obje Havuzu)

Yayınlandı: 14 Eylül 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

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!

yorum
  1. MT dedi ki:

    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 dedi ki:

    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();

    }

    • yasirkula dedi ki:

      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?

      • MT dedi ki:

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

      • yasirkula dedi ki:

        Bu nasıl:

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

  3. Yasir Sarıbaş dedi ki:

    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.

    • Yasir Sarıbaş dedi ki:

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

    • yasirkula dedi ki:

      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.

Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.