الحلقات داخل الكوروتينات
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 24 من 63.
تعمل الحلقة التي تحتوي على yield return بداخلها عبر العديد من الإطارات، لأن كل دورة تتوقف مؤقتًا قبل التالية. باستخدام WaitForSeconds تكرّر الحلقة شيئًا بإيقاع منتظم. يومض هذا المنبّه 3 مرات:
IEnumerator Flash()
{
for (int i = 0; i < 3; i++)
{
lamp.enabled = true;
yield return new WaitForSeconds(0.2f);
lamp.enabled = false;
yield return new WaitForSeconds(0.2f);
}
}باستخدام yield return null تنفّذ الحلقة شيئًا صغيرًا في كل إطار حتى يتحقق شرطها، وهذه هي الطريقة التي تحرّك بها coroutine شيئًا ما. يكبر هذا البالون، الذي مقياسه 1، بمقدار 0.5 في الثانية حتى يصل مقياسه إلى 2، ثم يعرض رسالة:
IEnumerator Inflate()
{
while (transform.localScale.x < 2f)
{
transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
yield return null;
}
Debug.Log("Full");
}تعمل Time.deltaTime هنا كما في Update(): تُستأنف coroutine مرة واحدة في كل إطار، ولا يُنفّذ السطر الذي يلي الحلقة إلا عند انتهائها. من دون yield، تعمل الحلقة بأكملها في إطار واحد ويصبح البالون ممتلئًا فورًا. لا بأس باستخدام حلقة while (true) في coroutine ما دامت تُنفّذ yield في كل دورة؛ فمن دون yield لا تعيد الإطار، ويتجمّد محرر Unity.
التحدي
سهليبدأ الضغط على مفتاح المسافة coroutine Ride الخاص ببوابة القلعة Portcullis. اكتب Ride بحيث تقوم البوابة برحلة كاملة واحدة:
- ترتفع بمقدار
height(3) وحدات بسرعةspeed(1.5) وحدة في الثانية، وتتوقف تمامًا عند الأعلى وتسجلOpen. - تبقى مفتوحة لمدة ثانية واحدة.
- تنزل بالسرعة نفسها إلى موضع بدايتها (
down) وتسجلClosed.
اضغط Play ثم اضغط مفتاح المسافة، وبعدها Check.
جرّب بنفسك
using System.Collections;
using UnityEngine;
public class Portcullis : MonoBehaviour
{
public float speed = 1.5f;
public float height = 3f;
Vector3 down;
void Start()
{
down = transform.position;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Ride());
}
}
IEnumerator Ride()
{
// ارتفع بمقدار height وحدة بسرعة speed وسجّل Open، وانتظر 1 ثانية، ثم عُد إلى الأسفل وسجّل Closed
yield return null;
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي