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

لنبدأ بمقدمة قصيرة. Unreal Engine Split Screen هي ميزة تتيح عرض منافذ عرض متعددة في نافذة تطبيق واحدة. وهي شائعة الاستخدام، على سبيل المثال، في الألعاب التي تتضمن ميزات اللعب الجماعي المحلي. Unreal Engine يدعم تقسيم الشاشة بشكل جاهز، لكن التنفيذ يقتصر على بعض التخطيطات الأكثر شيوعاً فقط. في بعض الأحيان، لا يكون ذلك كافياً، وقد تتطلب بعض مشاريعك تخطيطاً مخصصاً. وهذا هو الحال، خاصةً عندما يتعلق الأمر بأحجام شاشات مختلفة لمشغلات مختلفة.

هذا الموضوع مهم بشكل خاص لـ واجهة الإنسان والآلة (HMI) و السيارات المشاريع. غالبًا ما تحتاج تلك المشاريع إلى منافذ عرض متعددة في تطبيق واحد لعرض جميع المعلومات المطلوبة. ولسوء الحظ، نادرًا ما تلبي شاشة العرض الافتراضية المنقسمة بالتساوي التي تستخدمها معظم الألعاب احتياجات التطبيق الصناعي.

في هذه المقالة، نريد أن نوضح لك كيف يمكن تحقيق تخطيط شاشة مقسمة (Split Screen) مخصص في Unreal Engine باستخدام الإضافات (plugins). بالطبع، هناك طرق أخرى لتحقيق نتيجة مماثلة. يمكنك الوصول إلى ذلك، على سبيل المثال، من خلال تعديل الكود المصدري لـ Unreal Engine مباشرة. ومع ذلك، يتطلب هذا النهج إعادة بناء المحرك بالكامل، وهو أمر يستغرق وقتًا طويلاً وقد يكون محفوفًا بالمشاكل. كانت إضافة الكود مباشرة إلى المشروع ممكنة أيضًا بالطبع، لكن استخدام إضافة Unreal Engine يسهل إعادة استخدامه في مشاريع مختلفة.

سيناريو واقعي لهذا النهج سيكون HMI DigiTwin المشروع، حيث أردنا ثلاثة منافذ عرض مع خيار التبديل إلى منفذ واحد يملأ المنطقة بأكملها:

Single viewport in the DigiTwin HMI project built in Unreal Engine.
Custom Unreal Engine split screen layout with three viewports.

دون مزيد من التأخير، لننتقل مباشرة إلى كيفية القيام بذلك.

كيفية تخصيص تقسيم الشاشة في Unreal Engine

أولًا، لننشئ مشروع Unreal Engine جديد. اختر أحد القوالب أو استخدم مشروعًا موجودًا (إذا كنت تفضل ذلك).

تذكّر تفعيل دعم C++.

Unreal Engine project templates.

الآن نحتاج إلى تمكين اللعب الجماعي المحلي.

افتح مخطط المستوى، تمامًا كما في الشاشة أدناه:

Opening Level Blueprint in Unreal Engine to configure Unreal Engine split screen multiplayer.

أنشئ لاعبين إضافيين بمعرّف وحدة تحكم 1 و2:

Blueprint nodes creating additional players for Unreal Engine split screen local multiplayer.

قم بتشغيل المشروع للتحقق من النتيجة؛ سيتم استخدام تقسيم الشاشة الافتراضي لثلاثة لاعبين:

Default Unreal Engine split screen layout displayed for three players.

إنشاء إضافة جديدة

افتح قائمة إضافات Unreal Engine باختيار Edit -> Plugins:

Unreal Engine editor Plugins browser tab used to start creating a split screen plugin.

اضغط على "Add"، ثم اختر "Blank" وأدخل اسمًا للإضافة الخاصة بك. أكّد بزر "Create Plugin":

Creating a blank plugin in Unreal Engine to customise Unreal Engine split screen behaviour.

إنشاء تطبيق GameViewportClient جديد

اختر Tools -> New C++ Class…، ثم انتقل إلى "All Classes" واختر GameViewportClient كفئة أصل.

تابع بالضغط على "التالي":

Selecting GameViewportClient as the parent class for Unreal Engine split screen customisation.

أدخل اسمًا للفئة الجديدة (على سبيل المثال، CustomGameViewportClient)، واختر الإضافة كوحدة هدف من القائمة المنسدلة:

Creating CustomGameViewportClient class used to control Unreal Engine split screen layout.

سيفشل البناء في الوقت الحالي؛ وهذا أمر متوقع:

Unreal Engine Live Coding window showing a linker error while compiling a custom split screen plugin.

إصلاح مشكلة الرابط

انتقل إلى نافذة Visual Studio؛ ينبغي أن تكون قد فُتحت تلقائياً في الخلفية بحلول الآن.

الانتقال إلىPluginExample\Plugins\CustomSplitScreen\Source\CustomSplitScreen\CustomSplitScreen.Build.cs في شجرة المشروع.

حدد موقع "PrivateDependencyModuleNames" وأضف "InputCore" إلى القائمة:

Visual Studio project configuration adding dependencies for the Unreal Engine split screen plugin.

أعد التجميع باستخدام زر Live Coding في محرر UE:

Recompiling the Unreal Engine project after implementing the custom split screen plugin.

تنفيذ CustomGameViewportClient

