سؤال

حصلت على هذه الطريقة (داخل برنامج C# وحدة C#) ، لكنني لا أفهم كيف يعمل جزء "العائد" بالفعل.

أعلم من MSDN أن الوظيفة ستعود إلى جهاز ienumerator الذي يمكنني تكراره ، لكن هذا الرمز ينتظر 1،5 ثانية ولا يتم تكراره لأن هذا يعني ، تم إنشاء الكائنات التي تم إنشاؤها في الداخل عدة مرات. أي شخص هنا يمكن أن يشرح لي كيف يعمل هذا الرمز؟

IEnumerator DestroyShip()
{
    // create new gameobject
    Instantiate(ExplosionPrefab, transform.position, transform.rotation);
    // make current gameobject invisible
    gameObject.renderer.enabled = false;
    // set new position for the current gameobject
    transform.position = new Vector3(0f, transform.position.y, transform.position.z);
    // wait for 1,5 seconds 
    yield return new WaitForSeconds(1.5f);
    // make the current gameobject visible again
    gameObject.renderer.enabled = true;
}
هل كانت مفيدة؟

المحلول

يتم تكرار العداد الذي يولده المترجم لك. مرة واحدة.

سيقوم برنامج التحويل البرمجي بإنشاء فئة تنفذ Ienumerator ، والتي لها وظيفة movenext () وخاصية حالية. سيكون لدى الفصل جميع الأعضاء المطلوبين لتخزين حالة الوظيفة بين المكالمات. يمكن اعتبار التفاصيل الدقيقة "سحر المترجم".

الكائن من هذه الفئة التي تم إنشاؤها ، سيتم التعامل معها وإدارتها بواسطة محرك Unity3D. سيقوم محرك Unity3D باستدعاء movenext () على كل coroutine النشط مرة واحدة كل إطار (ما لم يتم توجيهه خلاف ذلك).

وقد مكن هذا المبرمج Unity3D من كتابة البرامج النصية التي يتم لعبها في إطار واحد في وقت واحد. مجموعة من سحر محرك C# Ces# Compiler و Unity3D ينتج عنه برمجة نصية للغاية ولكن لا يمكن استخدامها.

للإجابة على سؤالك: سيتم تنفيذ الكود في وظيفتك مرة واحدة ، لكنه سيتوقف في بيان "إرجاع العائد".

كما هو مذكور أعلاه ، يتم إنشاء كائن خاص ينفذ Ienumerator بواسطة برنامج التحويل البرمجي C#.

في أول مكالمة إلى Movenext () ، تقوم وظيفتك بإنشاء انفجار وتعيين الكائن الحالي على "WaitforSeconds (1.5F) الجديد".

يتفقد محرك Unity3D هذا الكائن ، ويرى أنه مثيل للفئة الخاصة "WaitforSeconds" ، لذا فإن وضع العداد في بعض قائمة انتظار الانتظار ، ولن يطلب العنصر الثاني حتى يتم تمرير 1.5 ثانية. في غضون ذلك ، سيتم تقديم العديد من الإطارات وسيتم لعب الانفجار.

بعد 1.5 ثانية ، ستقوم الوحدة بتجميع العداد من قائمة الانتظار ، وتدعو movenext () مرة أخرى. سيتم تنفيذ الجزء الثاني من وظيفتك الآن ، لكنه سيفشل في إنشاء كائن ثانٍ. ستعود Movenext () كاذبة للإشارة إلى أنها فشلت في الحصول على عنصر جديد ، وهو إشارة إلى Unity3D لرمي هذا العداد بعيدًا. سيقوم جامع القمامة باستعادة الذاكرة في وقت ما.

كما قيل: الكثير من المترجمات والسحر Unity3D مستمر. طالما أنك تتذكر أنه سيتم تعليق وظيفتك حتى الإطار التالي في كل عبارة إرجاع العائد ، ستعرف ما يكفي للاستفادة من تلك الوظائف الخاصة.

نصائح أخرى

لو yield يتم استخدامه مرة واحدة ، كما لو كنت تعود إلى عنصر واحد بعنصر واحد ، ولهذا السبب تحصل على انطباع بأنه لا يتكرر.

إنه استخدام غريب إلى حد ما للكلمة الرئيسية للعائد ، من الصعب فهم سبب تنفيذها لذلك دون رؤية السياق بأكمله.

من الأفضل العودة IEnumerable عوضا عن IEnumerator لأنه أكثر بذرة وسهلة الاستخدام. من الأفضل الاستخدام IEnumerable<T>. عائد العائد هو مجرد السكر النحوي لتنفيذ كتلة التكرار ، يقوم برنامج التحويل البرمجي بإنشاء الكود ذي الصلة لأنه لوحة غلاية قياسية يمكن إنشاؤها بشكل برمجي بسهولة. يمكنك استخدام العائد عمومًا عندما تريد إنشاء سلسلة من الإجراءات الفردية لتكون مجموعة ، على سبيل المثال:

public IEnumerable<Thing> GetThings()
{
    yield return GetNextThing();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top