Apakah `menghasilkan pengembalian salah;` memiliki arti khusus dalam skrip C # Unity3d?

17

Di Unity, kami memiliki beberapa hal khusus untuk coroutine yang ditambahkan ke C # yang normal.

misalnya, bisa kita gunakan

yield return WaitForSeconds(5.f);

untuk memiliki coroutine, tunggu 5 detik sebelum melanjutkan.

Apa yang harus yield return false;dan yield return true;lakukan?

Almo
sumber
hm saya tidak yakin apakah yield return truemelakukan sesuatu yang istimewa. Tapi yield return nullcukup jeda untuk sebuah frame, jadi saya menduga itu yield return falsememiliki efek yang sama persis (juga yield return 0karena 0 false null semuanya sama di bawah tenda)
jhocking
@jhocking “karena 0 false null semuanya sama di bawah tenda” Mengapa itu penting? C # adalah bahasa yang sangat diketik, jadi sebagian besar waktu, bagaimana sesuatu terlihat "di bawah tenda" tidak masalah. Misalnya, Anda tidak bisa hanya melakukan if (0)atau if (null), tidak seperti di C dan C ++.
svick
mengangkat bahu maka itu tidak masalah. yang saya tahu hanya itu yang yield return 0berhasil; rupanya karena alasan MLM menjelaskan
jhocking
2
Ini bukan tambahan untuk C # normal. Kata yieldkunci telah ada sejak setidaknya C # 2.0. Yang dilakukan Unity hanyalah menyebutnya coroutine dan menangani iterator yang dihasilkan dan nilai yang dikembalikan darinya dengan cara yang dapat menyebabkan keterlambatan non-pemblokiran dalam pelaksanaan kode Anda.
ATAU Mapper
1
@Almo: Itu hanya karena WaitForSecondstidak dinyatakan. Segera setelah Anda mendeklarasikan metode yang dipanggil WaitForSecondsyang mengambil argumen float dan yang mengembalikan tipe elemen dari enumerasi yang Anda implementasikan, itu akan dikompilasi lagi. Karena itu, yieldtidak khusus untuk Persatuan. Jika ada, WaitForSecondsmetode ini khusus untuk Unity, tetapi meskipun demikian, metode ini tidak memperluas bahasa C #, tetapi merupakan metode tambahan yang ditulis menggunakan standar C #.
ATAU Mapper

Jawaban:

19

Satu-satunya nilai hasil yang mungkin dipahami oleh penjadwal adalah:

  • Kelas yang berasal dari YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestdan coroutine
  • sebuah WWWobjek
  • "Nilai lain" yang bukan salah satu dari yang di atas.

Jika "nilai lain" dihasilkan (yang termasuk "nol" nilai string jenis dasar lainnya seperti int, bool , ... atau referensi ke objek arbitrer yang bukan salah satu dari yang disebutkan di atas) penjadwal akan "jadwalkan" coroutine untuk frame berikutnya .

- Bunny83 answer: Anggota terkemuka di Unity Answers

Yang WaitForEndOfFramelain dan sejenisnya, hanyalah fungsi kosong yang menandaiYieldInstruction untuk memutuskan apa yang harus dilakukan di mesin.

Kasus default tampaknya WaitForEndOfFrame. Jadi, jika Anda yield returnsesuatu yang tidak memiliki makna khusus, seperti bool, itu sama dengan WaitForEndOfFrame.

Tampaknya tidak ada dokumentasi resmi tentang perilaku ini.


Memperbarui

berantakan berkomentar tentang kasus khusus lain:yield return null

Semua Unity Coroutine termasuk yield return null, berjalan sebelum frame merender kecuali WaitForEndOfFrame. Anda dapat menemukan Rutter 's jawaban mengagumkan selama di Unity Jawaban menjelaskan ini lebih lanjut (diagram bagus termasuk).

MLM
sumber
6
Sudah umum untuk menganggap bahwa menghasilkan nulldan WaitForEndOfFramesama, tetapi mereka sebenarnya sedikit berbeda , seperti yang dijelaskan pada halaman manual urutan eksekusi .
menggerutu