المسار
جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 49 من 60.
يبني هذا الفصل لعبة منصات ثلاثية الأبعاد. تركض وتقفز عبر منصات عائمة، وتركب منصة تنزلق، وتلمس نقاط حفظ كي لا تعيدك السقطة إلى البداية، وتجمع الجواهر التي يُعرض عددها على الشاشة، وتعبر خط النهاية إلى المستوى التالي وتحاول تحطيم أفضل وقت حققته. تتكوّن اللعبة من خمسة نصوص برمجية موجودة في المشروع منذ البداية: Player وMovingPlatform وCheckpoint وGem وFinishLine. النصوص الأربعة الأخيرة فارغة حاليًا، ويُكمل كل درس واحدًا منها. اللاعب هو CharacterController تتحكم به إجراءات Input System، والكاميرا هي عنصر تابع له، لذا تتبعه دون الحاجة إلى نص برمجي.
يتحرك CharacterController بطريقتين. تحركه Move(motion) مسافةً من دون إضافة أي شيء، لذا فإن الجاذبية والقفزات وTime.deltaTime من مسؤولية النص البرمجي، كما في فصل Character Controller. تأخذ SimpleMove(speed) سرعةً بوحدات في الثانية، وتضربها في زمن الإطار بنفسها وتضيف الجاذبية؛ وتتجاهل قيمة y التي تمررها إليها، لذا تسقط الشخصية التي تتحرك بها عن الحواف، لكنها لا تستطيع القفز أبدًا. هذا الكلب الراعي في لعبة رعي تُرى من الأعلى لا يحتاج إلى القفز، لذا تشكّل SimpleMove وإجراء Move نصه البرمجي كاملًا:
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}على لاعب لعبة المنصات أن يقفز، لذا يحتفظ بسرعته الرأسية الخاصة ويتحرك باستخدام Move، ويقرأ إجراءي Move وJump بدلًا من الصنف Input. توصي Unity باستدعاء Move أو SimpleMove مرة واحدة في كل إطار: تُضمّن حركة المشي والسقوط في الاستدعاء نفسه، وعندها تصف isGrounded الحركة بأكملها.
التحدي
متوسطاجعل اللاعب يمشي ويقفز ويسقط.
- في
Start()، اعثر علىMoveوJumpباستخدامInputSystem.actions.FindAction. - في
Update()، اجعل اللاعب يمشي بسرعةspeed: حرّك x في Move على محور x، وy على محور z. - أضف
gravity * Time.deltaTimeإلىvelocity.y، واجعلها-2fعندما يكون اللاعب على الأرض ويسقط. عند القفز وهو على الأرض، اضبطها علىMathf.Sqrt(jumpHeight * -2f * gravity). - استدعِ
controller.Move((move + velocity) * Time.deltaTime)مرة واحدة.
اضغط على «العب»: اقفز إلى المنصة الأولى. ثم اضغط على «تحقق».
جرّب بنفسك
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// تحرّك باستخدام إجراء Move، واقفز باستخدام إجراء Jump، واسقط بفعل الجاذبية
}
}
جميع دروس إنشاء ألعاب حقيقية
4المشاهد والمستويات
تحميل مشهدإعادة تشغيل المستوىالمستوى التاليالاحتفاظ بالبيانات بين المشاهدمراجعة: اختيار المستوى10مشروع: لعبة منصات ثلاثية الأبعاد
المسارمنصات متحركة2الأزرار والشاشات
الأزرار وonClickالتعبيرات Lambdaالربط في Inspectorتشغيل اللوحات وإيقافهاأشرطة الصحةمراجعة: متجر الترقيات5الحفظ باستخدام PlayerPrefs
حفظ رقمالتحميل بقيمة افتراضيةأعلى نتيجةحفظ الإعداداتمراجعة: العملات في البنك6مشروع: عدّاء لا نهاية له
ثلاثة مساراتعقبات أمامكتدرّب بنفسك: Playground لـ Unity