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

تطبيق الجاذبية يدويًا

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

لا يسقط CharacterController إلا إذا جعلته الشيفرة البرمجية يسقط، والسقوط الحقيقي يتسارع: إذ تضيف الجاذبية نحو 9.81 وحدة في الثانية إلى سرعة السقوط كل ثانية. لذلك تحتفظ الشيفرة البرمجية بالسرعة الرأسية في حقل، وتضيف إليها gravity * Time.deltaTime في كل إطار، وتتحرك بها ضمن Move نفسه المستخدم للمشي:

public float gravity = -9.81f;
float verticalSpeed;

void Update()
{
    if (controller.isGrounded && verticalSpeed < 0f)
    {
        verticalSpeed = -2f;   // على الأرض: أوقف السقوط، وأبقِ دفعًا خفيفًا نحو الأسفل
    }
    verticalSpeed += gravity * Time.deltaTime;

    Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
    move.y = verticalSpeed;
    controller.Move(move * Time.deltaTime);
}

تظهر Time.deltaTime مرتين لمهمتين مختلفتين: gravity * Time.deltaTime هي السرعة المكتسبة في هذا الإطار، والسرعة مضروبة في Time.deltaTime هي المسافة المقطوعة في هذا الإطار. السرعة حقل لأنها يجب أن تستمر من إطار إلى آخر؛ فالمتغير المحلي سيبدأ من جديد عند 0 في كل إطار. عند السقوط من السكون، تصبح سرعة المتحكم ‎-4.9 وحدة في الثانية بعد نصف ثانية، و‎-9.81 بعد ثانية واحدة.

إعادة الضبط لا تقل أهمية عن السقوط. على الأرض، يوقف Move المتحكم، لكن لا شيء يوقف الحقل: من دون إعادة الضبط، تستمر قيمته في الازدياد بينما يقف اللاعب، وعند الخطوة التالية خارج الحافة يسقط اللاعب بأقصى سرعة. وتُعاد القيمة إلى عدد سالب صغير بدلًا من 0، لكي يضغط كل Move على الأرض: فعند معدل إطارات مرتفع، قد تكون دفعة الجاذبية في إطار واحد أقصر من Min Move Distance، فلا يفعل Move شيئًا وتصبح isGrounded false. تُقرأ isGrounded قبل Move، لذا فهي تصف Move الإطار السابق.

challenge icon

التحدي

متوسط

يقف الغواص على برجٍ عالٍ، وتحركه مفاتيح الأسهم (وقد كُتب ذلك بالفعل). أضف إليه الجاذبية في Diver.cs. يضبط Inspector قيمة gravity على (-12) وmaxFall على (10)، ويتضمن النص البرمجي الحقل verticalSpeed.

  • في كل إطار، تزداد verticalSpeed بمقدار gravity في الثانية، ويتحرك الغواص إلى الأسفل بهذا المقدار ضمن استدعاء Move نفسه المستخدم للمشي.
  • يُبطئ الهواء السقوط الطويل: لا يسقط الغواص أبدًا بسرعة تتجاوز maxFall وحدة في الثانية.
  • عندما يكون المتحكم على الأرض وتكون قيمة verticalSpeed أقل من 0، اضبط verticalSpeed على -1.

اضغط على تشغيل، وامشِ حتى تسقط عن البرج، ثم اضغط على تحقّق.

جرّب بنفسك

using UnityEngine;

public class Diver : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -12f;
    public float maxFall = 10f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // الجاذبية: أعد ضبط verticalSpeed عند ملامسة الأرض، وأضف الجاذبية، وحدّ من سرعة السقوط، وضع الناتج في move.y

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconاختبر نفسك

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

جميع دروس بناء ألعاب حقيقية