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

حافظ على السرعة

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

لا تتباطأ كرة لعبة تكسير الطوب أبدًا. تتولى PhysicsMaterial معظم المهمة: فمعامل الارتداد 1 يحافظ على كل سرعة الارتداد، والاحتكاك 0 يمنع الجدران من إبطاء الكرة أو جعلها تدور. لا تمتلك الجدران والطوب مادة خاصة بها، وتجمع Unity قيم المصادمين، افتراضيًا باستخدام Average: فتجعل قيمة الكرة 1 وقيمة الجدار الافتراضية 0 الارتداد بنصف السرعة. يتيح bounceCombine = Maximum وfrictionCombine = Minimum لقيم الكرة نفسها أن تسود على أي شيء تصطدم به.

مع ذلك، لا تزال الفيزياء غير دقيقة تمامًا: إذ يضيف المضرب المتحرك سرعته إلى الارتداد، وتدفع الكرتان إحداهما الأخرى، وتتراكم الأخطاء على مدى مئات الارتدادات. لذا، في كل FixedUpdate، تحتفظ الكرة باتجاهها وتُضبط سرعتها من جديد. كما أن خيار Freeze Position Z مفعّل لجسم الكرة الصلب في Inspector، ما يبقيها في مستوى اللعب.

تحتاج لعبة مختلفة إلى قاعدة مختلفة. فقد يتباطأ قرص هوكي الهواء، لكن لا يتجاوز حدًا أقصى للسرعة، وتقصّر Vector3.ClampMagnitude المتجه إذا كان أطول من اللازم، وتترك المتجه الأقصر كما هو:

void FixedUpdate()
{
    rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}

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

challenge icon

التحدي

سهل

في Ball:

  1. في Awake()، أنشئ new PhysicsMaterial("Bouncy") مع ارتداد بقيمة 1، واحتكاك ديناميكي وثابت بقيمة 0، واجعل bounceCombine بقيمة Maximum وfrictionCombine بقيمة Minimum، ثم أضِفه إلى مصادم الكرة باستخدام GetComponent<Collider>().material.
  2. أضِف FixedUpdate(): عندما تكون الكرة قد انطلقت، اجعل linearVelocity مساويًا لاتجاهها الحالي مضروبًا في speed.

في Unity يمكنك أيضًا إنشاء المادة كأصل (Create > Physics Material) وسحبها إلى خانة Material في Sphere Collider؛ أما هنا فينشئها البرنامج النصي.

اضغط تشغيل، وأطلِق الكرة وشاهدها ترتد، ثم اضغط تحقّق.

جرّب بنفسك

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>();
    }

    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;
    }
}
quiz iconاختبر نفسك

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

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