שחקנים מתלוננים על בקרות "עץ", ומפתחים לא מבינים למה מכניקה שנראית מושלמת על הנייר מתפרקת בפועל. הבעיה טמונה בפרטים: קפיצה פיזית ללא coyote time, זיהוי פגיעות עם race conditions, מלאי שמפגר עם 50 פריטים. פיתוח מכניקות משחק דורש לא רק אינטואיציה של עיצוב משחק אלא גם משמעת ארכיטקטונית. במשך 5+ שנים, יישמנו 30+ מכניקות לפרויקטים החל מפלטפורמרים למובייל ועד יריות מרובי משתתפים ופיתחנו מערכת שממזערת סיכונים.
איך ליישם תחושת משחק בפועל
תחושת משחק היא החלק הקשה ביותר. קפיצה בפלטפורמר מרגישה "עץ" בגלל איך שהכבידה מתנהגת באוויר. Physics.gravity = new Vector3(0, -9.81f, 0) סטנדרטי נותן קפיצה נכונה פיזית אבל לא ידידותית לעיצוב משחק. אנו משתמשים במקדמים נפרדים לשלבי העלייה והירידה:
// Более тяжёлое падение — ощущение веса
if (rb.velocity.y < 0)
rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
// Обрезаем прыжок при отпускании кнопки
else if (rb.velocity.y > 0 && !Input.GetButton("Jump"))
rb.velocity += Vector3.up * Physics.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;// Более тяжёлое падение — ощущение веса if (rb.velocity.y < 0) rb.velocity += Vector3.up * Physics.gravity.y * (fallMultiplier - 1) * Time.deltaTime; // Обрезаем прыжок при отпускании кнопки else if (rb.velocity.y > 0 && !Input.GetButton("Jump")) rb.velocity += Vector3.up * Physics.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime; , fallMultiplier = 2.5f הם ערכים התחלתיים שמעודכנים מאוחר יותר עם מעצב המשחק. בנוסף, קריטיים הם coyote time (קפיצה 80–150 אלפיות השנייה אחרי עזיבת פלטפורמה) ו-jump buffering (חיץ של 100–200 אלפיות השנייה). ללא פרטים אלה, הבקרות מרגישות "לא מגיבות", גם אם טכנית הכל נכון.
"Coyote time היא טכניקה מרכזית לבקרות מגיבות, שתוארה בהרצאה של GDC 'Juice It or Lose It'."
למה ארכיטקטורת מכניקה פותרת 80% מהבעיות
פיזיקה ובקרות
לתנועת דמות, אנו בוחרים בין Rigidbody (פיזיקה ריאלית אבל חוסר יכולת חיזוי עם FPS שונה), CharacterController (תנועה צפויה אבל פיזיקת התנגשות מוגבלת), ובקר קינמטי מותאם אישית (שליטה מלאה אבל יותר קוד). לפלטפורמרים, CharacterController מועדף; לסימולטורים, Rigidbody; למשחקי לחימה, מותאם אישית. לפי הנתונים שלנו, 60% מבאגי המשחק קשורים לארכיטקטורת מכניקה שגויה. בחירה שגויה מובילה ל-40% עבודה חוזרת בשלבים מאוחרים.
| גישה | יכולת חיזוי | ביצועים | מורכבות יישום |
|---|---|---|---|
| Rigidbody | נמוכה | גבוהה | בינונית |
| CharacterController | גבוהה | בינונית | נמוכה |
| קינמטי מותאם אישית | גבוהה | נמוכה (יותר קוד) | גבוהה |
מערכות לחימה וזיהוי פגיעות
הפעלת hitbox מבוססת פריימים דרך AnimationEvent + בדיקות חפיפה ידניות אמינה יותר מ-lowJumpMultiplier = 2f. למשחקי רשת, אימות בצד השרת הוא חובה: הלקוח מנבא, השרת מאשר. ללא זה, כל פגיעה חמישית יכולה להתבטל בגלל desync.
מלאי ומערכות פריטים
טעות ארכיטקטונית היא אחסון מצב המלאי ב-MonoBehaviour על הסצנה. הגישה הנכונה היא OnTriggerEnter כמיכל נתונים + מנהל נפרד עם DontDestroyOnLoad. למלאי RPG מורכב, אנו בונים באמצעות ItemDefinition (נתונים סטטיים) ו-ItemInstance (מצב ריצה). זה מאפשר סריאליזציה של המלאי ל-JSON ללא הפניות לאובייקטים של Unity. עוד על ScriptableObject בתיעוד של Unity.
איך אנו מתכננים ומיישמים מכניקות
אב טיפוס לפני הפקה
מכניקה חדשה מתחילה באב טיפוס מבודד בסצנה נפרדת. המטרה היא להשיג תחושת משחק תוך 2–3 ימים, לפני שהמכניקה מתמלאת בתלויות. אנו משתמשים בפרמטרים של עיצוב משחק דרך קונפיגורציות ScriptableObject עם מאפיינים [Range]. המעצב מעדכן ערכים בעורך במצב Play Mode ללא עצירה או בנייה מחדש.
| סוג מכניקה | זמן אב טיפוס | זמן יישום מלא |
|---|---|---|
| פשוטה (קפיצה, אינטראקציה) | 2–3 ימים | 1–2 שבועות |
| בינונית (מלאי, דיאלוגים) | 3–5 ימים | 2–4 שבועות |
| מורכבת (מערכת לחימה, AI) | 5–7 ימים | 3–6 שבועות |
מכונת מצבים ללוגיקת משחק
לדמויות מורכבות עם עשרות מצבים, אנו משתמשים במכונות מצבים היררכיות בקוד — הן ניתנות לבדיקה ובלתי תלויות בעורך. ה-Animator Controller מתאים רק לחלק האנימציה. אנו שומרים לוגיקת מצבים ב-C# עם מעברים מפורשים.
מערכות שבנינו
- יצירת מבוכים פרוצדורלית דרך עץ BSP + חיבור מסדרונות (roguelike)
- מערכת דיאלוג עם הסתעפויות, תנאים ודיבוב דרך Ink runtime + אינטגרציה עם Unity
- מלאי + יצירה + חריצי ציוד עם תמיכה בשמירה/טעינה דרך JSON
- מערכות קומבו למשחקי לחימה עם נתוני פריימים (startup / active / recovery frames)
- AI התגנבות עם חרוט ראייה, רמות התראה וזיכרון של מיקום השחקן
- פיזיקת רכב מבוססת WheelCollider עם כוונון מתלים מותאם אישית
תהליך עבודה
- ניתוח מכניקה (1–3 ימים). פירוק דרישות, מקרי קצה, אינטראקציה עם מערכות אחרות. למפרטים מעורפלים, אנו מקיימים סדנת עיצוב משחק.
- אב טיפוס (2–5 ימים). יישום מינימלי לבדיקת תחושה. ללא החלטות ארכיטקטוניות סופיות.
- שיפור לאיכות הפקה (החל משבוע). ארכיטקטורה נקייה, מקרי קצה, אינטגרציה, אופטימיזציה, בדיקות.
- QA. בדיקות יחידה על לוגיקה, בדיקות ידניות של מקרי קצה.
דוגמה לקונפיגורציית ScriptableObject להתקפה
[CreateAssetMenu(fileName = "AttackConfig", menuName = "Game/AttackConfig")]
public class AttackConfig : ScriptableObject
{
public float damage = 25f;
public float range = 2.5f;
public int startupFrames = 3;
public int activeFrames = 5;
public int recoveryFrames = 8;
} טעויות נפוצות בפיתוח מכניקות
- הסתמכות על מנוע הפיזיקה במקום שבו נדרשת יכולת חיזוי. Rigidbody עם AddForce נותן תוצאות שונות ב-FPS שונה. לפלטפורמרים, בקר קינמטי על CharacterController אמין יותר.
- אי הפרדה בין ויזואליה ללוגיקה. אנימציה לא צריכה לשלוט במצב. AnimationEvent כטריגר זה בסדר, אבל לא כמקור אמת.
- קידוד מספרים במקום קונפיגורציות. ScriptableObject עם פרמטרי התקפה פותר את זה ומאפשר קונפיגורציות שונות לאויבים שונים.
הניסיון והמספרים שלנו
במהלך עבודתנו, יישמנו 30+ מכניקות, זמן אב טיפוס ממוצע הוא 3 ימים, חלק הפרויקטים ללא עבודה חוזרת לאחר השחרור הוא 85%. לקוחות חוסכים בממוצע 30% מהתקציב בזכות אב טיפוס איכותי. צרו קשר לייעוץ — ננתח את הדרישות, נציע ארכיטקטורה וניצור אב טיפוס תוך שבוע.
מה כלול בפיתוח
- מפרט טכני עם תיאור מקרי קצה
- אב טיפוס לבדיקת תחושה (build ניתן להפעלה)
- קוד מקור עם הערות ובדיקות
- קבצי קונפיגורציה (ScriptableObject) לאיזון
- תיעוד אינטגרציה ו-API
- תוכנית בדיקות ותוצאות QA
- גישה לריפוזיטורי ולצ'אט מפתחים
הזמינו פיתוח מכניקה — קבלו יישום אמין מאב הטיפוס הראשון.





