תארו לעצמכם: אתם משיקים משחק AR, אויבים מופיעים על שולחן אמיתי, אבל אחרי שתי שניות ARKit מאבד מעקב – עצמים נסחפים, הפיזיקה נשברת, והשחקן זועם. נתקלנו בזה עשרות פעמים במשך 5 שנים, כשסיפקנו מעל 30 פרויקטי AR. פיתוח מכניקת AR יציבה דורש התחשבות בניואנסים רבים: מפיזיקת RealityKit ועד אופטימיזציה למכשירים עם 3 GB RAM. הצוות שלנו מבטיח 60 FPS יציבים אפילו באייפון 11. בעיות טיפוסיות: אובדן מעקב, פיזיקה לא יציבה בתנאי תאורה משתנים, חריגות במחוות שליטה, וקשיים במציאת נתיב על משטחי AR. החזר השקעה לפתרון כזה הוא פחות מ-6 חודשים. צרו קשר כדי לדון במשימה שלכם ולקבל ייעוץ.
איך לבחור כלי פיזיקה ל-AR?
RealityKit הוא הבחירה הראשונה לפרויקטים חדשים. PhysicsBodyComponent + CollisionComponent מספקים פיזיקה מקורית דרך הבנת הסצנה של ARKit:
var physicsBody = PhysicsBodyComponent(massProperties: .default, material: nil, mode: .dynamic)
physicsBody.isAffectedByGravity = true
entity.components[PhysicsBodyComponent.self] = physicsBody
var collision = CollisionComponent(shapes: [.generateBox(size: entity.visualBounds(relativeTo: nil).extents)])
entity.components[CollisionComponent.self] = collisionכאשר var physicsBody = PhysicsBodyComponent(massProperties: .default, material: nil, mode: .dynamic) physicsBody.isAffectedByGravity = true entity.components[PhysicsBodyComponent.self] = physicsBody var collision = CollisionComponent(shapes: [.generateBox(size: entity.visualBounds(relativeTo: nil).extents)]) entity.components[CollisionComponent.self] = collision מופעל, עצמי AR מתקשרים נכון עם משטחים אמיתיים. כדור מתגלגל על שולחן אמיתי, קופסה עומדת על מדף אמיתי.
הבעיה עם RealityKit היא שליטה מוגבלת. אין לכם גישה לשלבים בודדים של מנוע הפיזיקה או לגנרטורים מותאמים אישית של כוחות. למכניקה פשוטה, זה מספיק. לפיזיקת משחק מורכבת (ragdoll, סימולציית נוזלים, פיזיקת חבלים), צריך SceneKit עם PhysicsWorld או Unity עם AR Foundation.
| כלי | פשטות | שליטה | ביצועים |
|---|---|---|---|
| RealityKit | ★★★★ | ★★ | ★★★★ |
| SceneKit | ★★★ | ★★★ | ★★★ |
| Unity AR Foundation | ★★ | ★★★★★ | ★★★★★ |
שליטת AR: מחוות מול כיוון
הקשה למקם, צביטה לשינוי גודל, סיבוב – סטנדרטי. אבל ב-AR, מחוות מתחרות בתנועת המצלמה. המשתמש רוצה לסובב עצם – ARKit מפרש את זה כמעקב ידיים.
פתרון דרך arView.environment.sceneUnderstanding.options = [.physics] עם UIGestureRecognizer: הקשה מזוהה רק אם החלקה לא החלה. לסיבוב – shouldRequireFailure(of:) עם תזוזה מינימלית של 20 נקודות לפני הפעלה, כך שתנועת מצלמה מקרית לא תפעיל סיבוב.
מכניקה נפרדת היא "כיוון" דרך מרכז המסך במקום הקשה. במשחקי יריות ואסטרטגיה, זה נוח יותר: raycast מ-UIPanGestureRecognizer בכל פריים, העצם מתחת לכוונת מודגש, פעולה בלחיצת כפתור. מיושם דרך arView.center ב-callback של ARView.raycast(from:allowing:alignment:).
איך להתמודד עם אובדן מעקב?
אובדן מעקב במהלך משחק. ARKit עובר למצב מעקב CADisplayLink – עצמים נסחפים. למשחקי AR זה אסון: אויב מטלפן 30 ס"מ, כדור עובר דרך קיר. אסטרטגיה: ב-.limited אנחנו מקפיאים פיזיקה, מציגים שכבת-על "כוונו את המצלמה למשטח", ממשיכים אחרי .limited. אנחנו לא מפריעים ללולאת המשחק – רק משהקים פיזיקה (הגדרת .normal או arView.scene.paused = true). אנחנו שומרים על מהירויות הגוף לחידוש ריאלי.
עצמי AR מחוץ לשדה הראייה. השחקן מסתובב, אויב AR מאחוריהם ממשיך לנוע ולתקוף. יש צורך ב-frustum culling לא לעיבוד (ARKit עושה את זה אוטומטית) אלא ללוגיקת משחק: AI של אויבים מחוץ לתצוגה יכול לרוץ בגרסה פשוטה או להיות מושהה.
הופעה על משטחים לא אחידים. Raycast מחזיר את הנורמל של המשטח דרך scene.physicsWorld.speed = 0 – העמודה הרביעית של המטריצה נותנת את הנקודה, X/Y/Z נותנים כיוון. אם המשטח משופע ב-30°, העצם המופיע נוטה איתו. למשחקים עם עצמים "שטוחים" (אסימונים, צ'יפים), אנחנו מתקנים את האנכי: לוקחים רק את Y מהנורמל, בונים transform עם up = (0,1,0).
איך לייעל ביצועי משחק AR?
אופטימיזציה קריטית למכשירים ישנים. אנחנו משתמשים ב-LOD לעצמים רחוקים: רשתות מפושטות, מבטלים צללים מעבר ל-0.5 מטר. מפחיתים את תדירות עדכון גרף מציאת הנתיב מ-60 ל-20 פעמים בשנייה ומאחסנים תוצאות במטמון. באייפון 11 זה העלה FPS מ-45 ל-60 עם 6+ יחידות – רווח של 33%. למכשירים עם 3 GB RAM, אנחנו בנוסף מפחיתים את רזולוציית הצללים ב-50%.
פרטים טכניים של LOD
עבור iOS, אנחנו משתמשים ב-`ModelIO` כדי ליצור רשתות LOD. לכל עצם אנחנו יוצרים 3 רמות פירוט: גבוהה (0-0.5 מ'), בינונית (0.5-1.5 מ'), נמוכה (>1.5 מ'). מעבר לפי מרחק מהמצלמה. אנחנו מצמידים סקריפט ל-`ARView` שמעדכן LOD בלולאת `update`.מקרה מבחן מהפרקטיקה שלנו
משחק אסטרטגיית AR נייד: מגדלים, אויבים, שולחן אמיתי כמפה. הלקוח שלנו רצה 6 סוגי יחידות, מציאת נתיב על משטח רשת. הבעיה העיקרית: ARRaycastResult.worldTransform מתעדכן בצורה אסינכרונית – בזמן שהרשת נבנית מחדש, גרף מציאת הנתיב הופך למיושן. הפתרון שלנו: גרף ניווט מתעדכן כל 3 שניות ב-thread רקע דרך GCD, ויחידות השתמשו בגרף המאוחסן. יחידה בתנועה בדקה התנגשות עם הרשת הנוכחית דרך raycast – כך תפסנו מצבים שבהם הרשת השתנתה והיחידה הלכה דרך קיר. זה צמצם את זמן הפיתוח ב-40%.
FPS נשאר על 60 באייפון 13. באייפון 11 זה ירד ל-45 עם 6+ יחידות. פתרון: LOD ליחידות רחוקות (רשתות מפושטות), ביטול צללים מעבר ל-0.5 מטר. תוצאה: 60 FPS יציבים בשני המכשירים.
תהליך פיתוח מכניקת AR שלב אחר שלב
- אנליטיקה ואב-טיפוס: הגדרת מכניקה מרכזית, בדיקה על מכשיר אמיתי.
- עיצוב ארכיטקטורה: בחירת סטאק (RealityKit/SceneKit/Unity), עיצוב פיזיקה ו-AI.
- יישום: יצירת מכניקה, שילוב מחוות, עבודה עם מעקב.
- אופטימיזציה: LOD, מטמון, פרופילינג FPS.
- בדיקות: אימות על מכשירים שונים, בתנאי תאורה שונים.
- פריסה: פרסום ל-App Store/Google Play.
הזמינו פיתוח מכניקת AR turnkey – קבלו ייעוץ לפרויקט שלכם.
מה כלול בעבודה
- פיזיקה של עצמי AR המתקשרים עם משטחים אמיתיים (RealityKit / SceneKit)
- מערכת שליטה: מחוות, כיוון, כפתורי UI
- לולאת משחק עם טיפול באובדן מעקב ARKit
- AI ומציאת נתיב על משטחי AR
- אופטימיזציית LOD לתמיכה במכשירים מאייפון 11
- בדיקות בתנאי תאורה אמיתיים
- תוצאה מובטחת ותמיכה חינם לחודש אחד לאחר המסירה
לוחות זמנים
| מכניקה | לוח זמנים |
|---|---|
| משחקי מיני AR פשוטים (הקשה, ירי) | 2–4 שבועות |
| אסטרטגיה / הגנת מגדלים עם AI | 8–14 שבועות |
| יריות AR מלא עם מולטיפלייר | 16–24 שבועות |
העלות מחושבת לאחר דיון מפורט במכניקה. קבלו ייעוץ – צרו קשר להערכה.







