تطبيق الجاذبية يدويًا
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 39 من 60.
لا يسقط 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 في الإطار السابق.
التحدي
متوسطأضف الجاذبية إلى الغواص لتزداد سرعة سقوطه.
- في بداية
Update()، عندما يكونcontroller.isGroundedوverticalSpeed < 0f، عيّنverticalSpeed = -1f;. - أضف
gravity * Time.deltaTimeإليه، وأبقِه عند-maxFallأو أعلى باستخدامMathf.Max. - قبل سطر
controller.Move، عيّنmove.y = verticalSpeed;.
اضغط على «العب» وامشِ بعيدًا عن البرج: ستزداد سرعة السقوط حتى تصل إلى 10 وحدات في الثانية. ثم اضغط على «تحقق».
جرّب بنفسك
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);
}
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك8متحكّم الشخصية
CharacterController.Moveتطبيق الجاذبية يدويًاالقفزدفع الأشياءالتحرّك في اتجاه النظرمراجعة: القفزة المزدوجة6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity