Menu
CoddyTech
flag Ar iconالعربيةdown icon

مضرب عريض

الدرس 14 من 16 في دورة لعبة Unity: تحطيم الطوب على Coddy.

تجعل قوة التعزيز «عريض» المضرب أعرض لبضع ثوانٍ عند التقاطها. تكتشف قوة التعزيز التقاطها: يلامس مصادم المشغّل الخاص بها مصادم المضرب، وكلا الجسمين حركيان، وهذا يكفي لتشغيل OnTriggerEnter. كما أنها تمر عبر الكرة أثناء سقوطها، لذا تتحقق من الوسم. ويُميّز تعدادٌ يضم الأنواع، ويُحدَّد لكل عنصر مسبق في نافذة Inspector، بين قوى التعزيز المختلفة.

التأثير المحدد بوقت هو coroutine: غيّر، وانتظر، ثم أعد التغيير. إذا حدث التقاط ثانٍ بينما لا يزال الأول قيد التشغيل، فيجب أن يبدأ الوقت من جديد؛ لذا احتفظ بالكائن Coroutine الذي تُعيده StartCoroutine وأوقفه قبل بدء واحد جديد. وإلا سينتهي الأول مبكرًا ويلغي تأثير الثاني. إليك تعزيز السرعة:

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

يضبط التعزيز السرعة انطلاقًا من normalSpeed، التي حُفظت مرة واحدة، بدلًا من مضاعفة السرعة الحالية ثم تنصيفها لاحقًا: فتعزيزان متتاليان سيجعلان السرعة أكبر بأربع مرات. ويقرأ حدّ المضرب عرضه في كل خطوة بالفعل، لذا يظل المضرب العريض يتوقف عند الجدران.

challenge icon

التحدي

صعب
  1. في PowerUp، أضف public enum Kind { Wide, Multiball } وpublic Kind kind (حدّد كل عنصر جاهز نوعه). أضف OnTriggerEnter: عندما يلامس عنصر القوة الجسم الموسوم بـPaddle، يستدعي عنصر Wide الدالة Widen() في سكربت Paddle الخاص بذلك الجسم، ويُدمّر كلا النوعين عنصر القوة.
  2. في Paddle، أضف public float wideFactor = 1.6f وpublic float wideSeconds = 8f، واحفظ العرض الطبيعي للمضرب، أي مقياسه على المحور x، في Awake().
  3. اكتب public void Widen(): تبدأ دالةً روتينية تضبط مقياس المضرب على المحور x ليكون wideFactor مضروبًا في العرض الطبيعي، وتنتظر wideSeconds، ثم تعيد العرض الطبيعي. عند التقاط عنصر قوة أثناء التوسّع، يُعاد تشغيل المؤقت.

يُلتقط عنصر قوة Multiball ولا يفعل شيئًا حتى الآن.

اضغط 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()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Unity: تحطيم الطوب