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

الوقوف على الأرض

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

لكل تماس عمودي: اتجاه طوله 1، عمودي على السطح الذي لمسته، ويشير مبتعدًا عنه نحو جسمك. يمثّل collision.GetContact(0) أول نقطة تماس، ويخبرك normal بأي جانب لمست. عند الوقوف على أرض مستوية تكون قيمته (0, 1, 0)؛ وعند ملامسة جدار على يمينك تكون (-1, 0, 0)؛ وعند اصطدام رأسك بسقف تكون (0, -1, 0).

يميز هذا الصندوق بين الهبوط والارتطام بجانب:

void OnCollisionEnter(Collision collision)
{
    Vector3 normal = collision.GetContact(0).normal;
    if (normal.y > 0.5f)
    {
        Debug.Log("Landed on " + collision.gameObject.name);
    }
    else
    {
        Debug.Log("Bumped the side of " + collision.gameObject.name);
    }
}

الاختبار هو normal.y > 0.5f بدلًا من أن يساوي 1 تمامًا، لكي تُحتسب المنحدرات أرضًا أيضًا: تكون قيمة y هي 0.5 على منحدر بزاوية 60 درجة، وهو أشد انحدارًا مما يمكن لأي شخص صعوده مشيًا. وهناك رسالتان إضافيتان تفيدان في أي شيء يستمر: تعمل OnCollisionStay في كل خطوة فيزيائية ما دام التماس قائمًا، وتعمل OnCollisionExit مرة واحدة عند انتهائه. لا تحتوي حالة الخروج على نقاط تماس، لأن لا شيء يعود يلامس شيئًا، لذا لا تستدعِ GetContact هناك.

challenge icon

التحدي

سهل

يمكن للاعب المشي والقفز، لكن زر المسافة يعمل أيضًا في الهواء، لذا يمكنه تسلّق السماء قفزةً تلو الأخرى، والقفز مبتعدًا عن جانب الجدار. (مُصادِم اللاعب مصنوع من مادة عديمة الاحتكاك، لذا ينزلق على الجدران بدلًا من الالتصاق بها.) اجعل اللاعب يقفز فقط عندما يكون واقفًا على شيء ما.

  • احتفظ بقيمة bool grounded: تكون true ما دام اللاعب يلامس شيئًا يتجه عمودي التلامس معه إلى الأعلى (y أكبر من 0.5)، وتكون false بمجرد أن يتوقف عن ملامسته.
  • لا تقفز إلا إذا تم الضغط على زر المسافة وكانت قيمة grounded هي true. يتم تجاهل الضغط في الهواء، ولا يُحفظ حتى الهبوط.

اضغط على Play، وحاول القفز مرتين وتسلق الجدار، ثم اضغط على Check.

جرّب بنفسك

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float speed = 4f;
    public float jump = 6f;
    private Rigidbody rb;
    private bool jumpPressed;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            jumpPressed = true;
        }
    }

    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
        if (jumpPressed)
        {
            rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
            jumpPressed = false;
        }
    }
}
quiz iconاختبر نفسك

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

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