פיתוח עורכים מותאמים אישית למנהלי תוכן במשחקים
אחד הלקוחות שלנו — מעצב משחקים — רצה להוסיף רמה חדשה לפרויקט RPG למובייל. ללא כלי מותאם אישית, התהליך נראה כך: הוא פותח את Unity Editor, יוצר ScriptableObject, ממלא שדות ידנית, לא רואה תצוגה מקדימה, בטעות משאיר null בשדה חובה — והבאג מתגלה ב-QA שבוע לאחר מכן. העיכוב הזה — שבוע למציאת null אחד — עולה לפרויקט זמן וכסף. עם עורך הרמות שלנו בתוך Unity: רשימת רמות ויזואלית, גרירה ושחרור לסידור, ולידציה מובנית, תצוגה מקדימה של אייקון הרמה ישירות בכלי.
ההבדל הוא לא רק נוחות. זה מהירות איטרציה ומספר באגי התוכן. הניסיון שלנו מראה שעורכים מותאמים אישית מפחיתים את זמן יצירת התוכן ב-40–60% ומקצצים באגי שחרור פי 5.
במאמר זה נבחן אילו סוגי עורכים מבוקשים בתעשיית המשחקים, כיצד אנו מיישמים אותם ב-Unity ו-Unreal Engine, ומה היתרונות שהם מביאים לצוות. אם אתם צריכים כלי מותאם אישית — צרו קשר לניתוח ראשוני.
אילו בעיות פותרים עורכים מותאמים אישית?
חלונות עורך מותאמים אישית לעבודה עם נתוני משחק. מקרים טיפוסיים: עורך משימות (עץ תלויות, תנאים, תגמולים), עורך דיאלוגים (גרף הסתעפות), עורך כלכלה (טבלאות מחירים, שערי חליפין, איזון), עורך שלל (הסתברויות, משקלים, תנאי נפילה). כל זה יכול להישמר ב-ScriptableObject או JSON — אבל עריכה דרך ה-Inspector הסטנדרטי היא איטית ומועדת לשגיאות. פיתוח כלים כאלה אורך בין 3 ימים ל-4 שבועות תלוי במורכבות.
EditorWindow ב-Unity הוא מחלקת הבסיס לכל כלי. IMGUI (GUILayout, EditorGUILayout) או UI Toolkit החדש (USS + UXML) — אנו בוחרים לפי המשימה. UI Toolkit עדיף לממשקים מורכבים עם עצים, רשימות, גרירה ושחרור. IMGUI מהיר יותר לטפסים פשוטים ואינו דורש קבצי markup נפרדים.
PropertyDrawer ו-CustomEditor — כאשר אין צורך בחלון נפרד אבל רוצים לשפר את התצוגה של ScriptableObject או Component מסוים ב-Inspector. [CustomPropertyDrawer(typeof(LootTable))] עם ויזואליזציה של משקלים כהיסטוגרמה קטנה ישירות ב-Inspector — זה כמה שעות עבודה שחוסכות שעות של בלבול למעצב המשחקים.
כיצד בנינו עורך דיאלוגים ל-RPG — מקרה מהפרקטיקה
עורך דיאלוגים דמוי גרף הוא סוג הכלי המבוקש ביותר. דרישות: צמתים עם טקסט דיבור, ענפי בחירה, תנאים (בדיקות דגלים, התקדמות), לוקליזציה. בפרויקט היו 50+ צמתים, 20 סוגי תנאים — העורך קיצץ את זמן הזנת הדיאלוגים פי 3.
הגישה הסטנדרטית מבוססת על ה-API של GraphView (namespace UnityEditor.Experimental.GraphView). GraphView מספק pan, zoom, select, copy-paste מהקופסה. מחלקות Node מותאמות אישית יורשות מ-UnityEditor.Experimental.GraphView.Node, פורטים (Port) מגדירים כניסות ויציאות.
הבעיה עם GraphView: הוא סומן כ-Experimental מאז Unity 2019 ומעולם לא הפך רשמית ליציב. זה אומר שינויים שוברים פוטנציאליים בעת שדרוג המנוע. חלופות לפרויקטים חדשים הן xNode (קוד פתוח) או יישום מותאם אישית על UI Toolkit עם לוגיקת גרירה מותאמת.
נתוני דיאלוג נשמרים ב-ScriptableObject עם [SerializeReference] לאחסון פולימורפי של סוגי צמתים שונים — זה מאפשר סריאליזציה של טיפוסים יורשים ללא wrappers ומונע אובדן טיפוס במהלך deserialization. אם יש צורך לערוך דיאלוגים מחוץ ל-Unity (על ידי מעצב נרטיב ללא ה-Editor) — אנו משתמשים ב-JSON עם סריאליזציה מותאמת אישית או פורמטים של yarn/ink עם parser בצד Unity.
כיצד ולידציה מונעת שגיאות?
כלי ללא ולידציה מעביר את האחריות לתקינות הנתונים לאדם — זה תמיד מוביל לשגיאות. שלוש רמות הגנה:
ולידציה מובנית בעורך. תכונת [Required] דרך PropertyDrawer מותאם אישית שמצייר מסגרת אדומה סביב שדות חובה ריקים. נראה מיד, לפני השמירה. ולידציה מובנית מפחיתה שגיאות בזמן עריכה ב-90%.
ולידציה לפני בנייה. IPreprocessBuildWithReport.OnPreprocessBuild() — מתודה שנקראת לפני כל בנייה. אנו עוברים על כל נכסי ScriptableObject מהסוג הנדרש דרך AssetDatabase.FindAssets, בודקים שדות חובה, הפניות null, מזהים כפולים. אם נמצאה שגיאה — אנו throw BuildFailedException עם תיאור של מה ומהיכן שבור. הבנייה לא מתחילה עם נתונים שבורים.
הצהרות זמן ריצה. בבנייות Debug: Debug.Assert(quest.reward != null, $"Quest {quest.id} has null reward"). זול ותופס את מה שעבר דרך שתי הרמות הראשונות.
דוגמת קוד לוולידציה מובנית
```csharp [CustomPropertyDrawer(typeof(LootTable))] public class LootTableDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); // drawing with validation EditorGUI.EndProperty(); } } ```כלי Gizmo מותאמים אישית ו-Scene View
לעורכי רמות: Handles מותאמים אישית ב-Scene View דרך Handles.DrawWireCube, Handles.DrawBezier, HandleUtility.PickGameObject — מאפשרים ויזואליזציה של נתוני משחק ישירות בסצנה. אזורי spawn, נתיבי סיור, אזורי trigger — ניתנים לעריכה באמצעות גרירה ב-Scene View, לא דרך מספרים ב-Inspector.
תכונת [DrawGizmo(GizmoType.Selected)] מציירת Gizmo מותאם אישית ללא OnDrawGizmos() על הרכיב — ארכיטקטורה נקייה יותר.
מה כלול בעבודה
| שלב | תוצאה | זמן משוער |
|---|---|---|
| ניתוח מבנה נתונים | מפרט עורך וסכמת נתונים | 1–2 ימים |
| אב טיפוס ממשק | מודל ב-UI Toolkit או Figma | 2–4 ימים |
| יישום ליבה | פונקציונליות CRUD, ולידציה, סריאליזציה | 3–10 ימים |
| אינטגרציה לפרויקט | חיבור למערכות קיימות | 1–3 ימים |
| תיעוד והדרכה | מדריך משתמש ומפגש וידאו | 1–2 ימים |
לוחות זמנים
| כלי | זמן |
|---|---|
| CustomEditor / PropertyDrawer לטיפוס קיים | 1–3 ימים |
| EditorWindow פשוט (טבלת נתונים + CRUD) | 3–7 ימים |
| עורך גרף (דיאלוגים, משימות) במורכבות בינונית | 2–4 שבועות |
| עורך רמות מלא עם ולידציה ו-gizmos | 3–8 שבועות |
העלות מחושבת לאחר תיאור דרישות פונקציונליות וניתוח מבנה נתוני המשחק. הכלי מחזיר את עצמו תוך 2–3 חודשים על ידי הפחתת שגיאות תוכן. יש לנו ניסיון של למעלה מ-5 שנים בתעשיית המשחקים ויותר מ-30 כלים מיושמים לאולפנים בגדלים שונים. העריכו כיצד כלי מותאם אישית יכול להאיץ את תהליך העבודה של הצוות שלכם. מוכנים לדון בעורך שלכם? צרו קשר להערכה מפורטת.





