Menu
CoddyTech

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

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

ينبغي أن تبدأ القفزة من الأرض فقط. استنتجت 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 تكون صحيحة لإطار واحد فقط، ويمكن إضافة دفعة لحظية مباشرةً هناك، كما في القفز باستخدام دفعة لحظية.

challenge icon

التحدي

متوسط

اجعل الضفدع يقفز من الأرض فقط.

  1. أضف bool IsGrounded() التي تُرجع Physics.Raycast(transform.position, Vector3.down, 0.85f): نصف قطر الضفدع، 0.75، زائد 0.1.
  2. في Update()، أضف && IsGrounded() إلى عبارة if عند الضغط على Space.

اضغط على «العب» واضغط على Space مرتين: يقفز الضفدع مرة واحدة. ثم اضغط على «تحقق».

جرّب بنفسك

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

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

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