Menu
CoddyTech

وجّه بالمضرب

الدرس 4 من 19 في دورة لعبة Unity: كاسر الطوب على Coddy.

مع ارتداد مثالي، لا يستطيع اللاعب التصويب. تتيح ألعاب كسر الطوب للمضرب تحديد الاتجاه: فالاصطدام قرب الطرف الأيسر يرسل الكرة إلى أعلى ويسارًا، والاصطدام في المنتصف يرسلها مباشرة إلى أعلى.

حوّل موضع الاصطدام إلى رقم من -1 عند الطرف الأيسر إلى 1 عند الطرف الأيمن: إزاحة الكرة على المحور x عن مركز المضرب، مقسومة على نصف عرض المضرب. إذا كان عرض المضرب 4 ومركزه عند x 2، وحدث الاصطدام عند x 3: فالإزاحة تساوي 1، ونصف العرض يساوي 2، لذا يكون الرقم 0.5 وتغادر الكرة في الاتجاه (0.5, 1, 0)، بعد تطبيعه. قيّد القيمة، لأن الكرة قد تلامس زاويةً تتجاوز الطرف قليلًا.

تعمل OnCollisionEnter بعد أن تحسب الفيزياء الارتداد، لذا فإن تعيين السرعة هناك يستبدلها. الجدران تصدّ الكرة أيضًا وتحافظ على ارتدادها المعتاد، لذا تحقّق من الوسم أولًا. collision.collider.bounds.size.x هو عرض المضرب في العالم.

challenge icon

التحدي

سهل

وجّه الكرة باستخدام المضرب: يحدد موضع هبوطها الزاوية.

  1. في Ball، أضف OnCollisionEnter(Collision collision)؛ وأعِد التنفيذ ما لم يكن الجسم الذي اصطدم به موسومًا بـ Paddle.
  2. احسب float x: اطرح قيمة x للمضرب من قيمة x للكرة، ثم اقسم الناتج على نصف collision.collider.bounds.size.x، واجعل القيمة ضمن النطاق من -1 إلى 1.
  3. عيّن rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

اضغط «العب» والتقط الكرة بالطرف الأيسر للمضرب: ستنطلق نحو اليسار. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}

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

تدرّب بنفسك: Playground لـ Unity