עבדנו על פרויקטים שבהם מפתחים ניסו להטמיע AR ישירות דרך ARKit ו-ARCore, רק כדי לסיים עם קוד שרץ על חצי מהמכשירים. AR Foundation (Unity) מאפשר פיתוח אפליקציות AR חוצות-פלטפורמות עם בסיס קוד אחד ושתי buildים. אבל זה לא הופך את ערכות התכונות לזהות—חסימת LiDAR עובדת רק במכשירי iOS Pro, ו-Depth API מבוסס ML הוא בלעדי לאנדרואיד בשבבים ללא ToF. כתיבת AR Foundation ללא הבנת ההבדלים הללו מובילה לחריגות זמן ריצה בחצי מהמכשירים. הניסיון שלנו מראה שבדיקת יכולות דרך descriptor ויישום מנגנוני fallback מונעת 90% מהקריסות. אנו מציעים פתרון מקיף—מביקורת ועד פרסום—עם אבטחת איכות ותמיכה בכל שלב. צרו קשר לייעוץ על הפרויקט שלכם. שילוב AR Foundation מתחיל ב-$1,500 עבור זיהוי מישורים בסיסי והצבת אובייקטים בשתי הפלטפורמות, וחוסך עד $10,000 בזמן פיתוח בהשוואה ליישום native.
AR Foundation פותר אתגרים חוצי-פלטפורמות
גרסת AR Foundation 6.x (Unity LTS העדכני) מכסה את כל התכונות המרכזיות של שתי הפלטפורמות: זיהוי מישורים, מעקב תמונות, מעקב פנים, סיווג mesh, ענני נקודות. עם זאת, היישום הבסיסי שונה, וחלק מהדגלים עובדים רק אם ה-backend של הפלטפורמה תומך בהם. להלן קוד אימות טיפוסי:
[SerializeField] AROcclusionManager occlusionManager;
void Start()
{
if (occlusionManager.descriptor?.supportsEnvironmentDepthImage == true)
{
occlusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Fastest;
occlusionManager.requestedOcclusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion;
}
else
{
occlusionManager.enabled = false;
}
}ללא בדיקת [SerializeField] AROcclusionManager occlusionManager; void Start() { if (occlusionManager.descriptor?.supportsEnvironmentDepthImage == true) { occlusionManager.requestedEnvironmentDepthMode = EnvironmentDepthMode.Fastest; occlusionManager.requestedOcclusionPreferenceMode = OcclusionPreferenceMode.PreferEnvironmentOcclusion; } else { occlusionManager.enabled = false; } } , מקבלים descriptor ב-Pixel 5 (ללא ToF). המהנדסים שלנו תמיד כוללים בדיקות כאלה.
ארכיטקטורת הסצנה קריטית ליציבות
AR Foundation בנוי על רכיבים המקושרים ל-NotSupportedException ו-ARSession:
-
XROrigin— זיהוי ומעקב מישורים -
ARPlaneManager— raycasting נגד גיאומטריה במעקב -
ARRaycastManager— מעקב מבוסס סמנים -
ARTrackedImageManager— ניהול מחזור חיים של עוגנים
הצבת אובייקטים נכונה באמצעות הקשה עם ARAnchorManager:
[SerializeField] ARRaycastManager raycastManager;
[SerializeField] ARAnchorManager anchorManager;
[SerializeField] GameObject prefabToPlace;
private List<ARRaycastHit> hits = new List<ARRaycastHit>();
void Update()
{
if (Input.touchCount == 0) return;
var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began) return;
if (raycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon))
{
var hitPose = hits[0].pose;
var anchor = anchorManager.AttachAnchor(
hits[0].trackable as ARPlane,
hitPose
);
Instantiate(prefabToPlace, anchor.transform);
}
}ARRaycastManager קושר את האובייקט למישור ספציפי—אם המישור מעדכן את הגיאומטריה שלו (ARKit משכלל צורות ללא הרף), האובייקט נשאר מעוגן. ללא הצמדת עוגן, האובייקט נסחף.
מעקב תמונות: ספריית ייחוס
תמונות מקובצות ל-[SerializeField] ARRaycastManager raycastManager; [SerializeField] ARAnchorManager anchorManager; [SerializeField] GameObject prefabToPlace; private List<ARRaycastHit> hits = new List<ARRaycastHit>(); void Update() { if (Input.touchCount == 0) return; var touch = Input.GetTouch(0); if (touch.phase != TouchPhase.Began) return; if (raycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon)) { var hitPose = hits[0].pose; var anchor = anchorManager.AttachAnchor( hits[0].trackable as ARPlane, hitPose ); Instantiate(prefabToPlace, anchor.transform); } } דרך Unity Editor. מגבלות: ARKit מאפשר עד 100 תמונות בספרייה עם מעקב מקביל של עד 4. ל-ARCore יש כמעט בלתי מוגבל תמונות, אבל עוקב בו-זמנית עד 20 לכל היותר.
[SerializeField] ARTrackedImageManager trackedImageManager;
void OnEnable() => trackedImageManager.trackablesChanged.AddListener(OnImageChanged);
void OnDisable() => trackedImageManager.trackablesChanged.RemoveListener(OnImageChanged);
void OnImageChanged(ARTrackablesChangedEventArgs<ARTrackedImage> args)
{
foreach (var added in args.added)
{
SpawnContent(added.referenceImage.name, added.transform);
}
foreach (var updated in args.updated)
{
SetVisible(updated.referenceImage.name, updated.trackingState == TrackingState.Tracking);
}
} ביצועים: Unity + AR = המשך בזהירות
Unity אינה הסביבה הקלה ביותר עבור AR. בעיות טיפוסיות:
השהיות של אוסף זבל (Garbage collector). ה-GC של .NET/Mono עוצר את ה-thread הראשי. בסשן AR של 60 FPS, השהיה של 16ms משמעותה פריים שנפל ואובייקטים רועדים. פתרון: השתמשו ב-AttachAnchor שהוקצו מראש (העבירו ל-XRReferenceImageLibrary), הימנעו מ-[SerializeField] ARTrackedImageManager trackedImageManager; void OnEnable() => trackedImageManager.trackablesChanged.AddListener(OnImageChanged); void OnDisable() => trackedImageManager.trackablesChanged.RemoveListener(OnImageChanged); void OnImageChanged(ARTrackablesChangedEventArgs<ARTrackedImage> args) { foreach (var added in args.added) { SpawnContent(added.referenceImage.name, added.transform); } foreach (var updated in args.updated) { SetVisible(updated.referenceImage.name, updated.trackingState == TrackingState.Tracking); } } בתוך List<T>.
עומס DrawCall. כל אובייקט AR ללא batching הוא draw call נפרד. השתמשו ב-GPU Instancing בחומרים ו-Static Batching עבור אובייקטים שלא זזים. באנדרואיד, העדיפו backend של Vulkan על פני OpenGLES להפחתת עומס CPU.
דחיסת טקסטורות. ASTC ל-iOS, ETC2 לאנדרואיד. בפרויקט AR Foundation המכוון לשתי הפלטפורמות, הגדירו Override for Platform בהגדרות ייבוא הטקסטורה. ASTC באנדרואיד דורש תמיכת GPU (זמין בכל המכשירים התואמים ARCore).
טיפים לאופטימיזציית ביצועים
| בעיה | פתרון | |---------|----------| | השהיות GC | List שהוקצה מראש, הימנעו מ-new ב-Update | | עומס DrawCall | GPU Instancing, Static Batching, Vulkan באנדרואיד | | דחיסת טקסטורות | ASTC ל-iOS, ETC2 לאנדרואיד, Override לפלטפורמה |Build ופרסום
AR Foundation דורש הגדרות Player ספציפיות:
- iOS:
Raycastחובה (דרישת App Store), יכולתnew - אנדרואיד: הרשאת
Update()ב-AndroidManifest,Camera Usage Descriptionב-dependencies
ARCore בודק AR Services בעת ההפעלה—עליכם לטפל ב-ARKit. בלעדיו, האפליקציה קורסת בשקט במכשירים לא תואמים.
מה כלול בעבודה שלנו
תוצרים כוללים: ניתוח דרישות ובחירת מחסנית טכנולוגית (Unity LTS, AR Foundation 6.x, StoreKit 2 / Billing 6 לרכישות), יישום עם בדיקות יכולות מכשיר ולוגיקת fallback, אופטימיזציית ביצועים (GC, batching, טקסטורות), הגדרת build ופרסום (App Store Connect / Google Play Console), תיעוד API ותצורה, הדרכת צוות ותמיכה של שבועיים לאחר השחרור.
הצוות שלנו מורכב ממפתחי Unity מוסמכים עם ניסיון של 10+ שנים ומעל 50 פרויקטי AR שסופקו. קבלו ייעוץ לפרויקט שלכם—כתבו לנו.
לוחות זמנים
שילוב AR Foundation בסיסי עם זיהוי מישורים והצבת אובייקטים (iOS + אנדרואיד): מ-5 ימים. AR מבוסס סמנים עם ספריית תמונות ואנימציות מותאמות: 1–2 שבועות. פתרון מלא עם חסימה, מעקב פנים ופרסום לשתי הפלטפורמות: 3–6 שבועות.
טעויות נפוצות בשילוב AR Foundation שיש להימנע מהן
- אי-בדיקת descriptor — קריסה במכשירים ללא ToF.
- העלאת טקסטורות ASTC לאנדרואיד ללא תמיכה — טקסטורות שחורות.
- שימוש ב-
CAMERAבתוךcom.google.ar.core— מיקרו-הקפאות כל 10–20 שניות. - אי-טיפול ב-
ARUnavailableException— קריסה שקטה במכשירי אנדרואיד ישנים. - חסר
new— דחייה ב-App Store.
השוואת AR Foundation עם גישות אחרות
| גישה | זמן פיתוח (iOS + אנדרואיד) | בסיס קוד | ביצועים |
|---|---|---|---|
| ARKit + ARCore ישיר | 2–3 שבועות | 2 בסיסי קוד | מקסימליים |
| AR Foundation | 5–14 ימים | C# יחיד | 95–98% מ-native |
| Vuforia | 7–10 ימים | C# יחיד + רישיון | 80–90% |
AR Foundation מנצח אינטגרציה ישירה בכך שהוא מקצר את זמן הפיתוח ב-40–50% עם אובדן ביצועים מינימלי. צרו קשר להערכת עלויות השילוב שלכם—נבחן את המשימה ונציע פתרון.
כיצד לשלב AR Foundation (שלב אחר שלב)
- הקימו פרויקט Unity עם חבילת AR Foundation.
- הגדירו XR Plug-in Management עבור ARCore ו-ARKit.
- הוסיפו AR Session ו-XR Origin לסצנה.
- יישמו זיהוי מישורים עם AR Plane Manager.
- הוסיפו raycasting להצבת אובייקטים.
- בנו ובדקו על מכשירים.