يتم تخزين إعدادات تقسيم الشاشة في UGameViewportClientSplitscreenInfo وفهرستها بواسطة قيم ESplitScreenType::Type.

لنُعرّف معرّفًا (ID) لإعداد تقسيم الشاشة المخصص لدينا. للقيام بذلك، عرّف نوع enum جديدًا في CustomGameViewportClient.h بناءً على قيم ESplitScreenType الموجودة:

UENUM(BlueprintType) namespace ECustomSplitScreenType { enum Type { // 0 value required by UE None, // Custom Splitscreen, next value after last built-in splitscreen type ThreePlayer = ESplitScreenType::SplitTypeCount, SplitTypeCount }; }

لا تنسَ تضمين ترويسة VieportSplitscreen في الملف نفسه.

#include "Engine/ViewportSplitScreen.h"

بعد ذلك، لننفّذ المُنشئ (constructor). في CustomGameViewportClient.h، أعلن عنه تحت "public":

UCustomGameViewportClient();

بعد ذلك، في ملف المصدر CustomGameViewportClient.cpp، قم بتنفيذ المُنشئ (constructor) على النحو التالي:

UCustomGameViewportClient::UCustomGameViewportClient() : Super(FObjectInitializer::Get()) { // Resize SplitscreenInfo to fit our custom config SplitscreenInfo.SetNum(ECustomSplitScreenType::SplitTypeCount, false); // Fill the custom config SplitscreenInfo[ECustomSplitScreenType::ThreePlayer].PlayerData.Add(FPerPlayerSplitscreenData(0.33f, 1.00f, 0.66f, 0.00f)); //1 SplitscreenInfo[ECustomSplitScreenType::ThreePlayer].PlayerData.Add(FPerPlayerSplitscreenData(0.66f, 0.50f, 0.00f, 0.00f)); //2 SplitscreenInfo[ECustomSplitScreenType::ThreePlayer].PlayerData.Add(FPerPlayerSplitscreenData(0.66f, 0.50f, 0.00f, 0.50f)); //3 }

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

نحتاج إلى تجاوزه في الفئة الفرعية لدينا:

virtual void UpdateActiveSplitscreenType() override;

وهنا تنفيذ أساسي:

void UCustomGameViewportClient::UpdateActiveSplitscreenType() { ECustomSplitScreenType::Type SplitType = ECustomSplitScreenType::None; const int32 NumPlayers = GEngine->GetNumGamePlayers(GetWorld()); if (NumPlayers == 3) { // If Player count is equal 3, select custom Splitscreen ActiveSplitscreenType = static_cast<ESplitScreenType::Type>(ECustomSplitScreenType::ThreePlayer); } else { // Otherwise fallback to default behaviour Super::UpdateActiveSplitscreenType(); } }

مرة أخرى، قم بالتصريف باستخدام زر Live Coding في محرر UE.

تكوين المشروع لاستخدام الفئة المُنشأة حديثاً

افتح Edit -> Project Settings…،

انتقل إلى Engine -> General Settings، وابحث عن Default Classes -> Game Viewport Client Class

أو ابحث ببساطة عن "Game Viewport" في مربع البحث

اختر CustomGameViewportClient من القائمة المنسدلة.

Project settings selecting CustomGameViewportClient for Unreal Engine split screen configuration.

سيطلب محرر UE إعادة التشغيل؛ تابع:

Unreal Engine Editor 'restart required' window.

شغّل المشروع وتحقق من النتيجة النهائية:

Final custom Unreal Engine split screen layout running in the application.

الملخص: استخدم الإضافة لتخصيص تقسيم الشاشة في Unreal Engine

هذا بالطبع مثال أساسي للغاية؛ يمكن أن تكون المنطقية والتخطيطات أكثر تعقيدًا بكثير. يمكنك إنشاء تخطيطات مخصصة حسب عدد اللاعبين، أو زيادة الحد الأقصى لعدد اللاعبين بما يتجاوز الافتراضي وهو 4، أو حتى نقل منافذ العرض وتغيير حجمها أثناء التشغيل (عن طريق تجاوز UGameViewportClient::LayoutPlayers()).

نأمل أن يكون هذا المقال مصدر إلهام لما هو ممكن. الكود الخاص بالإضافة البرمجية التي أُنشئت لهذا المقال متاح للتنزيل هنا.

هل تحتاج إلى دعم في التطوير باستخدام Unreal Engine؟ فريقنا مستعد لمساعدتك. قم بزيارة صفحة خدمات تطوير واجهة الإنسان والآلة لمزيد من المعلومات.

الأسئلة الشائعة

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

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

GameViewportClient مسؤول عن إدارة منافذ العرض في Unreal Engine. من خلال إنشاء فئة مخصصة مشتقة من GameViewportClient، يمكنك تجاوز كيفية إنشاء منافذ العرض وتحديد مواضعها وعرضها، مما يتيح تخطيطات شاشة مقسّمة مخصصة بالكامل.

تُعد تخطيطات الشاشة المنقسمة المخصّصة مفيدة عندما لا تتوافق التخطيطات القياسية مع احتياجات تطبيقك. وقد يحدث ذلك في بيئات المحاكاة، أو أنظمة واجهة الإنسان والآلة HMI، أو المشاريع متعددة اللاعبين حيث تحتاج منافذ العرض المختلفة إلى أحجام أو ترتيبات مختلفة.