`return return เท็จมีความหมายพิเศษใน Unity3d C # script หรือไม่


17

ใน Unity เรามีสิ่งพิเศษสำหรับ coroutines ที่เพิ่มเติมจาก C # ปกติ

ตัวอย่างเช่นเราสามารถใช้

yield return WaitForSeconds(5.f);

เพื่อให้ coroutine รอ 5 วินาทีก่อนดำเนินการต่อ

ทำอะไรyield return false;และyield return true;ทำอย่างไร


อืมฉันไม่แน่ใจว่าyield return trueจะทำสิ่งที่พิเศษหรือไม่ แต่yield return nullเพียงหยุดเฟรมดังนั้นฉันสงสัยว่าyield return falseมีผลเหมือนกันแน่นอน (เช่นyield return 0ตั้งแต่ 0 โมฆะเท็จเหมือนกันทั้งหมดภายใต้ประทุน)
jhocking

@ jhocking“ ตั้งแต่ 0 โมฆะผิดเหมือนกันหมดในฮูด” ทำไมถึงเป็นเช่นนั้น? C # เป็นภาษาที่ใช้พิมพ์ได้ดีมากดังนั้นส่วนใหญ่แล้วสิ่งที่ดูเหมือน "ภายใต้ประทุน" ไม่สำคัญ ตัวอย่างเช่นคุณไม่สามารถทำได้if (0)หรือif (null)แตกต่างจาก C และ C ++
svick

ยักแล้วมันไม่สำคัญ ทั้งหมดที่ฉันรู้ก็คือมันyield return 0ใช้ได้ผล เห็นได้ชัดเนื่องจากเหตุผล MLM อธิบาย
jhocking

2
สิ่งนี้ไม่ได้เพิ่มเติมจาก C # ปกติ yieldคำหลักที่ได้รับรอบตั้งแต่อย่างน้อย C # 2.0 All Unity จะเรียกมันว่าcoroutineและจัดการ iterator ที่สร้างขึ้นและค่าที่ส่งคืนมาจากมันในแบบที่คุณสามารถทำให้เกิดความล่าช้าที่ไม่ปิดกั้นในการเรียกใช้โค้ดของคุณ
หรือผู้ทำแผนที่

1
@Almo: นั่นเป็นเพียงเพราะWaitForSecondsไม่ได้ประกาศ ทันทีที่คุณประกาศเมธอดที่เรียกWaitForSecondsว่าใช้อาร์กิวเมนต์แบบลอยและส่งกลับชนิดองค์ประกอบของการแจงนับที่คุณกำลังใช้มันจะรวบรวมอีกครั้ง ดังนั้นจึงyieldไม่ใช่เรื่องพิเศษสำหรับ Unity หากมีสิ่งใดWaitForSecondsวิธีการพิเศษสำหรับ Unity แต่ถึงกระนั้นก็ไม่ได้ขยายภาษา C # แต่เป็นเพียงวิธีการพิเศษที่เขียนโดยใช้มาตรฐาน C #
หรือผู้ทำแผนที่

คำตอบ:


19

ค่าตอบแทนที่เป็นไปได้เพียงอย่างเดียวที่ผู้จัดตารางเข้าใจคือ:

  • การเรียนการสอนที่ได้มาจากYieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestและ coroutine
  • WWWวัตถุ
  • "ค่าอื่นใด"ซึ่งไม่ใช่ค่าใดค่าหนึ่ง

หากมีการให้"ค่าอื่นใด" (ซึ่งรวมถึง "null" เป็นค่าสตริงชนิดพื้นฐานอื่น ๆ เช่น int, bool , ... หรือการอ้างอิงไปยังวัตถุโดยพลการซึ่งไม่ได้กล่าวถึงข้างต้น) ตัวกำหนดตารางเวลาจะ"ตารางเวลา" coroutine สำหรับเฟรมถัดไป

- คำตอบ Bunny83: สมาชิกที่โดดเด่นใน Unity Answers

WaitForEndOfFrameและอื่น ๆ เช่นที่มีฟังก์ชั่นเพียงเปล่าว่าแท็กYieldInstructionเพื่อที่จะตัดสินใจว่าจะทำอย่างไรในเครื่องยนต์

WaitForEndOfFrameกรณีที่เริ่มต้นน่าจะเป็น ดังนั้นถ้าคุณบางสิ่งบางอย่างที่ไม่ได้มีความหมายพิเศษเช่นบูลก็เป็นเช่นเดียวกับyield returnWaitForEndOfFrame

ดูเหมือนจะไม่มีเอกสารประกอบอย่างเป็นทางการเกี่ยวกับพฤติกรรมนี้


ปรับปรุง

Rutterแสดงความคิดเห็นเกี่ยวกับกรณีพิเศษอื่น:yield return null

ทั้งหมดของ Coroutines ความสามัคคีรวมถึงการเรียกใช้ก่อนที่จะกรอบวาทกรรมที่ยกเว้นyield return null WaitForEndOfFrameคุณสามารถค้นหารัต 's คำตอบที่น่ากลัวมากกว่าที่สามัคคีคำตอบอธิบายนี้ต่อไป (แผนภาพที่ดีรวม)


6
เป็นเรื่องปกติที่จะสมมติว่าการให้ผลผลิตnullและWaitForEndOfFrameเหมือนกัน แต่จริง ๆ แล้วจะแตกต่างกันเล็กน้อยตามรายละเอียดในหน้าคู่มือการดำเนินการ
พูดจาโผงผาง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.