`` Return return false; `có ý nghĩa đặc biệt trong các tập lệnh Unity3d C # không?


17

Trong Unity, chúng tôi có một số điều đặc biệt cho các coroutine bổ sung cho C # bình thường.

ví dụ: chúng ta có thể sử dụng

yield return WaitForSeconds(5.f);

để có một coroutine chờ 5 giây trước khi tiếp tục.

Làm gì yield return false;yield return true;làm gì?


hm tôi không chắc có yield return truelàm gì đặc biệt không Nhưng yield return nullchỉ đơn giản là tạm dừng cho một khung hình, vì vậy tôi nghi ngờ rằng nó yield return falsecó hiệu ứng chính xác tương tự (cũng yield return 0vì 0 sai null đều giống nhau dưới mui xe)
jhocking

@jhocking, kể từ 0 null null đều giống nhau dưới mui xe Tại sao điều đó lại quan trọng? C # là một ngôn ngữ được đánh máy mạnh mẽ, vì vậy, hầu hết thời gian, làm thế nào một cái gì đó trông giống như thế nào dưới mui xe. Ví dụ: bạn không thể làm if (0)hoặc if (null), không giống như trong C và C ++.
Svick

nhún vai thì không vấn đề gì. tất cả những gì tôi biết là yield return 0hoạt động; rõ ràng là vì lý do MLM giải thích
jhocking

2
Điều này không bổ sung cho C # bình thường. Các yieldtừ khóa đã được khoảng từ ít nhất là C # 2.0. Tất cả Unity làm là gọi nó là coroutine và xử lý trình lặp được tạo và các giá trị được trả về từ đó theo cách mà bạn có thể gây ra sự chậm trễ không chặn trong quá trình thực thi mã của mình.
HOẶC Mapper

1
@ Almo: Điều đó đơn giản là vì WaitForSecondskhông được khai báo. Ngay khi bạn khai báo một phương thức được gọi là WaitForSecondsđối số float và trả về kiểu phần tử của phép liệt kê mà bạn đang thực hiện, nó sẽ biên dịch lại. Do đó, yieldkhông đặc biệt đối với Unity. Nếu bất cứ điều gì, WaitForSecondsphương thức này đặc biệt đối với Unity, nhưng ngay cả khi đó, nó không mở rộng ngôn ngữ C #, mà chỉ đơn giản là một phương thức bổ sung được viết bằng C # tiêu chuẩn.
HOẶC Mapper

Câu trả lời:


19

Các giá trị năng suất duy nhất có thể mà trình lập lịch hiểu là:

  • Lớp học có nguồn gốc từ YieldInstruction( WaitForSeconds, WaitForEndOfFrame, WaitForFixedUpdate, AssetBundleCreateRequest, AssetBundleRequestvà coroutine
  • một WWWđối tượng
  • "Bất kỳ giá trị nào khác" không phải là một trong những điều trên.

Nếu "bất kỳ giá trị nào khác" được tạo ra (bao gồm "null", một giá trị chuỗi bất kỳ loại cơ bản nào khác như int, bool , ... hoặc tham chiếu đến một đối tượng tùy ý không phải là một trong những điều được đề cập ở trên), bộ lập lịch sẽ "Lịch trình" coroutine cho khung tiếp theo .

- Bunny83 trả lời: Thành viên nổi bật về câu trả lời của Unity

Những WaitForEndOfFramethứ tương tự khác, chỉ là các hàm trống gắn thẻ YieldInstructionđể quyết định những việc cần làm trong công cụ.

Các trường hợp mặc định dường như là WaitForEndOfFrame. Vì vậy, nếu bạn yield returnmột cái gì đó không có ý nghĩa đặc biệt, chẳng hạn như bool, nó cũng giống như WaitForEndOfFrame.

Dường như không có bất kỳ tài liệu chính thức nào về hành vi này.


Cập nhật

Rutter bình luận về một trường hợp đặc biệt khác:yield return null

Tất cả các Quân đoàn Unity bao gồm yield return null, chạy trước khi khung hình hiển thị ngoại trừ WaitForEndOfFrame. Bạn có thể tìm thấy câu trả lời tuyệt vời của Rutter tại Unity answer giải thích thêm về điều này (bao gồm các sơ đồ đẹp).


6
Người ta thường cho rằng năng suất nullWaitForEndOfFramegiống nhau, nhưng chúng thực sự hơi khác nhau , như chi tiết tại trang hướng dẫn thực hiện lệnh .
rầm rộ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.