القفز
جزء من قسم بناء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 39 من 56.
القفزة هي سرعة رأسية تُحدَّد مرة واحدة عند لحظة الضغط على Space؛ وتؤدي الجاذبية التي يضيفها البرنامج النصي بالفعل إلى إبطاء الصعود، وإيقافه عند القمة، ثم إعادة المتحكّم إلى الأسفل. ما يتبقى هو سرعة البداية لارتفاع معيّن. تسحب الجاذبية السرعة بمعدل ثابت، لذا فإن القفزة التي تبدأ بسرعة v ترتفع بمقدار v * v / (2 * g) وحدة قبل أن تتوقف. وبإعادة ترتيب المعادلة، تكون سرعة البداية لارتفاع h هي v = √(2 * g * h).
عندما تكون قيمة gravity المخزنة عددًا سالبًا، -20، ويكون ارتفاع القفزة 2.5 وحدة، فإن ذلك يساوي Mathf.Sqrt(2.5f * -2f * -20f)، أي الجذر التربيعي لـ 100: 10 وحدات في الثانية. يحوّل -2f الجاذبية السالبة إلى قيمة موجبة، لأن الجذر التربيعي لعدد سالب هو NaN:
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;يختبر التصفير الشرط verticalSpeed < 0f، لذا فهو ينهي السقوط فقط: إن استخدام if (controller.isGrounded) وحده للتصفير بعد سطر القفز سيستبدل سرعة القفز في إطار القفز. ويمنع اختبار controller.isGrounded في القفز تنفيذ قفزات في الهواء. غيّر jumpHeight أو gravity في Inspector وستظل القفزة تصل إلى jumpHeight تمامًا، بينما تؤدي سرعة ثابتة مثل verticalSpeed = 8f إلى ارتفاع مختلف مع كل قيمة للجاذبية.
التحدي
متوسطيقفز كلا القافزين باستخدام Jumper.cs نفسه: الطفل، الذي يضبط Inspector لديه gravity على -18 وjumpHeight على 1، والكنغر، مع gravity بقيمة -8 وjumpHeight بقيمة 4. يؤدي الضغط على Space إلى ضبط verticalSpeed على 9، وهو رقم عُثر عليه بالتجربة والخطأ: فهو لا يناسب أيًا من القافزين، كما أنه يعمل في الهواء أيضًا. أصلح القفزة:
- يبدأ الضغط على Space قفزةً ترتفع بمقدار
jumpHeightبالضبط، ويُحسب ذلك منjumpHeightوgravityالخاصتين بكل قافز. - لا يمكن القفز إلا إذا كان القافز على الأرض.
اضغط على Play واقفز، ثم اضغط على Check.
جرّب بنفسك
using UnityEngine;
public class Jumper : MonoBehaviour
{
public float speed = 5f;
public float gravity = -18f;
public float jumpHeight = 1f;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump"))
{
verticalSpeed = 9f;
}
verticalSpeed += gravity * Time.deltaTime;
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك