القفز
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 40 من 60.
القفزة هي سرعة رأسية تُحدَّد مرة واحدة، عند لحظة الضغط على مفتاح المسافة؛ فالجاذبية التي يضيفها البرنامج النصي مسبقًا تُبطئ الصعود بعد ذلك، وتوقفه عند القمة، ثم تعيد وحدة التحكم إلى الأسفل. ما يتبقى هو سرعة البداية اللازمة لارتفاع معين. تسحب الجاذبية السرعة بمعدل ثابت، لذا ترتفع القفزة التي تبدأ بسرعة 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 إلى ارتفاع مختلف مع كل قيمة للجاذبية.
التحدي
متوسطاجعل سكربت قفز واحدًا يناسب الطفل والكنغر كليهما.
- في
Update()، استبدل9fبـMathf.Sqrt(jumpHeight * -2f * gravity)، وهي سرعة البداية التي تجعله يرتفع بمقدارjumpHeightتمامًا. - أضف
&& controller.isGroundedإلى تعليمةifالخاصة بالقفز، حتى لا يحدث قفز في الهواء.
اضغط «العب» ثم مفتاح المسافة: يرتفع الطفل وحدة واحدة، ويرتفع الكنغر 4 وحدات. ثم اضغط «تحقق».
جرّب بنفسك
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مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity