كيفية إنشاء لعبة بسيطة باستخدام Unreal Engine 4

في هذا البرنامج التعليمي، ستقوم بإنشاء لعبة من منظور شخص واحد تستمر إلى ما لا نهاية، وسوف تتعلم كيفية إنشاء عقبات عشوائية وإعادة تشغيل اللعبة.

وإذا كنت تبدأ في تطوير اللعبة، فإن إحدى النصائح الشائعة هي إنشاء لعبة أساسية، وذلك لأن هذا الأمر سوف يعلمك كيفية إنشاء بعض الآليات والتصاميم البسيطة وكيفية تفاعل الكائنات مع بعضها البعض.

وسوف تتعلم كيفية:

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

وفي النهاية، سيكون لديك لعبة تبدو كالتالي:

لعبة بسيطة باستخدام Unreal Engine 4

يرجى ملاحظة أنك ستستخدم المخططات (Blueprints) والرسوم المتحركة الافتراضية (UMG) في هذا البرنامج التعليمي، وإذا كنت بحاجة إلى تجديد معلوماتك، فراجع البرنامج التعليمي للمخططات (Blueprints) وواجهة المستخدم (UI).

محتوى المقالة
  1. البداية
  2. تحريك اللاعب إلى الأمام (Moving the Player Forward)
    1. التحرك على محور واحد (Moving Along a Single Axis)
  3. إنشاء مولّد النفق (Creating the Tunnel Spawner)
    1. اختبار مولد النفق (Testing the Tunnel Spawner)
  4. إعداد مخطط النفق (Setting up the Tunnel Blueprint)
    1. إنشاء منطقة الإطلاق (Creating the Trigger Zone)
    2. إنشاء نقطة التوليد (Creating the Spawn Point)
  5. توليد الأنفاق عند نقطة التوليد (Spawning Tunnels at the Spawn Point)
    1. إنشاء مرجع لمولد النفق (Creating a Reference to the Tunnel Spawner)
    2. برمجة منطقة التوليد (Scripting the Trigger Zone)
  6. توليد المزيد من الأنفاق (Spawning More Tunnels)
    1. توليد النفق الأول (Spawning the First Tunnel)
    2. توليد الأنفاق اللاحقة (Spawning Subsequent Tunnels)
  7. إنشاء العقبات (Creating Obstacles)
  8. إنشاء أشكال مختلفة للجدار (Creating Wall Variations)
    1. الجدران العشوائية (Randomizing ​the Wall)
  9. التعامل مع الاصطدام بالجدران (Handling Wall Collisions)
    1. ضبط المتغير المنطقي (Setting the IsDead Variable)
  10. عرض زر إعادة التشغيل (Displaying a Restart Button)
    1. إنشاء تابع العرض (Creating the Display Function)
    2. استدعاء تابع العرض (Calling the Display Function)
  11. إعادة تشغيل اللعبة (Restarting the Game)
    1. إعادة ضبط اللاعب (Resetting the Player)
    2. إعادة توليد الأنفاق (Respawning the Tunnels)
    3. معالجة نقرات الزر (Handling Button Clicks)

البداية

قم بتنزيل مشروع البداية وفك ضغطه، وانتقل إلى مجلد المشروع وافتح InfiniteMatrix.uproject.

ملاحظة: إذا تلقيت رسالة تفيد بأن المشروع قد تم إنشاؤه باستخدام إصدار سابق من محرر أنريل (Unreal editor)، فلا بأس بذلك (يتم تحديث المحرك بشكل متكرر)، يمكنك إما اختيار خيار فتح نسخة (open a copy)، أو خيار التحويل في المكان (convert in place).

اضغط على زر التشغيل (Play) لاختبار عناصر التحكم في الحركة، ويمكنك التحرك عمودياً وأفقياً عن طريق تحريك الماوس.

صورة بداية تصميم اللعبة

أول شيء ستفعله هو جعل اللاعب يتحرك للأمام بشكل مستمر.

تحريك اللاعب إلى الأمام (Moving the Player Forward)

انتقل إلى مجلد المخططات (Blueprints) وافتح (BP_Player).

لتحريك اللاعب إلى الأمام، ستضيف إزاحة إلى موقع اللاعب في كل إطار.

أولاً، تحتاج إلى إنشاء متغير لتحديد سرعة حركة اللاعب إلى الأمام، قم بإنشاء متغير (Float) يسمى (ForwardSpeed) وقم بتعيين قيمته الافتراضية على 2000.

بيانات تحريك اللاعب للأمام

بعد ذلك، تأكد من أنك في مخطط الأحداث (Event Graph) ثم حدد موقع عقدة علامة الحدث (Event Tick)، وقم بإنشاء الإعداد التالي:

عقدة علامة الحدث

بضرب سرعة الحركة للأمام (Forward Speed) مع (Delta Seconds)، تحصل على نتيجة مستقلة لمعدل الإطارات.

ملاحظة: إذا لم يكن لديك معلومات كافية عن استقلالية معدل الإطارات، فالرجاء قراءة برنامج المخططات (Blueprints) التعليمي، ونحن نغطيها في قسم استقلال معدل الإطارات.

بعد ذلك، ستستخدم هذه النتيجة لتحريك اللاعب على طول محور واحد.

التحرك على محور واحد (Moving Along a Single Axis)

لتحريك اللاعب، قم بإنشاء عقدة إضافة إزاحة اللاعب (AddActorWorldOffset)، قم بتفعيل إمكانية المسح (Sweep) بالنقر بزر الماوس الأيسر فوق مربع الاختيار الخاص به.

إضافة إزاحة لموقع اللاعب

إذا حاولت توصيل نتيجة (Float) بإدخال (Delta Location)، فسيقوم أنريل (Unreal) تلقائياً بتحويلها إلى شعاع (Vector).

التحويل إلى شعاع

على أية حال، سيؤدي ذلك إلى وضع قيمة (Float) في مكونات X و Y و Z للشعاع، وبالنسبة لهذه اللعبة، يجب أن تكون الحركة الأمامية على طول المحور X فقط، ولحسن الحظ، يمكنك تقسيم الشعاع إلى ثلاثة مكونات من النوع (Float).

تأكد من أن دبوس موقع دلتا لعقدة (AddActorWorldOffset) لا يحتوي على اتصالات، وانقر بزر الماوس الأيمن فوق (Delta Location pin) وحدد (Split Struct Pin).

إضافة إزاحة

أخيراً، قم بتوصيل كل شيء على هذا النحو:

توصيل العقد

الملخص:

  1. في كل إطار، ستضاعف اللعبة سرعة الحركة للأمام (Forward Speed) و (Delta Seconds) للحصول على نتيجة مستقلة لمعدل الإطارات.
  2. ستستخدم العقدة AddActorWorldOffset النتيجة لتحريك اللاعب على طول المحور X.
  3. نظراً لأنه تم تمكين المسح (Sweep)، سيتوقف اللاعب عن الحركة في حال اصطدامه بأي شيء.

انقر فوق (Compile) ثم ارجع إلى المحرر الرئيسي، وإذا ضغطت على تشغيل (Play)، فسوف تتحرك عبر النفق.

التحرك عبر النفق

وبدلاً من إنشاء الأنفاق بشكل يدوي، يمكنك إنشاء مخطط (Blueprint) يقوم بتلك المهمة بشكل تلقائي.

إنشاء مولّد النفق (Creating the Tunnel Spawner)

انتقل إلى مستعرض المحتوى (Content Browser) وتأكد من أنك في مجلد المخططات (Blueprints)، أنشئ فئة مخطط (Blueprint) جديدة مع اللاعب كفئة الأصل، وقم بتسميتها (BP_TunnelSpawner) ثم افتحه.

ونظراً لأن اللعبة ستقوم بتوليد الأنفاق باستمرار، فمن الجيد إنشاء تابع الاستنساخ (spawning function)، ومن أجل ذلك انتقل إلى لوحة (My Blueprint) وأنشئ تابع جديد يسمى (SpawnTunnel)، وسيكون الغرض من هذا التابع هو إنتاج نفق في الموقع المحدد.

ولتمرير الموقع إلى التابع، يحتاج التابع إلى معامل إدخال، وسيظهر هذا كدبابيس إدخال عند استدعاء التابع.

تابع 1

وسيظهر أيضاً كدبابيس إخراج في عقدة الإدخال (Entry node) للتابع.

عقدة الإدخال

ومن أجل إنشاء معامل الإدخال، تأكد من أنك في الرسم البياني لتابع (SpawnTunnel)، وحدد عقدة الإدخال (Entry node) ثم انتقل إلى لوحة التفاصيل (Details panel)، وانقر فوق علامة (+) بجوار قسم المدخلات.

إنشاء معامل الإدخال

إعادة تسمية معامل الإدخال إلى (SpawnLocation) وتغيير نوعه إلى شعاع (Vector).

إعادة تسمية معامل الإدخال وتغيير نوعه

لإنشاء نفق، أضف عقدة عامل إنتاج من الفئة (Spawn Actor From Class)، وانقر فوق القائمة المنسدلة الموجودة على يمين دبوس الفئة وحدد (BP_Tunnel).

عقدة عامل إنتاج

لتعيين موقع التوليد، انقر بزر الماوس الأيمن فوق دبوس تحويل النشر (Spawn Transform pin) وحدد تقسيم الهيكل (Split Struct)، وبعد ذلك، قم بربط عقدة (Spawn Actor From Class) بعقدة الإدخال (Entry node) كما يلي:

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

الآن، عندما تستدعي تابع (SpawnTunnel)، فإنه سينتج مثيلاً من (BP_Tunnel) في الموقع المتوفر.

اختبار مولد النفق (Testing the Tunnel Spawner)

قم بالتبديل إلى مخطط الأحداث (Event Graph) وحدد موقع عقدة (Event BeginPlay)، وأضف عقدة (SpawnTunnel) وقم بتوصيلها بعقدة (Event BeginPlay).

في عقدة (SpawnTunnel)، اضبط موقع التوليد (Spawn Location) على (2000 ، 0 ، 500).

اختبار مولد النفق

والآن، عندما تبدأ اللعبة، سوف تقوم بتوليد نفق بعيد عن اللاعب، انقر فوق (Compile) ثم ارجع إلى المحرر الرئيسي.

أولاً، احذف (BP_Tunnel) من المستوى، وقم بذلك عن طريق النقر بزر الماوس الأيسر على (BP_Tunnel) في (World Outliner)، وبعد ذلك، اضغط على مفتاح (Delete) لإزالته من المستوى.

بعد ذلك، انتقل إلى متصفح المحتوى (Content Browser)، وانقر بزر الماوس الأيسر واسحب (BP_TunnelSpawner) إلى منفذ العرض (Viewport)، وسيضيف هذا مثيلاً منه إلى المستوى.

إذا ضغطت على تشغيل (Play)، ستقوم اللعبة بتوليد نفق فوق اللاعب وبعيداً عنه.

الحالة الأولية للنفق

بمجرد الانتهاء من الاختبار، ارجع إلى (BP_TunnelSpawner)، وأعد تعيين موقع التوليد لعقدة (SpawnTunnel) إلى (0 ، 0 ، 0).

بعد ذلك، انقر فوق (Compile) ثم ارجع إلى المحرر الرئيسي.

في القسم التالي، ستقوم بإعداد وظيفة (BP_Tunnel).

إعداد مخطط النفق (Setting up the Tunnel Blueprint)

سيكون (BP_Tunnel) مسؤول عن شيئين:

أولاً، اكتشاف الوقت الذي يجب أن تولد فيه اللعبة نفق جديد، وللقيام بذلك، سوف تقوم بإنشاء منطقة تشغيل، وبمجرد التشغيل، سيخبر (BP_Tunnel BP_TunnelSpawner) بإنشاء نفق جديد، من خلال القيام بذلك، يمكنك إنشاء وهمي نفق لا نهاية له.

إعداد مخطط النفق

الشيء الثاني الذي ستفعله هو تحديد نقطة بداية توليد النفق، ثم يستخدم (BP_TunnelSpawner) هذه النقطة كموقع التوليد التالي.

لنبدأ بإنشاء منطقة الإطلاق.

إنشاء منطقة الإطلاق (Creating the Trigger Zone)

افتح (BP_Tunnel) ثم انتقل إلى لوحة المكونات (Components panel)، وأضف مكون صندوق التصادم (Box Collision) وقم بتسميته (TriggerZone).

منطقة الاصطدام صغيرة جداً في الوقت الحالي، انتقل إلى لوحة التفاصيل (Details panel) وحدد موقع قسم الشكل (Shape section)، وقم بضبط خاصية مدى الصندوق (Box Extent) على (32 ، 500 ، 500).

تحديد منطقة البداية

بعد ذلك، قم بضبط خاصية الموقع على (2532، 0، 0)، وسيؤدي هذا إلى وضع (TriggerZone) في نهاية شبكة النفق مباشرةً، وهذا يعني أن النفق الجديد يجب أن يظهر فقط عندما يصل اللاعب إلى نهاية النفق.

ضبط خاصية الموقع

حان الوقت الآن لإنشاء نقطة التوليد.

إنشاء نقطة التوليد (Creating the Spawn Point)

لتحديد موقع نقطة التوليد، يمكنك استخدام مكون (Scene)، هذه المكونات مثالية لتحديد المواقع لأنها تحتوي فقط على تحويل (Transform)، كما أنها مرئية في منفذ العرض (Viewport) حتى تتمكن من معرفة مكان نقطة التوليد الخاصة بك.

انتقل إلى لوحة المكونات (Components panel) وتأكد من عدم تحديد أي شيء، وأضف مكون (Scene) وأعد تسميته إلى (SpawnPoint).

لوحة المكونات

يبلغ طول شبكة النفق 2500 وحدة على المحور X، حيث يجب أن تكون نقطة التوليد، انتقل إلى لوحة التفاصيل (Details panel) وقم بضبط خاصية الموقع على (2500 ، 0 ، 0).

ضبط نقطة التوليد

الشيء التالي الذي يجب فعله هو إنشاء تابع يولد نفق في نقطة التوليد (SpawnPoint).

توليد الأنفاق عند نقطة التوليد (Spawning Tunnels at the Spawn Point)

انقر فوق (Compile) ثم قم بالتبديل إلى (BP_TunnelSpawner).

يجب أن يظهر نفق (BP_Tunnel) التالي عند نقطة التوليد في النفق الأبعد، ومن خلال القيام بذلك، سيستمر النفق دائماً.

توليد الأنفاق عند نقطة التوليد

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

افتح الرسم البياني لتابع توليد النفق (SpawnTunnel)، وانقر بزر الماوس الأيمن فوق دبوس قيمة الإرجاع لعقدة (Spawn Actor From Class)، وحدد ترقية إلى متغير (Promote to Variable) وأعد تسمية المتغير إلى (NewestTunnel).

تحديد مرجع نقطة التوليد

الآن، سيكون لديك دائماً مرجع النفق الأبعد.

بعد ذلك، قم بإنشاء تابع جديد وقم بتسميته (SpawnTunnelAtSpawnPoint)، وقم بإنشاء الرسم البياني التالي:

مخطط بياني - تابع توليد الأنفاق

سيحصل هذا الإعداد على أحدث نفق وموقع مكون (SpawnPoint) الخاص به، ثم سيولد نفق جديد في هذا الموقع.

ولكي يتواصل (BP_Tunnel) مع (BP_TunnelSpawner)، فإنه يحتاج إلى مرجع، فبدون اتصال، لن يعرف (BP_TunnelSpawner) متى يتم توليد النفق التالي.

إنشاء مرجع لمولد النفق (Creating a Reference to the Tunnel Spawner)

انقر فوق (Compile) ثم أغلق الرسم البياني (SpawnTunnelAtSpawnPoint)، وبعد ذلك، قم بالتبديل إلى (BP_Tunnel).

أضف متغير جديد وقم بتسميته (TunnelSpawner)، وقم بضبط نوع المتغير الخاص به على (BP_TunnelSpawner\Object Reference).

إنشاء مرجع لمولد النفق

انقر فوق (Compile) ثم عد إلى (BP_TunnelSpawner).

افتح الرسم البياني لتابع مولد النفق (SpawnTunnel) وأضف العقد المشار إليها:

إضافة عقد

الآن، سيكون لكل نفق مرجع في (BP_TunnelSpawner).

بعد ذلك، ستخبر (BP_TunnelSpawner) ببناء النفق التالي عندما يدخل اللاعب منطقة التوليد (TriggerZone).

برمجة منطقة التوليد (Scripting the Trigger Zone)

انقر فوق (Compile) ثم قم بالتبديل إلى (BP_Tunnel).

انتقل إلى لوحة المكونات (Components panel) وانقر بزر الماوس الأيمن على (TriggerZone)، وحدد (Add Event\Add OnComponentBeginOverlap)، وسيؤدي هذا إلى إضافة العقدة التالية إلى الرسم البياني للأحداث:

برمجة منطقة التوليد

سيتم تنفيذ هذه العقدة عندما يتداخل اللاعب مع منطقة التوليد (TriggerZone).

أولاً، يجب عليك التحقق مما إذا كان الممثل الذي يتداخل مع منطقة التوليد (TriggerZone) هو اللاعب.

انقر بزر الماوس الأيسر واسحب دبوس الممثل الآخر، وحرر زر الماوس الأيسر فوق منطقة فارغة وحدد (Cast to BP_Player) من القائمة.

تداخل اللاعب مع منطقة التوليد

ملاحظة: نظراً لأن النفق يتم توليده في نهاية نفق آخر، فإنه سيؤدي إلى تشغيل منطقة التوليد (TriggerZone) لهذا النفق، وسيعمل (Cast to BP_Player) على منع أي عقد أخرى من التنفيذ إذا كان الممثل الآخر نفقاً.

بعد ذلك، أضف العقد المشار إليها بعد (Cast to BP_Player node):

إضافة عقد2

لنستعرض هذا خطوة بخطوة:

  1. عندما يتداخل اللاعب مع منطقة التوليد (TriggerZone)، سيتم تنفيذ عقدة (On Component Overlap TriggerZone).
  2. تتحقق عقدة (Cast to BP_Player) مما إذا كان الممثل المتداخل هو اللاعب.
  3. إذا كان هو اللاعب، فسيقوم (BP_TunnelSpawner) بإنشاء نفق جديد، وسيكون موقعه في مكون (SpawnPoint) من النفق الأخير الذي تم إنتاجه.
  4. نظراً لعدم وجود استخدام للنفق القديم، تقوم اللعبة بإزالته باستخدام عقدة (DestroyActor).

انقر فوق (Compile)، وارجع إلى المحرر الرئيسي ثم اضغط على تشغيل (Play)، وبمجرد وصولك إلى نهاية النفق، ستقوم اللعبة بتوليد نفق جديد.

الشكل الجديد للنفق

على الرغم من أن اللعبة تقوم بتوليد الأنفاق إلى ما لا نهاية، إلا أنها لا تبدو بلا نهاية، ويمكنك التخفيف من ذلك من خلال وجود عدد قليل من الأنفاق مرئية دائماً، وفي وقت لاحق، عندما تجمع بين هذا والعقبات، لن يتمكن اللاعب من رؤية الأنفاق وهي تتكاثر.

توليد المزيد من الأنفاق (Spawning More Tunnels)

أول شيء يجب فعله هو إنشاء تابع يولد عدد معين من الأنفاق.

افتح (BP_TunnelSpawner) وأنشئ تابع جديد يُسمى (SpawnInitialTunnels).

ولإنشاء عدد محدد من الأنفاق، يمكنك استخدام عقدة (For Loop)، وستُنفذ هذه العقدة العقد المتصلة عدداً محدداً من المرات، أضف عقدة (For Loop) وقم بتوصيلها بعقدة (Entry).

توليد المزيد من الأنفاق

ولجعل عقدة (For Loop) تُنَفذ عدد n من المرات، تحتاج إلى ضبط الفهرس الأخير (Last Index) على n – 1.

وفي هذا البرنامج التعليمي، سوف تولد ثلاثة أنفاق، ولإجراء ثلاث حلقات، اضبط قيمة الفهرس الأخير (Last Index) على 2.

عقدة (For Loop)

ملاحظة: إذا لم تقم بتعيين حقلي الفهرس الأول (First Index) أو الفهرس الأخير (Last Index)، فسيتم تعيينهما افتراضياً على 0.

عندما تبدأ اللعبة، يجب أن يبدأ اللاعب دائماً في نفق، وللقيام بذلك، يمكنك إنشاء النفق الأول في موقع اللاعب.

توليد النفق الأول (Spawning the First Tunnel)

لتحديد ما إذا كان النفق الأول قد ظهر أم لا، يمكنك التحقق مما إذا تم تعيين (NewestTunnel)، وإذا لم يتم ضبطه، فهذا يعني أن النفق الأول لم يتم توليده، هذا لأن (NewestTunnel) يتم ضبطه فقط بعد أن تقوم اللعبة بتوليد نفق.

ولإجراء هذا الاختبار، أضف عقدة (IsValid) (تلك التي تحتوي على أيقونة علامة استفهام) بعد عقدة (ForLoop).

بعد ذلك، احصل على مرجع إلى (NewestTunnel) وقم بتوصيله بدبوس كائن الإدخال (Input Object) في العقدة (IsValid).

توليد النفق الأول

وإذا لم يتم تعيين (NewestTunnel)، فسيتم تنفيذ الدبوس (Is Not Valid) والعكس صحيح.

أضف ما يلي وقم بتوصيله بالدبوس (Is Not Valid) في العقدة (IsValid):

توليد النفق الأول 2

سينتج هذا الإعداد نفق في الموقع الموجود فيه اللاعب.

بعد ذلك، سوف يتم توليد الأنفاق اللاحقة.

توليد الأنفاق اللاحقة (Spawning Subsequent Tunnels)

أضف عقدة (SpawnTunnelAtSpawnPoint) وقم بتوصيلها بالدبوس (Is Valid) للعقدة (IsValid).

توليد الأنفاق اللاحقة

هذا هو الرسم البياني النهائي:

الرسم البياني النهائي

ملخص:

  1. ستنفذ عقدة (ForLoop) ما مجموعه ثلاث مرات.
  2. في الحلقة الأولى، سوف تولد نفقاً في موقع اللاعب.
  3. خلال الحلقات اللاحقة، سوف تولد نفقاً عند نقطة التوليد (Spawn Point) لأحدث نفق.

بعد ذلك، انتقل إلى مخطط الأحداث (Event Graph) واحذف عقدة (SpawnTunnel)، وبعد ذلك، أضف عقدة (SpawnInitialTunnels) بعد (Event BeginPlay).

عقد

الآن، عندما تبدأ اللعبة، ستنتج ثلاثة أنفاق.

انقر فوق (Compile)، وارجع إلى المحرر الرئيسي ثم اضغط على تشغيل (Play)، النفق الآن أطول بكثير.

ثلاثة أنفاق في اللعبة

اللعبة ليست صعبة في الوقت الحالي، لذلك دعونا نضيف بعض العقبات.

إنشاء العقبات (Creating Obstacles)

فيما يلي الشبكات التي ستستخدمها كعقبات:

أشكال العقبات

افتح (BP_Tunnel) وانتقل إلى لوحة المكونات (Components panel)، وأضف مكون الشبكة الثابتة (Static Mesh)، وقم بتسميته WallMesh.

وانتقل إلى لوحة التفاصيل (Details panel)، وقم بتغيير خاصية (Static Mesh) الخاصة بها إلى SM_Hole_01.

بعد ذلك، قم بضبط خاصية الموقع الخاصة بها إلى (2470 ، 0 ، 0)، وهذا سيضعه في نهاية النفق.

تحديد موضع العقبة

لجعل اللعبة أكثر إثارة، ستدور الجدران أيضاً، أضف متغير (Float) جديداً وقم بتسميته سرعة الدوران (RotateSpeed) واضبط القيمة الافتراضية على 30.

قم بالتبديل إلى مخطط الأحداث (Event Graph) وحدد موقع عقدة علامة الحدث (Event Tick)، وقم بإنشاء الإعداد التالي:

تابع لتدوير الجدار

سيؤدي ذلك إلى جعل شبكة الجدار (WallMesh) تقوم بتدوير كل إطار بالكمية المقدمة.

انقر فوق (Compile) ثم ارجع إلى المحرر الرئيسي، واضغط تشغيل (Play) لرؤية دوران الجدران.

دوران الجدار

دعونا نضيف بعض الاختلافات إلى الجدران.

إنشاء أشكال مختلفة للجدار (Creating Wall Variations)

بدلاً من إنشاء مخطط جديد لكل شكل، يمكنك فقط اختيار (WallMesh) عشوائي.

افتح (BP_Tunnel) وأنشئ تابع جديد يُسمى (RandomizeWall)، وبعد ذلك، قم بإنشاء الرسم البياني التالي:

عقد عشوائية

ستقوم عقدة (Set Static Mesh) بتعيين (WallMesh) على الشبكة المتوفرة.

ولإنشاء قائمة بالشبكات الثابتة، يمكنك استخدام عقدة التحديد (Select node).

انقر بزر الماوس الأيسر واسحب دبوس (New Mesh)، وحرر زر الماوس الأيسر فوق منطقة فارغة ثم قم بإضافة عقدة التحديد (Select node).

عقدة التحديد

تسمح لك عقدة التحديد (Select node) بتعيين قائمة بالخيارات، يُحدد فهرس المدخل (Index input) ما هو الخيار الذي يخرجه تحديد مخرجات العقدة.

ونظراً لوجود أربع شبكات حائط (wall meshes) متوفرة، فأنت بحاجة إلى إنشاء دبابيس خيار (Option) إضافية.

ويمكنك القيام بذلك عن طريق النقر بزر الماوس الأيمن فوق عقدة التحديد (Select node) وتحديد (Add Option Pin)، افعل ذلك حتى تحصل على أربعة دبابيس (Option).

ضبط عقدة التحديد

بعد ذلك، اضبط كل خيار على ما يلي:

  • الخيار 0: SM_Hole_01
  • الخيار 1: SM_Hole_02
  • الخيار 2: SM_Hole_03
  • الخيار 3: SM_Hole_04
متغيرات عشوائية لعقدة التحديد

الآن، دعنا نحدد خياراً عشوائياً.

الجدران العشوائية (Randomizing ​the Wall)

يمكنك استخدام عدد صحيح عشوائي في عقدة النطاق (Range node) للحصول على رقم عشوائي، وستعيد هذه العقدة قيمة > = Min و <= Max.

أضف عدد صحيح عشوائي في عقدة النطاق (Range node) وقم بتوصيله بدبوس الفهرس (Index) في عقدة التحديد (Select node).

الجدران العشوائية

اضبط القيمة القصوى على 3، وسيعطيك هذا أربعة أرقام محتملة: 0 و 1 و 2 و 3.

ضبط القيمة القصوى

لإنشاء المزيد من التوزيع العشوائي، دعنا نضيف دوران عشوائي إلى (WallMesh)، أضف ما يلي بعد عقدة (Set Static Mesh):

عقدة الدوران العشوائي

سيؤدي هذا إلى إضافة دوران عشوائي بين 0 و 360 درجة إلى (WallMesh).

وهذا هو الرسم البياني النهائي:

الرسم البياني بعد إضافة العشوائية

ملخص:

  1. توفر عقدة التحديد (Select node) قائمة بالشبكات.
  2. يتم اختيار شبكة عشوائية باستخدام عدد صحيح عشوائي في عقدة التحديد (Select node).
  3. تقوم عقدة (Set Static Mesh) بتعيين (WallMesh) للشبكة المختارة.
  4. تضيف عقدة (AddLocalRotation) إزاحة دوران عشوائية إلى (WallMesh).

انقر فوق (Compile) ثم أغلق الرسم البياني (RandomizeWall).

قم بالتبديل إلى (BP_TunnelSpawner) وافتح الرسم البياني (SpawnTunnel), وأضف العقدة المميزة (highlighted node):

العقدة المميزة

الآن، كلما ظهر نفق، سيكون له شبكة حائط (wall mesh) عشوائية.

أغلق الرسم البياني (SpawnTunnel) ثم انقر فوق (Compile)، وارجع إلى المحرر الرئيسي واضغط على تشغيل (Play) لرؤية جميع أشكال الحائط المختلفة.

حوائط عشوائية في كل مرة

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

الخطوة التالية هي تعطيل الحركة إلى الأمام عندما يصطدم اللاعب بجدار.

التعامل مع الاصطدام بالجدران (Handling Wall Collisions)

لتمكين أو تعطيل الحركة إلى الأمام، يمكنك استخدام متغير منطقي (Boolean variable)، وهذا المتغير يكون له حالتان فقط، إما صحيح أو خطأ.

افتح (BP_Player) ثم قم بإنشاء متغير منطقي (Boolean variable) جديد يسمى (IsDead).

بعد ذلك، انتقل إلى عقدة علامة الحدث (Event Tick) وأنشئ عقدة فرع (Branch node).

وبعدها، احصل على مرجع إلى (IsDead) وقم بتوصيله بدبوس الشرط (Condition) لعقدة الفرع (Branch node).

العقدة التفرعية

قم بتوصيل عقدة علامة الحدث (Event Tick) بعقدة الفرع (Branch node)، وبعد ذلك، قم بتوصيل دبوس (False) الخاص بالعقدة الفرعية (Branch node) بعقدة (AddActorWorldOffset).

توصيل العقد مع التفرعية

الآن، عندما يتم ضبط المتغير (IsDead) على (true)، سيتوقف اللاعب عن المضي قدماً.

بعد ذلك، دعنا نضبط متغير (IsDead) عندما يصطدم اللاعب بالحائط.

ضبط المتغير المنطقي (Setting the IsDead Variable)

انقر فوق (Compile) ثم قم بالتبديل إلى (BP_Tunnel)، وفي لوحة المكونات (Components panel)، انقر بزر الماوس الأيمن على (WallMesh) وحدد (Add Event \ Add OnComponentHit)، وسيؤدي هذا إلى إضافة العقدة التالية إلى مخطط الأحداث (Event Graph):

ضبط المتغير المنطقي

سيتم تنفيذ هذه العقدة عندما يصطدم ممثل آخر بشبكة الحائط (WallMesh).

أولاً، عليك التحقق مما إذا كان الممثل الذي اصطدم بشبكة الحائط (WallMesh) هو اللاعب.

انقر بزر الماوس الأيسر واسحب دبوس الممثل الآخر (Other Actor)، وحرر زر الماوس الأيسر فوق منطقة فارغة وحدد (Cast to BP_Player) من القائمة.

التحقق من اللاعب

بعد ذلك، انقر بزر الماوس الأيسر واسحب دبوس (Cast to BP_Player) إلى عقدة (BP_Player)، وحرر زر الماوس الأيسر فوق مساحة فارغة ثم أضف عقدة (Set Is Dead).

اضبط المتغير المنطقي (IsDead) على (true) بالنقر بزر الماوس الأيسر فوق مربع الاختيار.

ضبط المتغير المنطقي 2

انقر فوق (Compile) ثم ارجع إلى المحرر الرئيسي، واضغط تشغيل (Play) وحاول ضرب الحائط، وإذا تحركت في حفرة، فلن تتحرك خلالها بعد الآن.

توقف اللاعب عند الاصطدام

في القسم التالي، ستعرض زر إعادة التشغيل عندما يضرب اللاعب الحائط.

عرض زر إعادة التشغيل (Displaying a Restart Button)

الأداة التي ستعرضها تسمى (WBP_Restart)، ويمكنك العثور عليه في مجلد واجهة المستخدم (UI folder)، وهذا ما يبدو عليه:

زر إعادة التشغيل

لعرض الأداة أو إخفائها، تحتاج إلى مرجع لها، افتح (BP_Player) ثم قم بإنشاء متغير جديد باسم (RestartWidget)، وقم بتغيير نوع المتغير إلى (WBP_Restart \ Object Reference).

عرض وإخفاء زر التشغيل

بعد ذلك، انتقل إلى مخطط الأحداث (Event Graph) وحدد موقع عقدة (Event BeginPlay).

قم بإضافة عقدة إنشاء أداة (Create Widget)، وقم بتعيين قيمة الفئة (Class) إلى (WBP_Restart).

بعد ذلك، أضف عقدة وضع أداة إعادة التشغيل (Set Restart Widget)، ثم قم بتوصيل كل شيء كما يلي:

توصيل عقد زر إعادة التشغيل في مخطط الأحداث

الآن، عندما يولد اللاعب، سيُنشئ مثيلًا لـ (WBP_Restart)، والخطوة التالية هي إنشاء تابع يعرض هذا المثيل.

إنشاء تابع العرض (Creating the Display Function)

قم بإنشاء تابع جديد وقم بتسميته (DisplayRestart)، وبمجرد القيام بذلك، قم بإنشاء الرسم البياني التالي:

تابع العرض

ملخص:

  1. ستظهر إضافة إلى منفذ العرض (Viewport) تعرض أداة إعادة التشغيل (RestartWidget) على الشاشة.
  2. سيؤدي ضبط واجهة مستخدم على وضع الإدخال فقط (Input Mode UI Only) إلى تقييد تفاعلات اللاعب على واجهة المستخدم (UI)، وهذا حتى لا يتمكن اللاعب من التحرك أثناء وفاته.
  3. كما يوحي الاسم، يعرض ضبط إظهار مؤشر الماوس (Set Show Mouse Cursor) ببساطة مؤشر الماوس.

ولعرض زر إعادة التشغيل، كل ما عليك فعله هو استدعاء (DisplayRestart) بعد اصطدام اللاعب بجدار.

استدعاء تابع العرض (Calling the Display Function)

أغلق الرسم البياني (DisplayRestart) ثم انقر فوق (Compile).

وبعدها قم بالتبديل إلى (BP_Tunnel) ثم حدد موقع عقدة On Component Hit (WallMesh).

وأضف عقدة (DisplayRestart) إلى نهاية سلسلة العقدة.

استدعاء تابع العرض

انقر فوق (Compile) ثم أغلق (BP_Tunnel)، وارجع إلى المحرر الرئيسي واضغط على (Play)، وإذا اصطدمت بالحائط، فسيظهر زر إعادة التشغيل.

اللعبة بعد إضافة زر إعادة التشغيل

الخطوة الأخيرة هي إعادة تشغيل اللعبة عندما ينقر اللاعب على الزر.

إعادة تشغيل اللعبة (Restarting the Game)

هناك شيئان يجب على اللعبة القيام بهما عند إعادة التشغيل:

  1. إعادة ضبط اللاعب، ويتضمن ذلك إزالة زر إعادة التشغيل من الشاشة.
  2. إعادة توليد الأنفاق، وهذا حتى يبدأ اللاعب في بداية النفق.

لنبدأ بإعادة ضبط اللاعب.

إعادة ضبط اللاعب (Resetting the Player)

افتح (BP_Player) ثم قم بإنشاء تابع جديد يسمى (RestartGame)، وقم بإنشاء الرسم البياني التالي:

إعادة ضبط اللاعب

ملخص:

  1. ضبط (Is Dead) تعيين مجموعات (IsDead) إلى (false)، وهذا يعيد تمكين الحركة إلى الأمام.
  2. يزيل (Remove From Parent) أداة إعادة التشغيل (RestartWidget) من الشاشة.
  3. تعيين لعبة وضع الإدخال فقط (Input Mode Game Only) يعيد تمكين الدخول للعبة حتى يتمكن اللاعب من التحرك.
  4. يؤدي تعيين إظهار مؤشر الماوس (Set Show Mouse Cursor) إلى إخفاء مؤشر الماوس.

بعد ذلك، دعونا نعيد توليد الأنفاق.

إعادة توليد الأنفاق (Respawning the Tunnels)

انقر فوق (Compile) ثم أغلق (BP_Player).

افتح (BP_TunnelSpawner) وتأكد من أنك في الرسم البياني (SpawnInitialTunnels).

أولاً، تحتاج إلى إزالة الأنفاق الموجودة قبل إنشاء أنفاق جديدة.

أضف عقدة تسلسل (Sequence node) بعد عقدة الإدخال (Entry node)، وقم بتوصيل الدبوس (Then 1) إلى عقدة (ForLoop).

إعادة توليد الأنفاق

ملاحظة: تنفذ عقدة التسلسل (Sequence node) مخرجاتها بترتيب تسلسلي، وهي طريقة رائعة لتنظيم الرسم البياني عمودياً خاصة وأن سلاسل العقد يمكن أن تطول جداً.

بعد ذلك، قم بإنشاء العقد التالية:

إنشاء عقد لإعادة توليد الأنفاق

سيحصل هذا الإعداد على جميع الأنفاق الموجودة وإزالتها من اللعبة.

أخيراً، قم بتوصيل الدبوس (Then 0) من عقدة التسلسل (Sequence node) بعقدة إحضار جميع عوامل الفئة (Get All Actors of Class)، وسيضمن ذلك إزالة الأنفاق قبل عملية التوليد الجديدة.

هذا هو الرسم البياني النهائي:

رسم بياني نهائي

آخر شيء يجب القيام به هو النقر فوق الزر.

معالجة نقرات الزر (Handling Button Clicks)

انقر فوق (Compile) ثم أغلق (BP_TunnelSpawner).

انتقل إلى مستعرض المحتوى (Content Browser) وانتقل إلى مجلد واجهة المستخدم (UI folder)، وانقر نقراً مزدوجاً فوق (WBP_Restart) لفتحه.

حدد (RestartButton) ثم انتقل إلى لوحة التفاصيل (Details panel)، ثم انتقل إلى قسم الأحداث (Events section) وانقر فوق الزر الموجود بجوار (OnClicked).

النقر على الزر

سيؤدي هذا إلى إنشاء عقدة تسمى عند النقر (RestartButton)، وسيتم تنفيذ هذه العقدة عندما ينقر اللاعب على زر إعادة التشغيل.

أعد إنشاء ما يلي:

إعادة إنشاء العقد

ملخص:

  1. الحصول على ملكية بيدق اللعب يعيد بيدق اللعب الذي يتحكم فيه اللاعب حالياً.
  2. يتحقق (Cast to BP_Player) مما إذا كان البيدق من فئة (BP_Player).
  3. إذا كان الأمر كذلك، فسوف يستدعي تابع (RestartGame)، ويعمل هذا التابع على إعادة ضبط المشغل وإخفاء زر إعادة التشغيل.
  4. احصل على جميع الممثلين من الفئة (Get All Actors Of Class) واحصل على عائدات (BP_TunnelSpawner) ثم اتصل بتابع (SpawnInitialTunnels)، وسيعمل هذا التابع على إزالة الأنفاق الموجودة وإنشاء أنفاق جديدة.

ملاحظة: قد تتساءل عن سبب استخدام (Get All Actors Of Class) بدلاً من استخدام استدعاء (BP_TunnelSpawner)، والسبب الرئيسي هو أن (BP_Tunnel) ليس لها علاقة بـ (WBP_Restart)، وبالنسبة إلى لعبة بسيطة كهذه، من الأسهل القيام بالطريقة المذكورة أعلاه بدلاً من معرفة مكان تخزين مرجع.

انقر فوق (Compile) ثم أغلق محرر المخطط (Blueprint editor) واضغط على تشغيل (Play) لاختبار زر إعادة التشغيل.

الشكل النهائي للعبة
المصدر
هنا

مقالات ذات صلة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.