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!
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 ♥
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();
}
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?
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;
}
Bu nasıl:
IEnumerator Bekle(float f)
{
print(“beklenecek”);
Time.timeScale = 0f;
yield return new WaitForSecondsRealtime(f);
Time.timeScale = 1f;
}
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.
Yada fiziksel kurallara maruz kalacak bir objenin harekete geçmeden izleyeceği yolu tespit etmenin farklı bir yolur var mıdır?
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.