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

التحقق من ملامسة الأرض باستخدام شعاع

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 35 من 63.

يجب أن تبدأ القفزة من الأرض فقط. حدّدت طريقة Standing on the Ground ذلك من خلال ناظمات التلامس، التي تُحدَّث باستمرار بواسطة رسائل التصادم. يجيب الشعاع فورًا، وفي أي لحظة، عن سؤال «هل أقف على شيء؟»: أطلقه عموديًا إلى الأسفل من المركز، واجعل طوله أكبر قليلًا من المسافة بين المركز والأسفل. هذا اللاعب كبسولة ارتفاعها وحدتان، لذا يقع أسفلها على بُعد وحدة واحدة تحت مركزها، وطول الشعاع 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

الزيادة البالغة 0.1 هي هامش. قد يستقر جسم على الأرض مع وجود فجوة صغيرة جدًا فوقها أو يتداخل معها قليلًا، لذا قد لا يصيب شعاع طوله 1 بالضبط الأرض في بعض الإطارات. أما جعل طوله أكبر بكثير فسيؤدي إلى المشكلة المعاكسة: عند ضبطه على 3، يمكن للاعب أن يقفز مجددًا وهو على ارتفاع وحدتين في الهواء، وإذا لم يكن للشعاع أي طول فسيعثر على الأرض دائمًا، وبالتالي تؤدي كل ضغطة إلى قفزة.

يبدأ الشعاع من داخل مُصادم اللاعب نفسه، الذي تتجاهله الأشعة، لذا لا يُشير إليه أبدًا. تُقرأ ضغطة المفتاح في Update()، لأن GetKeyDown تكون true لإطار واحد فقط، ويمكن إضافة دفعة لحظية مباشرةً هناك، كما في «القفز بدفعة لحظية».

challenge icon

التحدي

متوسط

يقفز الضفدع كلما ضُغط على مفتاح المسافة، حتى وهو في الهواء، لذا يمكنه الصعود إلى السماء. أصلح Hopper ليقفز من الأرض فقط:

  • أضف دالة bool IsGrounded() تطلق شعاعًا عموديًا إلى الأسفل من مركز الضفدع. الضفدع كرة بمقياس 1.5، لذا نصف قطرها 0.75: اجعل الشعاع يمتد إلى ما بعد أسفلها بمقدار 0.1.
  • اجعل الضفدع يقفز فقط عند الضغط على مفتاح المسافة وعندما تكون IsGrounded() صحيحة.

اضغط على تشغيل وحاول القفز مرتين، ثم اضغط على تحقّق.

جرّب بنفسك

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconاختبر نفسك

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

جميع دروس الفيزياء وأسلوب اللعب