`Verim yanlış döndürür mü? '' Unity3d C # betiklerinde özel bir anlamı var mı?


17

Unity'de, normal C # 'a ek olarak koroutinler için bazı özel şeylerimiz var.

örneğin,

yield return WaitForSeconds(5.f);

devam etmeden önce 5 saniye beklemede olan bir program.

Ne yapmalı yield return false;ve yield return true;yapmalı?


yield return trueÖzel bir şey yapıp yapmadığından emin değilim . Ama yield return nullsadece bir çerçeve için duraklar, bu yüzden yield return falsetam olarak aynı etkiye sahip olduğundan şüpheleniyorum (ayrıca yield return 00 yanlış boş başlık altında aynıdır)
15

@jhocking “0 yanlış boş başlık altında olduğu için” Neden önemli? C #, güçlü bir şekilde yazılmış bir dildir, bu nedenle çoğu zaman, bir şeyin “başlık altında” nasıl göründüğü önemli değildir. Örneğin, C ve C ++ 'dan farklı olarak if (0)veya yapamazsınız if (null).
svick

omuz silkme o zaman önemli değil. tek bildiğim yield return 0işe yarıyor; Görünüşe göre
MLM'in

2
Bu normal C # için ek değildir . yieldAnahtar kelime en az C # 2.0 yana civarında olmuştur. Tüm Birlik, koroutin olarak adlandırılır ve oluşturulan yineleyiciyi ve ondan döndürülen değerleri, kodunuzun yürütülmesinde engellemeyen gecikmelere neden olacak şekilde işler.
VEYA Haritacı

1
@Almo: Bunun nedeni sadece WaitForSecondsbeyan edilmemiş olmasıdır. WaitForSecondsBir float argümanı alan ve uyguladığınız numaralandırmanın öğe türünü döndüren adlı bir yöntemi bildirir bildirmez , yeniden derlenir. Bu nedenle, yieldBirliğe özel değildir. Bir şey varsa, WaitForSecondsyöntem Unity'ye özeldir, ancak o zaman bile, C # dilini genişletmez , ancak standart C # kullanılarak yazılan ekstra bir yöntemdir.
VEYA Haritacı

Yanıtlar:


19

Programlayıcının anlayabileceği tek verim değerleri şunlardır:

  • Türetilen sınıflar YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest,AssetBundleRequest ve eşyordam
  • bir WWW nesne
  • "başka bir değer"yukarıdakilerden biri olmayan .

"Başka bir değer" verilirse ("null" bir dize değeri içerir, int, bool , ... gibi herhangi bir başka temel tür veya yukarıda belirtilenlerden biri olmayan rastgele bir nesneye başvuru), zamanlayıcı bir sonraki kare için koroutini "planlayın" .

- Bunny83 cevabı: Unity Answers'daki tanınmış üye

Ve WaitForEndOfFramebenzerlerinin diğerleri, yalnızcaYieldInstruction motorda ne yapılacağına karar vermek için .

Varsayılan durum böyle görünüyor WaitForEndOfFrame. Dolayısıyla yield return, bool gibi özel bir anlamı olmayan bir şey varsa ,WaitForEndOfFrame .

Bu davranışla ilgili resmi bir belge yok gibi görünüyor.


Güncelleme

Rutter başka bir özel durum hakkında yorum yaptı:yield return null

Dahil olan tüm Unity Coroutines yield return null, çerçeve hariç önce oluşturulmadan önce çalışır WaitForEndOfFrame. Sen bulabilirsiniz Rutter 'ın Cevaplar Unity üzerinde müthiş cevabı bu ileri (güzel şemaları dahil) açıklayan.


6
Bu verimli olduğunu varsaymak yaygındır nullve WaitForEndOfFrameaynıdır, ancak bunlar aslında biraz farklı adresinde ayrıntılı olarak, yürütme sırası manuel sayfa.
rutter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.