העוצמה והגמישות של Unreal Engine חוללו מהפכה בתעשיית הגיימינג, ואפשרו למפתחים ליצור עולמות דיגיטליים מרהיבים לשחקנים לחקור. בין תכונותיו הרבות, היכולת ליישם פונקציונליות מסך מפוצל למשחקי מולטיפלייר היא מועדפת ותיקה בעיני רבים. משחק במסך מפוצל מאפשר לחברים להתאסף סביב מסך אחד ולהשתתף יחד בחוויות מולטיפלייר מרתקות. במאמר זה, אנו רוצים לדבר על פונקציונליות זו וכיצד ניתן להתאים אותה אישית באמצעות תוספים של Unreal Engine.

נתחיל במבוא קצר. Unreal Engine Split Screen הוא תכונה המאפשרת רינדור של מספר חלונות תצוגה בחלון אפליקציה אחד. הוא משמש נפוץ, למשל, במשחקים עם תכונות מולטיפלייר מקומי. Unreal Engine תומך במסך מפוצל באופן מובנה, אך היישום מוגבל לפריסות הפופולריות ביותר בלבד. לעיתים, זה אינו מספיק, וחלק מהפרויקטים שלך עשויים לדרוש פריסה מותאמת אישית. זה המצב, במיוחד בכל הנוגע לגדלי מסך שונים עבור נגנים שונים.

נושא זה חשוב במיוחד עבור HMI (ממשק אדם-מכונה) ו רכב פרויקטים. פרויקטים אלה דורשים לעתים קרובות מספר חלונות תצוגה ביישום אחד כדי להמחיש את כל המידע הנדרש. למרבה הצער, מסך מפוצל באופן שווה כברירת מחדל, כפי שמשמש ברוב המשחקים, יתאים לעתים רחוקות לצרכים של יישום תעשייתי.

במאמר זה ברצוננו להראות לכם כיצד ניתן להשיג פריסת Split Screen מותאמת אישית ב-Unreal Engine באמצעות תוספים. כמובן, קיימות דרכים אחרות להשיג תוצאה דומה. ניתן להגיע לכך, למשל, על ידי עריכת קוד המקור של 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.

כעת עלינו לאפשר משחק מרובה משתתפים מקומי.

פתחו את ה-blueprint של השלב, בדיוק כמו בצילום המסך למטה:

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.

הריצו את הפרויקט כדי לבדוק את התוצאה; כברירת מחדל ישמש מסך מפוצל ל-3 שחקנים:

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.

בואו נצהיר על מזהה עבור תצורת מסך מפוצל מותאמת אישית שלנו. כדי לעשות זאת, הגדירו סוג 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"

לאחר מכן, בואו ניישם בנאי. ב-CustomGameViewportClient.h הצהירו עליו תחת "public":

UCustomGameViewportClient();

לאחר מכן, בקובץ המקור CustomGameViewportClient.cpp, יש ליישם את הבנאי באופן הבא:

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 Split Screen

זהו, כמובן, דוגמה בסיסית מאוד; הלוגיקה והפריסות יכולות להיות מורכבות הרבה יותר. אתה יכול ליצור פריסות מותאמות אישית בהתאם למספר השחקנים, להגדיל את מספר השחקנים המקסימלי מעבר ל-4 המוגדרים כברירת מחדל, או אפילו להזיז ולשנות את גודל חלונות התצוגה בזמן ריצה (על ידי דריסה UGameViewportClient::LayoutPlayers()).

אנו מקווים שמאמר זה ישמש השראה למה שאפשרי. הקוד של התוסף שנוצר עבור מאמר זה זמין להורדה כאן.

זקוקים לתמיכה בפיתוח באמצעות Unreal Engine? הצוות שלנו מוכן לעזור לכם. בקרו ב עמוד שירותי פיתוח HMI למידע נוסף.

שאלות נפוצות

כן. Unreal Engine מאפשר לכם להתאים אישית פריסות מסך מפוצל, אך אפשרויות ברירת המחדל מוגבלות. כדי ליצור פריסות מתקדמות יותר, תוכלו לעקוף את מחלקת GameViewportClient ולהגדיר סידור חלונות משלכם. במאמר אנו מדגימים כיצד לעשות זאת באמצעות תוסף קל-משקל במקום לשנות את קוד המקור של המנוע.

שימוש בתוסף שומר על הפרויקט שלך מודולרי וקל יותר לתחזוקה. במקום לערוך את הקוד המרכזי של Unreal Engine, אתה מיישם את הלוגיקה המותאמת אישית בתוך מודול נפרד. גישה זו הופכת עדכונים לבטוחים יותר ומאפשרת שימוש חוזר בפונקציונליות של מסך מפוצל across פרויקטים.

GameViewportClient אחראי על ניהול viewports ב-Unreal Engine. על ידי יצירת מחלקה מותאמת אישית הנגזרת מ-GameViewportClient, ניתן לעקוף את אופן היצירה, המיקום והרינדור של viewports, ולאפשר פריסות split screen מותאמות אישית לחלוטין.

פריסות מסך מפוצל מותאמות אישית שימושיות כאשר הפריסות הסטנדרטיות אינן מתאימות לצרכי האפליקציה שלך. זה יכול לקרות בסביבות סימולציה, מערכות HMI או פרויקטים מרובי משתתפים שבהם אזורי תצוגה שונים זקוקים לגדלים או סידורים שונים.