كيفية برمجة لعبة Endless Runner باستخدام Unreal Engine وC++

دقائق القراءة: 7

مقدمة: لماذا تُعد لعبة Endless Runner مشروعاً مثالياً للتعلّم؟

تُعد ألعاب Endless Runner من أكثر الأنماط المناسبة للمبتدئين في تطوير الألعاب، لأنها تجمع بين البساطة من جهة، وتطبيق مفاهيم برمجية مهمة من جهة أخرى. عند تنفيذ هذا النوع من المشاريع باستخدام Unreal Engine وC++، ستتعلم عملياً كيفية بناء شخصية قابلة للتحكم، وإنشاء عوائق، وتوليد مراحل متتابعة، وربط الاصطدامات بمنطق اللعب، ثم إعادة تشغيل المرحلة عند الخسارة.

في هذا المقال، سنعيد تقديم فكرة الدورة التعليمية بشكل عربي احترافي ومنظم، مع شرح أوضح للمراحل التقنية الأساسية، بحيث تحصل على مرجع عملي يساعدك على بناء لعبة Endless Runner من الصفر بأسلوب مناسب للمبتدئين وقابل للتطوير لاحقاً.

معاينة لعبة Endless Runner مطورة باستخدام Unreal Engine وC++

ما الذي ستتعلمه في هذا المشروع؟

  • إعداد مشروع جديد في Unreal Engine باستخدام C++.
  • إنشاء فئة اللاعب Player Class والتحكم بالحركة والقفز.
  • إضافة الكاميرا الجانبية للعبة من نوع Side Scroller.
  • إنشاء العوائق مثل المنصات وSpikes.
  • تصميم أجزاء المراحل وربطها بمنطق التوليد.
  • بناء نظام Spawning لتوليد المراحل بشكل لا نهائي.
  • إضافة جدار متحرك يطارد اللاعب ويُنهي الجولة عند الاصطدام.
  • إعادة تشغيل المرحلة تلقائياً بعد الخسارة.

لقطة متحركة للعبة Endless Runner أثناء الحركة وتفادي العوائق

إعداد مشروع Unreal Engine بطريقة صحيحة

لبداية سليمة، يتم إنشاء مشروع جديد من قسم Games داخل متصفح المشاريع في Unreal Engine 4.25، مع اختيار قالب Third Person بدلاً من Blank. والسبب في ذلك أن هذا القالب يتضمن عناصر جاهزة تفيد في إعداد الشخصية والحركة بسرعة أكبر.

بعد ذلك، يجب تغيير نوع المشروع من Blueprint إلى C++، ثم تسمية المشروع باسم مناسب. كما يُنصح بإنشاء مجلدات منظمة داخل المشروع مثل:

  • Maps لحفظ المراحل.
  • Blueprints للعناصر المرئية والمنطقية.
  • Obstacles للعوائق.
  • Levels لأجزاء المرحلة المتكررة.

هذه الخطوة البسيطة توفر عليك فوضى الملفات لاحقاً، خاصة مع توسع المشروع.

تهيئة المدخلات Input لحركة اللاعب

لأن اللعبة تعتمد على الحركة الجانبية والقفز فقط، فمن الأفضل تبسيط إعدادات Input داخل Project Settings. ستحتاج إلى:

  • Jump مربوطاً بزر Spacebar.
  • Move Right مربوطاً بالمفتاحين A وD.

من الجيد حذف المحاور والإجراءات غير الضرورية مثل Move Forward أو إعدادات الدوران الزائدة، حتى يصبح المشروع أنظف وأسهل في التتبع.

إنشاء فئة اللاعب RunnerCharacter في C++

الخطوة المحورية في المشروع هي إنشاء فئة جديدة ترث من Character، ولتكن باسم RunnerCharacter. هذه الفئة تتولى مسؤوليات أساسية مثل:

  • إعداد الكاميرا الجانبية.
  • تعريف الحركة الأفقية.
  • تنفيذ القفز.
  • التعامل مع الاصطدامات القاتلة.
  • إعادة تشغيل المرحلة عند الموت.

في ملف .h يتم تعريف الخصائص والدوال، بينما يحتوي ملف .cpp على التنفيذ الفعلي. ومن الأفضل استخدام forward declaration لبعض المكوّنات مثل UCameraComponent لتقليل الاعتماديات غير الضرورية.

إعداد متغيرات ودوال اللاعب

من أهم ما تحتاج إليه داخل الفئة:

  • مكوّن كاميرا جانبية SideViewCamera.
  • دالة MoveRight(float Value).
  • دالة RestartLevel().
  • دالة OnOverlapBegin(…) لاكتشاف الاصطدامات.
  • متغيرات للتحكم بحالة الحركة وموقع الكاميرا.

ربط الكاميرا بالشخصية

لأن اللعبة من منظور جانبي، يتم إنشاء كاميرا ثابتة نسبياً خلف اللاعب وعلى ارتفاع مناسب، مع تحديث موقعها في Tick بحيث تتبع اللاعب أفقياً فقط، وتحافظ على ارتفاع محدد لتقديم رؤية واضحة للعوائق القادمة.

هذه الفكرة تجعل تجربة اللعب مريحة، كما تمنحك أساساً ممتازاً إذا رغبت لاحقاً في إضافة مؤثرات بصرية أو اهتزازات كاميرا.

إعداد القفز والحركة

داخل الدالة SetupPlayerInputComponent يتم ربط المدخلات مع دوال اللعب:

  • الضغط على Jump يستدعي Jump().
  • ترك زر القفز يستدعي StopJumping().
  • المحور Move Right يستدعي MoveRight().

بعدها يمكن تفعيل الحركة باستخدام AddMovementInput، مع تخصيص قيم مثل:

  • Gravity Scale
  • Air Control
  • Jump Z Velocity
  • Max Walk Speed

وهذه القيم تؤثر مباشرة على إحساس اللاعب بالتحكم، لذلك من المفيد تجربتها أكثر من مرة للوصول إلى أفضل نتيجة.

إنشاء Blueprint للشخصية وربطه بـ Game Mode

بعد تجهيز فئة اللاعب في C++، تأتي مرحلة إنشاء Blueprint مشتق منها، مثل BP_RunnerCharacter. داخل هذا الـ Blueprint يتم:

  • إضافة Skeletal Mesh المناسب.
  • ضبط موقع الشخصية داخل الكبسولة.
  • تحديد زاوية الدوران الصحيحة.
  • ربط Animation Blueprint المناسب.

ثم يجب إنشاء Game Mode جديد، وتعيين Default Pawn Class إلى شخصية اللاعب الجديدة، حتى يبدأ المستوى باستخدامها بدلاً من الشخصية الافتراضية للمشروع.

إنشاء العوائق: Obstacles وSpikes

لإضفاء التحدي على اللعبة، يتم إنشاء نوعين أساسيين من العوائق:

1) عائق صلب Obstacle

هذا العائق عبارة عن جسم يمنع اللاعب من المرور. يمكن بناؤه عبر فئة Actor عادية، ثم إنشاء Blueprint لها وإضافة Static Mesh مثل Cube.

2) عائق قاتل Spikes

هذا النوع لا يكتفي بعرقلة اللاعب، بل يتسبب في موته عند لمسه. لذلك يُفضّل ضبط إعدادات التصادم الخاصة به على Overlap بدلاً من Block.

إعداد Collision Channels مخصصة

من أفضل الممارسات هنا إنشاء قنوات تصادم مخصصة داخل Project Settings > Collision مثل:

  • Obstacle ويكون سلوكه Block.
  • Spike ويكون سلوكه Overlap.

بهذا الأسلوب، تصبح إدارة التصادم أكثر وضوحاً، كما يسهل عليك لاحقاً توسيع المشروع وإضافة أنواع جديدة من الأجسام التفاعلية.

تصميم أجزاء المراحل القابلة للتوليد

بدلاً من بناء مرحلة طويلة ثابتة، تعتمد اللعبة على أجزاء صغيرة يعاد توليدها باستمرار. ولهذا يتم إنشاء فئة أساسية مثل BaseLevel ترث من Actor.

تحتوي هذه الفئة عادة على:

  • Trigger Box لاكتشاف وصول اللاعب إلى نهاية الجزء الحالي.
  • Spawn Location لتحديد موضع الجزء التالي.

ثم يتم إنشاء Blueprints متعددة مشتقة من هذا المستوى الأساسي، مثل:

  • BP_Level1
  • BP_Level2
  • BP_Level3
  • BP_Level10

كل مستوى فرعي يحتفظ بالبنية العامة نفسها، لكن مع اختلاف توزيع المنصات والعوائق وارتفاعها.

كيف تبني كل Level Segment بكفاءة؟

عادة يتكوّن كل جزء من:

  • أرضية أساسية.
  • منصة أو أكثر بارتفاعات مختلفة.
  • عناصر Spikes في أماكن تحتاج إلى قفز دقيق.
  • صندوق تصادم لإنهاء الجزء الحالي وبدء التالي.
  • نقطة تموضع للجزء اللاحق.

هذه البنية تجعل المشروع قابلاً للتوسع بسهولة، كما تمنحك حرية تصميم عشرات الأجزاء المختلفة دون إعادة كتابة المنطق البرمجي.

برمجة نظام توليد المراحل Spawn Levels

الآن نصل إلى جوهر لعبة Endless Runner: التوليد المستمر للمراحل. لهذا يتم إنشاء فئة مثل SpawnLevel تتولى:

  • الاحتفاظ بمراجع إلى أجزاء المراحل المختلفة.
  • اختيار جزء جديد بشكل عشوائي.
  • تحديد مكان ظهوره اعتماداً على Spawn Location في آخر جزء.
  • إزالة الأجزاء القديمة بعد تجاوز حد معين لتقليل استهلاك الموارد.

المنطق العام للتوليد

  1. عند بدء اللعبة، يتم توليد عدة أجزاء أولية.
  2. كلما دخل اللاعب إلى Trigger Box الخاصة بجزء معين، يتم استدعاء دالة تولّد جزءاً جديداً.
  3. يُختار المستوى عشوائياً من بين مجموعة مستويات مجهزة مسبقاً.
  4. يُضاف الجزء الجديد إلى قائمة المستويات الحالية.
  5. إذا زاد عدد الأجزاء النشطة عن حد معين، تتم إزالة الأقدم.

هذا الأسلوب يخلق وهماً بوجود عالم لا نهائي، بينما المشروع في الحقيقة يعيد تدوير أجزاء قصيرة ومدروسة.

إضافة الجدار المطارد لزيادة التحدي

حتى لا يكتفي اللاعب بالقفز وتجنب العوائق فقط، يتم إضافة جدار متحرك يطارده باستمرار. يمكن تنفيذ ذلك عبر فئة جديدة مثل WallSpike ترث من Spikes، ثم يتم تحريكها في Tick بسرعة ثابتة على المحور المناسب.

من المهم أن يحتوي هذا الجدار على:

  • Static Mesh يمثل شكل الجدار.
  • Box Collision مخصصاً لاكتشاف اصطدام اللاعب.
  • إعدادات Collision مضبوطة على Overlap مع اللاعب.

بهذه الطريقة يصبح اللاعب تحت ضغط دائم، وهو عنصر أساسي في نجاح ألعاب Endless Runner.

التعامل مع الموت وإعادة تشغيل المرحلة

عند اصطدام اللاعب بـ Spikes أو WallSpike، يجب تنفيذ منطق الموت بوضوح وسرعة. عادة يشمل ذلك:

  • إخفاء مجسم الشخصية.
  • إيقاف القدرة على الحركة.
  • تشغيل مؤقت زمني قصير.
  • إعادة فتح المستوى الحالي بعد ثانيتين مثلاً.

هذا يعطي اللاعب تغذية بصرية فورية تدل على الخسارة، ثم يعيده بسرعة إلى التجربة دون إزع.

مثال على عرض الأكواد داخل المقال

في حال رغبتك بعرض أي مقطع برمجي في مقالك على منصة قيد، يجب الحفاظ على تنسيق الأكواد كما هو داخل وسم مناسب، مثل المثال التالي:

void ARunnerCharacter::RestartLevel()
{
    UGameplayStatics::OpenLevel(this, FName(*GetWorld()->GetName()));
}

ومثال آخر لدالة الحركة:

void ARunnerCharacter::MoveRight(float Value)
{
    if (CanMove)
    {
        AddMovementInput(FVector(0.0f, 1.0f, 0.0f), Value);
    }
}

أفضل ممارسات SEO وAdSense لمقال تقني من هذا النوع

إذا كنت تنشر مقالاً تقنياً عن Unreal Engine وC++، فنجاحه لا يعتمد على الترجمة فقط، بل على جودة المعالجة التحريرية. إليك ما يجعل المحتوى أقوى لمحركات البحث وأكثر قبولاً في Google AdSense:

  • شرح الفكرة بأسلوب بشري واضح بعيداً عن النسخ الحرفي.
  • تقسيم المقال إلى محاور قصيرة وعناوين دقيقة.
  • استخدام الكلمات المفتاحية بشكل طبيعي مثل Unreal Engine وC++ وEndless Runner.
  • إضافة قيمة تعليمية حقيقية، لا مجرد تلخيص سطحي.
  • توضيح الفائدة العملية من كل خطوة برمجية.
  • استخدام الصور داخل السياق مع نصوص alt وصفية.

ملخص سريع لمكوّنات اللعبة

المكوّن الوظيفة
RunnerCharacter التحكم باللاعب والحركة والقفز والتصادم
BP_RunnerCharacter التمثيل المرئي للشخصية وربط الأنيميشن
Obstacle عائق صلب يمنع المرور
Spikes عائق قاتل يعتمد على Overlap
BaseLevel القالب الأساسي لأجزاء المرحلة
SpawnLevel توليد الأجزاء الجديدة وإدارة تسلسلها
WallSpike جدار متحرك يطارد اللاعب وينهي الجولة

لماذا هذا المشروع مهم للمبتدئين في Game Development؟

تكمن قوة هذا المشروع في أنه لا يعلّمك ميزة واحدة فقط، بل يربط بين عدة مفاهيم أساسية في تطوير الألعاب:

  • البرمجة الكائنية في C++.
  • التعامل مع Blueprints داخل Unreal Engine.
  • إدارة التصادمات والحركة.
  • التعامل مع الكاميرا.
  • التوليد الإجرائي البسيط للمحتوى.
  • بناء منطق اللعب الكامل من البداية إلى النهاية.

وبمجرد إتقان هذا النموذج، يصبح من الأسهل عليك الانتقال إلى مشاريع أكثر تقدماً مثل ألعاب المنصات، أو ألعاب البقاء، أو حتى الألعاب ثلاثية الأبعاد ذات الأنظمة المعقدة.

الخلاصة التقنية

بناء لعبة Endless Runner باستخدام Unreal Engine وC++ هو تمرين ممتاز لفهم العلاقة بين منطق اللعب والتمثيل البصري وإدارة المراحل. الأهم في هذا المشروع ليس الشكل النهائي فقط، بل الطريقة التي تجمع بها بين Character وCollision وBlueprints وLevel Spawning في هيكل برمجي واضح وقابل للتطوير. إذا أتقنت هذا المشروع، فأنت عملياً قطعت خطوة قوية نحو فهم أعمق لتطوير الألعاب الاحترافي.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *