المضرب
الدرس 1 من 16 في دورة لعبة Unity: تحطيم الطوب على Coddy.
في هذه الدورة، ستبني لعبة كسر الطوب ثلاثية الأبعاد: مضربًا في الأسفل، وكرة ترتد بين الجدران، وجدارًا من الطوب لتكسيره. يضيف كل درس ميزة واحدة: الطوب، والأرواح، والمستويات، وشاشة انتهاء اللعبة، ومعززات القوة التي توسّع المضرب أو تقسّم الكرة. المشهد جاهز: تنظر الكاميرا إلى ساحة اللعب من الأمام، وتتحرك جميع العناصر في المستوى x وy عند z = 0. أما السكريبتات Paddle وBall وBrick وGameManager وPowerUp فهي هياكل أولية قصيرة في الوقت الحالي.
للمضرب مكوّن Rigidbody حركي، ويُحرَّك باستخدام MovePosition في FixedUpdate، كي ترى الفيزياء حركته وتتمكن ارتدادات الكرة من الاستفادة من ذلك لاحقًا. لا تتوقف الأجسام الحركية أبدًا بفعل المصادمات التي لا تحتوي على Rigidbody، لذا لن تمنعه الجدران الجانبية من الحركة؛ إذ يُبقيه السكريبت داخل الحدود. إن حصر المركز عند الجدار سيُبقي نصف الجسم داخل الجدار، لذا يكون الحد عند الجدار مطروحًا منه نصف حجم الجسم. تعمل عربة المصعد هذه في عمود يمتد من y = 0 إلى y = 12 بالطريقة نفسها على المحور y:
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);هنا تكون قيمة input هي 1 عند الصعود، و-1 عند النزول، و0 فيما عدا ذلك. تبقى عربة ارتفاعها وحدتان ومركزها بين 1 و11، لذا تتوقف نهايتاها تمامًا عند 0 و12. يكون طول كل ضلع في العنصر البدائي Cube وحدة واحدة، لذا تمثل localScale.y ارتفاع العربة، وقراءتها في كل خطوة تُبقي الحدود صحيحة إذا تغيّر الحجم أثناء تشغيل اللعبة.
التحدي
سهلاكتب حركة المضرب في FixedUpdate() الخاصة بـ Paddle:
- أنشئ
float input: تكون القيمة -1 عند الضغط على السهم الأيسر أو A، و1 عند الضغط على السهم الأيمن أو D، و0 خلاف ذلك. - احسب الموضع المستهدف: موضع Rigidbody بعد تحريكه إلى اليمين بمقدار
input * speed * Time.fixedDeltaTime. - قيّد قيمة x للموضع المستهدف بحيث تتوقف نهايتا المضرب عند الوجهين الداخليين للجدارين،
-wallXوwallX. عرض المضرب هوtransform.localScale.x. - حرّكه إلى هناك باستخدام
rb.MovePosition.
اضغط Play، وحرّك المضرب حتى يلامس كلا الجدارين، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // تقع الأوجه الداخلية للجدارين الجانبيين عند -wallX وwallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// تحرّك باستخدام مفاتيح الأسهم أو A وD، وابقَ بين الجدارين.
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.