שגיאה במערכת תפיסת האויב — אויבים רואים דרך קירות בגלל חוסר בבדיקת Linecast. או NavMeshAgent תקוע בתפר סצנה. באגים כאלה שוברים את חוויית המשחק ומוסיפים שבועות לזמן הדיבאג. אנו בונים AI לאויבים בשלוש שכבות: חיישנים, קבלת החלטות (Behaviour Tree או FSM), וזיכרון. זה מבטל חיזוי ומספק התנהגות מציאותית. הצוות שלנו יישם AI ליותר מ-20 פרויקטים ב-Unity ו-Unreal, כולל מובייל ומחשב. הזמינו פיתוח AI לאויבים — קבלו ייעוץ מהנדס.
ארכיטקטורת תפיסת אויב
שדה ראייה (FOV) הוא השיטה הסטנדרטית: בדיקת מרחק (עד 20 יחידות לאויב בינוני), זווית (בדרך כלל 90–120 מעלות), ו-Linecast לקו ראייה ישיר. דילוג על Linecast גורם לאויב להגיב לשחקן מאחורי מכשולים — באג נפוץ בפרויקטים אינדי.
יישום שדה ראייה
שדה ראייה הוא אזור בדיקה בצורת חרוט. לא רק Physics.OverlapSphere לבד: קודם מרחק (Vector3.Distance < detectionRange), אחר כך זווית (Vector3.Angle(forward, dirToPlayer) < fovAngle / 2), ואז Physics.Linecast לבדיקת קו ראייה ללא מכשולים. בלי האחרון, אויבים רואים דרך קירות.
שמיעה — רדיוס ללא בדיקת זווית, אבל עם פילטר לפי סוג צליל. צעדים על מתכת נשמעים במרחק 15 יחידות, על רצפה רכה ב-5. מיושם דרך AIPerceptionEvent שפורסמו על ידי רכיבי NoiseEmitter על אובייקטים נעים.
מיקום ידוע אחרון (LKP) — מושג קריטי. כשהשחקן נעלם מהעין, האויב לא "שוכח" מיד. Vector3 lastKnownPosition ו-float lastSeenTime נשמרים. במצב חקירה, האויב הולך ל-LKP, מסתכל סביב, ורק אחרי פסק זמן (לדוגמה, 5 שניות) עובר לסיור.
יישום שלב אחר שלב
- צרו רכיב
AIPerceptionעל האויב. הוסיפו שדות ציבורייםdetectionRange,fovAngle,hearingRadius. - ב-
Update(), קראו ל-CheckVision()ו-CheckHearing(). - לראייה:
Vector3.Distanceלשחקן, אחר כךVector3.Angleלזווית, ואזPhysics.Linecastמעיני האויב לשחקן. - לשמיעה: הירשמו ל-
AIPerceptionEventמ-NoiseEmitter. השתמשו ב-Physics.OverlapSphereעם layermask לרעשים. - עדכנו
lastKnownPositionבזיהוי. אם השחקן אבד, זכרו את הזמן. - להתראת קבוצה: בזיהוי, קראו ל-
Physics.OverlapSphereעלalertRadius(לדוגמה, 30 יחידות), מצאו את כל האויבים עם רכיבAIPerception, וקראו ל-ReceiveAlert()עליהם.
Behaviour Tree מול Finite State Machine: מה לבחור?
FSM (Finite State Machine) — לאויבים פשוטים עם 3–5 מצבים. מיושם כ-enum EnemyState + switch ב-Update() או תבנית State עם מחלקות. מהיר לכתיבה, קל לדיבאג. בעיה: הוספת מצבים חדשים מגדילה מעברים בריבוע, ו-FSM הופך לספגטי ב-8–10 מצבים.
Behaviour Tree (BT) — לאויבים מורכבים. Behaviour Tree מאפשר מודל התנהגות פי 2–3 מהר יותר מ-FSM כשמתרחבים ל-10+ מצבים. העץ מורכב מצמתי Selector, Sequence ו-Leaf. Selector מריץ ילדים משמאל לימין, עוצר בהצלחה ראשונה. Sequence מריץ את כל הילדים, עוצר בכישלון ראשון. צמתי עלה הם פעולות אטומיות (MoveToTarget, AttackPlayer, PlayAnimation) ותנאים (IsPlayerVisible, IsHealthLow).
דוגמת עץ לאויב מסייר:
Selector
├── Sequence (атака)
│ ├── IsPlayerInAttackRange
│ └── AttackAction
├── Sequence (преследование)
│ ├── IsPlayerVisible
│ └── MoveToPlayerAction
├── Sequence (расследование)
│ ├── HasLastKnownPosition
│ └── MoveToLKPAction
└── PatrolActionיישומי BT פופולריים ל-Unity: NodeCanvas, Behavior Designer, Unity Muse Behavior (חבילה רשמית). יישום מותאם אישית מוצדק רק לצרכים ספציפיים — כלים מוכנים חוסכים שבועות.
| מאפיין | FSM | Behaviour Tree |
|---|---|---|
| מורכבות הרחבה | ריבועית | לינארית |
| ויזואליזציה | קוד, דיאגרמות | עורך ויזואלי (בדרך כלל) |
| שימוש חוזר | נמוך | גבוה (תתי-עצים) |
| מתאים ל | 3–5 מצבים | 10+ מצבים |
NavMesh: ניווט ובעיות טיפוסיות
Selector ├── Sequence (атака) │ ├── IsPlayerInAttackRange │ └── AttackAction ├── Sequence (преследование) │ ├── IsPlayerVisible │ └── MoveToPlayerAction ├── Sequence (расследование) │ ├── HasLastKnownPosition │ └── MoveToLKPAction └── PatrolAction — רכיב Unity לניווט אוטומטי על NavMeshAgent אפוי. שימוש בסיסי: NavMesh. אבל יש ניואנסים.
NavMeshAgent נתקע בתפר של שני NavMeshSurface — בעיה קלאסית עם טעינת סצנות אדיטיבית. לכל סצנה יש משטח משלה, חיבורים דרך agent.SetDestination(target) חייבים להיות מוגדרים במפורש. רכיב NavMeshLink מהחבילה NavMeshSurface מחליף את ה-NavMesh האפוי הישן ותומך בעדכון בזמן ריצה למכשולים דינמיים דרך AI Navigation. פרטים נוספים בתיעוד הרשמי של Unity AI Navigation.
SetDestination בכל פריים — תקורה מיותרת. חישוב מחדש של נתיב לוקח כמה מילישניות. מומלץ לעדכן יעד לא יותר מפעם אחת ב-0.1–0.2 שניות דרך NavMeshObstacle או על ידי בדיקת שינוי מרחק של מיקום המטרה: אם המטרה זזה פחות מ-0.5f, אין צורך בחישוב מחדש.
מרחק עצירה והתנהגות הגעה. InvokeRepeating קובע את המרחק ליעד שבו הסוכן עוצר. לאויב תוקף, זה agent.stoppingDistance. במעבר בין מצבים (סיור למרדף), צריך לשנות attackRange - 0.5f ו-stoppingDistance — מצבים שונים דורשים פרמטרים שונים של סוכן.
למה דיבאג AI דרך Gizmos הוא קריטי?
AI מתויג דרך Gizmos: ציירו חרוט FOV, נקודת LKP, נתיב סוכן נוכחי, מצב פעיל מעל ראש האויב. בלי ויזואליזציה בעורך, הבנת התנהגות AI בזמן ריצה היא כמעט בלתי אפשרית.
פרופיילינג: speed (זמן נתיב לפריים), מספר סוכנים פעילים. בפלטפורמות מובייל, יותר מ-20 NavMesh.pathfindingTimeSlice פעילים בו זמנית מתחילים להעמיס על המעבד. פתרון — AI LOD: אויבים במרחק עוברים להתנהגות מפושטת ללא חישוב נתיב מחדש.
זיכרון AI והתנהגות קבוצתית
זיכרון אויב פשוט: רכיב NavMeshAgent עם AIMemory שבו כל רשומה שומרת List<MemoryEntry>, position (שחקן, צליל, גופה), type. רשומות ישנות מוסרות אחרי פסק זמן (לדוגמה, 10 רשומות, כל אחת חיה 30 שניות). בקבלת החלטות, BT או FSM שואלים את הזיכרון דרך time.
התראת קבוצה — כשאויב אחד מזהה את השחקן, הוא צריך להודיע לשכנים. מיושם דרך GetMostRecentEntry(MemoryType.Player) ברדיוס Physics.OverlapSphere (30 יחידות) עם פילטר לפי תג alertRadius, קראו ל-Enemy. פתרון מבוזר זה אינו דורש מנהל.
אגפוף ותיאום — ל-AI טקטי. טכניקה אחת: enemy.GetComponent<AIPerception>().ReceiveAlert(lastKnownPosition) משמש למציאת עמדות באגף השחקן, אויבים מתחלקים לעמדות אלה דרך מנהל קבוצה. פרטי היישום תלויים בז'אנר.
יישום נכון של AI לאויבים מפחית זמן דיבאג ב-30–50%, חוסך בתקציב המוביל בשעות עבודה. AI איכותי יכול לחסוך עד $500 בשלבי פיתוח מוקדמים על ידי הפחתת מספר איטרציות בדיקה.
מה כלול בעבודה?
- ניתוח דרישות משחק ועיצוב ארכיטקטורת AI
- יישום מערכות תפיסה (FOV, שמיעה, LKP)
- פיתוח עצי התנהגות או מכונות מצבים סופיות
- הגדרת ניווט (NavMesh, NavMeshLink, אופטימיזציה)
- אינטגרציה של זיכרון, התראות והתנהגות קבוצתית
- דיבאג דרך Gizmos, פרופיילינג ואופטימיזציית ביצועים
- תיעוד והדרכת צוות
- תמיכה לאחר השקה
לוחות זמנים משוערים
| מורכבות AI | הרכב | לוח זמנים |
|---|---|---|
| FSM פשוט | סיור, מרדף, תקיפה, 3 מצבים | 3–5 ימים |
| בינוני | תפיסה, LKP, חקירה, בריחה | 1–2 שבועות |
| BT מלא | NodeCanvas/Behavior Designer, קבוצות, תיאום | 3–6 שבועות |
| טקטי מורכב | אגפוף, מערכת כיסוי, AI חוליה | 2–3 חודשים |
אנחנו צוות עם ניסיון של 10+ שנים בפיתוח משחקים, שיישם AI ליותר מ-20 פרויקטים ב-Unity ו-Unreal. אנו מבטיחים פונקציונליות ומספקים תמיכה לאחר מסירה. צרו קשר לייעוץ — נבחר את הפתרון האופטימלי לפרויקט שלכם.





