UI ב-VR אינו מסך שהמשתמש רואה מולו. מדובר באובייקטים במרחב שהמשתמש מקיים איתם אינטראקציה באמצעות ידיים או קרניים. המהנדסים שלנו עם ניסיון של 8+ שנים בפיתוח משחקים מטפלים בזה במתכונת turnkey: מאב-טיפוס ועד פריסה סופית. ה-Canvas המוכר ב-Screen Space לא יעבוד. World Space Canvas הוא נקודת ההתחלה, אבל שם מתחילים האתגרים.
טעות נפוצה: לוקחים UI של משחק דו-ממדי, מחליפים את ה-Canvas ל-World Space, ממקמים אותו מול השחקן — ומקבלים פאנל שהוא או קרוב מדי (לא נוח לקריאה ב-VR במרחק 30 ס"מ), או רחוק מדי, או לא מגיב לבקרים. אנחנו נבחן את הפרויקט שלכם — צרו קשר לייעוץ.
למה Canvas רגיל ב-Screen Space לא עובד ב-VR
Screen Space Canvas קשור למסך. ב-VR, הוא לא מתחשב בעומק — טקסט וכפתורים מונחים על הסצנה, מה שגורם לקונפליקט בין accommodation ל-convergence. זה מוביל לעייפות מהירה וסחרחורת. World Space Canvas ממקם את ה-UI בקואורדינטות עולם אמיתיות: אפשר להתקרב, להתרחק או להסתכל סביב הפאנל.
מרחק וגודל זוויתי של אלמנטים
ב-VR, הכל נמדד במעלות זוויתיות, לא בפיקסלים או מטרים. אזור הקריאה הנוח הוא 1.5–2 מטר מעיני המשתמש. במרחק הזה, הגופן צריך לתפוס לפחות 0.5° משדה הראייה לקריאה בטוחה — זה בערך 1.5 ס"מ גובה תו במרחק 2 מ'.
כפתורים דורשים גדלים גדולים עוד יותר ללחיצת קרן אמינה: לפחות 3×3 ס"מ פיזית במרחק 2 מטר — זה 0.86°. אלמנטים קטנים של UI שעובדים מצוין על מסך הופכים לבלתי שמישים ב-VR.
יש למקם את הממשק ב"אזור הנוחות" — אופקית בתוך ±35° מכיוון המבט, אנכית בתוך ±15°. פאנל שמוצב בצד או מתחת דורש סיבוב ראש מתמיד וגורם לעייפות.
איך להגדיר נכון את XR Interaction Toolkit עבור UI
XR Interaction Toolkit (XRI) הוא התקן לאינטראקציות VR ב-Unity. עבור UI, הוא מספק TrackedDeviceGraphicRaycaster (תחליף ל-GraphicRaycaster עבור World Space Canvas) ו-XR Ray Interactor על הבקר. בפרויקטים שלנו, אנו משתמשים ב-XRI גרסה 2.5+ לתמיכה בגדלים זוויתיים קבועים.
הגדרה בסיסית: Canvas → הוסיפו TrackedDeviceGraphicRaycaster, הסירו את GraphicRaycaster ברירת המחדל. על הבקר — XR Ray Interactor עם LineType = StraightLine או ProjectileLine למראה אורגני יותר. UI Press Threshold — רגישות ה"לחיצה" עם הקרן, בדרך כלל 0.1–0.2 לאינטראקציה מבוססת Trigger.
בעיה עם EventSystem ב-XRI: StandaloneInputModule ברירת המחדל מתנגש עם XRUIInputModule. הסצנה צריכה להכיל רק EventSystem אחד עם XRUIInputModule. בעת ייבוא חבילת XRI, זה לפעמים מוגדר אוטומטית, אבל בעבודה עם מספר canvases, עלולים להיווצר קונפליקטים — במיוחד אם חלק מה-UI נוצר לפני שהוספו XRI. אנו מבטיחים הגדרה נכונה של כל מודולי הקלט.
World Space Canvas ורזולוציית טקסטורה
World Space Canvas מעובד בקואורדינטות עולם דרך CanvasScaler עם Scale Factor. רזולוציית טקסטורת ה-Canvas תלויה בגודל הפיזי של Canvas × Reference Pixels Per Unit. כברירת מחדל, Reference Pixels Per Unit = 100 — עבור Canvas בגודל 1×0.5 מ', זה 100×50 יחידות לוגיות. בעיבוד ב-VR, זה ייראה מטושטש.
הגדרה נכונה: CanvasScaler → Scale With Screen Size לא ישים עבור World Space. השתמשו ב-Constant Physical Size עם Physical Unit = Centimeters — זה נותן גדלי אלמנטים צפויים שאינם תלויים במידות ה-Canvas. עבדו עם טקסט באמצעות TextMeshPro — עיבוד ה-distance field שלו טוב משמעותית מ-Unity Text הרגיל כשמשנים קנה מידה במרחב.
בנוסף: עבור World Space Canvas ב-VR, הקפידו להגדיר Pixel Perfect = false (הוא שובר עיבוד מרחבי) ובדקו Dynamic Pixels Per Unit ב-CanvasScaler — עבור VR, ערך של 2–4 נדרש בדרך כלל לטקסט חד.
ממשק אמה: דפוס "שעון חכם"
אחד הדפוסים המאומצים ביותר ב-VR UI הוא ממשק המחובר לאמה של היד הלא-דומיננטית. השחקן מרים את יד שמאל, מסובב את כף היד כלפי עצמו — פאנל מופיע עם מלאי, מפה או הגדרות.
יישום: Canvas כאובייקט ילד של LeftHandController עם offset וסיבוב מקומיים. הפעלה דרך זיהוי Palm Up: השתמשו ב-Vector3.Dot(leftHand.up, Camera.main.transform.forward) — כשהערך חוצה סף (~0.7), היד פונה לפנים, הציגו את ה-UI.
חשוב: ה-UI צריך להופיע בצורה חלקה (Lerp של alpha + scale במשך 0.15–0.2 שניות); הופעה מיידית של פאנל ממש מול העיניים היא מטלטלת. וזה לא צריך להיות מופעל בטעות במהלך תנועות קרב — יש צורך בסף מינימלי של זמן החזקת תנוחה (0.3–0.5 שניות).
משוב הפטי ואישור חזותי
ב-VR, אין צליל לחיצת עכבר ואין לחיצה פיזית על כפתור. ללא משוב, השחקן לא יודע אם כיוון את הקרן לכפתור ולחץ עליו.
סט מינימלי: מצב hover חזותי (הכפתור משנה צבע כשהקרן פוגעת בו), מצב לחיצה חזותי (הכפתור "נלחץ" — קנה מידה בציר Z ב-0.05–0.1 יחידות), פולס הפטי בלחיצה דרך XRBaseController.SendHapticImpulse(0.3f, 0.05f). שלוש מאיות השנייה של רטט קל מספיקות לאישור. ללא הפטיקה, כפתורים ב-VR מרגישים "מתים".
מה כלול בעבודה
| שלב | תוצאה |
|---|---|
| ניתוח סצנה ודרישות | מסמך עם המלצות למיקום UI |
| אב-טיפוס אינטראקציה | אב-טיפוס עובד עם אינטראקציה בסיסית |
| שילוב XRI והגדרת EventSystem | קרניים וכפתורים שעובדים נכון |
| הגדרת משוב הפטי ואנימציה | כפתורים עם משוב חזותי ומישושי |
| אופטימיזציה של Draw call ו-batching | UI בתוך תקציב FPS למכשירי היעד |
| בדיקות על משקפי יעד | דוח ותיקוני באגים |
| תיעוד סופי | הוראות שילוב ותמיכה |
לוח זמנים משוער
| סוג ממשק | לוח זמנים |
|---|---|
| פאנל World Space בסיסי (Ray Interactor) | 3–5 ימים |
| סט רכיבי UI (תפריט, מלאי, HUD) | 1–3 שבועות |
| ממשק מורכב (אמה, מחוות, אזורים) | 3–6 שבועות |
העלות מחושבת באופן אישי לאחר בחינת עיצובי הפריסה ותרחישי האינטראקציה. קבלו ייעוץ — צרו קשר, נבחן את הפרויקט שלכם תוך 2 ימי עסקים.





