أول Coroutine لك
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 24 من 71.
يجب أن تنتهي Update() في كل إطار، لذا لا يمكنها الانتظار. لكن الروتين المشترك يمكنه ذلك: فهو دالة تتوقف مؤقتًا ثم تتابع لاحقًا من حيث توقفت. وتُرجع IEnumerator، ما يتطلب using System.Collections;، وكل yield return فيها يمثّل توقفًا مؤقتًا. في C#، تجعل yield return الدالة تسلّم قيمها واحدة تلو الأخرى؛ وتطلب Unity القيمة التالية عند انتهاء الانتظار. ينتظر yield return null إطارًا واحدًا، بينما ينتظر yield return new WaitForSeconds(3f) مدة 3 ثوانٍ.
يبدأ StartCoroutine(Cycle()) روتينًا مشتركًا. يتحول ضوء المرور هذا إلى الأخضر، ثم إلى الأصفر بعد 3 ثوانٍ، ثم إلى الأحمر بعد ثانية أخرى:
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}ينفّذ StartCoroutine الروتين المشترك حتى أول yield فورًا، ثم تتابع Start() عملها؛ وتستأنفه Unity بعد كل انتظار، مع بقاء متغيراته المحلية كما كانت. أما Cycle(); وحدها، من دون StartCoroutine، فلا تفعل شيئًا: فهي تنشئ الدالة المتوقفة مؤقتًا ثم تتخلّص منها، ولا يُنفّذ منها أي سطر. كذلك، فإن yield return 3f; لا ينتظر 3 ثوانٍ: لا تعرف Unity سوى كائنات الانتظار مثل WaitForSeconds، وتتعامل مع أي قيمة أخرى على أنها إطار واحد.
التحدي
سهلاجعل فخ الأشواك يقفز عند الضغط على مفتاح المسافة باستخدام coroutine.
- اكتب
IEnumerator Spring(): سجّلClick، ثمyield return new WaitForSeconds(0.5f);، ثمtransform.position += Vector3.up;. - انتظر بعد ذلك ثانيتين بالطريقة نفسها، ثم أزِل
Vector3.upمرة أخرى. - داخل شرط
ifالخاص بمفتاح المسافة، ابدأها باستخدامStartCoroutine(Spring());.
اضغط على «العب» ثم اضغط على مفتاح المسافة: تقفز الأشواك إلى الأعلى، ثم تهبط. ثم اضغط على «تحقق».
جرّب بنفسك
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// فعّل الفخ باستخدام coroutine
}
}
// IEnumerator Spring(): انقر، انتظر 0.5 s، اصعد 1 وحدة، انتظر 2 s، انزل 1 وحدة
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity