تطبيق الجاذبية يدويًا
جزء من قسم بناء ألعاب حقيقية في رحلة 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 الإطار السابق.
التحدي
متوسطيقف الغواص على برجٍ عالٍ، وتحركه مفاتيح الأسهم (وقد كُتب ذلك بالفعل). أضف إليه الجاذبية في 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);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس بناء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارالمنصات المتحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك8متحكّم الشخصية
CharacterController.Moveتطبيق الجاذبية يدويًاالقفزدفع الأشياءالتحرّك في اتجاه النظرمراجعة: القفزة المزدوجة6مشروع: عدّاء بلا نهاية
ثلاثة مساراتعوائق أمامك