1. סקירה כללית
ARCore הוא מסגרת העבודה של Google ליצירת חוויות במציאות רבודה בסמארטפונים. אפשר להשתמש ב-AR Foundation של Unity כדי ליצור אפליקציות AR בפלטפורמות שונות.
מה תפַתחו
ב-Codelab הזה תבנו משחק פשוט באמצעות AR Foundation. מטרת המשחק היא לאסוף חבילות באמצעות מכונית שאתם שולטים בה באמצעות מכשיר שניתן להחזיק ביד.
אבל זה לא יקרה בעולם וירטואלי לגמרי! תערבבו אטומים פיזיים וביטים דיגיטליים כדי ליצור חוויית משחק חדשה, על ידי יצירת משחק שמבין את הסביבה שבה השחקן נמצא.
בסיום ה-codelab הזה, המשחק שלכם יוכל:
- לזהות מישורים בעולם האמיתי ולצייר עליהם מגרש משחקים.
- הטלת קרניים משדה הראייה של המצלמה וזיהוי נקודות חיתוך עם מישורים.
- התאורה במשחק מגיבה לתנאי התאורה בעולם האמיתי, כדי להוסיף לו מראה אמיתי.

מה תלמדו
- איך מגדירים פרויקט שמשתמש ב-AR Foundation של Unity.
- איך משתמשים ב-
ARPlaneManagerכדי להירשם לתוכניות חדשות. - איך משתמשים ב-
Raycastכדי למצוא נקודות חיתוך עם גיאומטריה וירטואלית - איך משתמשים ב-
ARLightEstimationDataכדי להאיר את הסצנה.
הדרישות
- מכשיר ARCore נתמך שמחובר למחשב הפיתוח באמצעות כבל USB.
- Google Play Services למציאות רבודה גרסה 1.23 ואילך.
- התקנה של Unity Hub או של Unity 2020 LTS.
2. הגדרת סביבת הפיתוח
בשלב הזה תכינו את הסביבה לפיתוח באמצעות AR Foundation של Unity.
מוודאים שהמכשיר תואם ל-AR
חוויות ה-AR במכשירי Android מבוססות על ARCore, שזמין במכשירים שתומכים ב-ARCore. מוודאים שמכשיר הפיתוח תואם ל-AR. אפשרות נוספת היא להשתמש במופע של אמולטור Android שתואם ל-AR שהוגדר בצורה נכונה.
הגדרת ניפוי באגים ב-USB במכשיר
כדי להפעיל אפליקציות לניפוי באגים, צריך להפעיל את האפשרויות למפתחים במכשיר. אם עדיין לא עשיתם זאת, תוכלו לעיין במסמכי התיעוד של Android בנושא הפעלת האפשרויות למפתחים וניפוי באגים ב-USB.
התקנה של Unity (2020.3 LTS)
ב-Workstation, מתקינים את Unity 2020 LTS. ב-codelab הזה מוצגים צילומי מסך של ממשק המשתמש של Unity בגרסה 2020.3 (LTS). יכול להיות שגרסאות אחרות של Unity יפעלו, אבל יכול להיות שיידרשו שלבים נוספים. יכול להיות שהממשק בפועל יהיה שונה מצילומי המסך שמוצגים כאן.
יצירת פרויקט חדש
יוצרים פרויקט חדש באמצעות התבנית Universal Render Pipeline. נותנים לו שם תיאורי ומיקום מתאים, ולוחצים על יצירה.

התקנת המסגרות הנדרשות
אפשר למצוא את AR Foundation של Unity במנהל החבילות של Unity.
- פותחים אותו על ידי לחיצה על Window > Package Manager (חלון > ניהול חבילות).

- בחלון הזה, מתקינים את החבילות שבהן תשתמשו ב-codelab הזה. כדי לראות את הגרסאות העדכניות של המסגרות האלה, מרחיבים את הרשומה שלהן באמצעות הסמל
►. מתקינים את הגרסאות העדכניות של כל אחת מהמסגרות הבאות:- AR Foundation
- ARCore XR Plugin
בסיום התהליך, מנהל החבילות אמור להיראות בערך כך:

התקנת חבילת המתחילים
ב-codelab הזה סיפקנו חבילת התחלה שמכילה רכיבים מוכנים מראש וסקריפטים שיעזרו לכם להשלים חלקים מסוימים ב-codelab במהירות, כדי שתוכלו להתמקד בשימוש ב-AR Foundation.
- כדי להתקין את חבילת המתחילים, פותחים את Assets > Import Package > Custom Package... (נכסים > ייבוא חבילה > חבילה מותאמת אישית...) ופותחים את
starter-package.unitypackage. - בחלון הקופץ, מוודאים שהכול מסומן.
- לוחצים על ייבוא.
שינוי הגדרות הבנייה
מכיוון שהאפליקציה תפעל ב-Android, צריך לשנות את פלטפורמת הבנייה ל-Android:
- פותחים את File > Build Settings (קובץ > הגדרות בנייה).
- בחלונית פלטפורמה, בוחרים באפשרות Android.
- אופציונלי: מפעילים את האפשרויות גרסת פיתוח וניפוי באגים בסקריפט כדי לשמור את מידע על תוצאות ניפוי הבאגים בזמן שהאפליקציה פועלת.
- לוחצים על החלפת פלטפורמה.

שינוי הגדרות הפרויקט
צריך להגדיר את AR Foundation כך שמערכות XR יאותחלו בהפעלה.
- פותחים את Edit > Project Settings... (עריכה > הגדרות הפרויקט...) ולוחצים על הקטע XR Plug-in Management (ניהול פלאגינים של XR).
- בכרטיסייה Android, מפעילים את ARCore.

- בחלונית הימנית, לוחצים על הקטע נגן.
- בכרטיסייה Android, בקטע Other Settings (הגדרות אחרות), מסירים את Vulkan מGraphics APIs (ממשקי API של גרפיקה).

- אפליקציות שנדרש בהן AR ומשתמשות ב-ARCore דורשות רמת API של 24 לפחות. גוללים למטה ומחפשים את האפשרות רמת API מינימלית. מגדירים את רמת ה-API המינימלית ל-24.

הוספת רכיבים נדרשים לסצנה
תבנית Universal Render Pipeline כוללת כמה אובייקטים של משחקים שלא תשתמשו בהם במדריך הזה.
- מחיקה של כל האובייקטים של המשחק ב-
SampleScene.

- הוספה של אובייקטים של AR Foundation. לוחצים לחיצה ימנית בחלונית היררכיה. בתפריט הזה אפשר להוסיף:
- XR > AR Session: האובייקט הזה שולט במחזור החיים של חוויית AR.
- XR > AR Session Origin: האובייקט הזה משנה את הקואורדינטות של AR לקואורדינטות של עולם Unity.
- Light > Directional Light (תאורה > תאורה כיוונית): מספק מקור אור להארת אובייקטים במשחק.
ההיררכיה שלכם צריכה להיראות כך:

- מרחיבים את AR Session Origin שיצרתם בהיררכיה ובוחרים באובייקט AR Camera. בחלון הבדיקה, משנים את התג שלו ל-MainCamera.

הגדרת עיבוד
כדי ש-Unity's Universal Render Pipeline יהיה תואם ל-AR Foundation, צריך לבצע בו שינוי אחד.
- בחלונית Project (פרויקט), עוברים אל Assets > Settings (נכסים > הגדרות) כדי למצוא את הנכס ForwardRenderer.

- בוחרים באפשרות ForwardRenderer.
- בחלונית Inspector, משתמשים באפשרות Add Renderer Feature (הוספת תכונת רכיב עיבוד) כדי להוסיף AR Background Renderer Feature (תכונת רכיב עיבוד של רקע AR). הרכיב הזה יציג את פיד המצלמה בסצנה.

אימות ההגדרה
- מוודאים שהמכשיר מחובר לחשמל ושהאפשרות 'ניפוי באגים ב-ADB' מופעלת.
- לוחצים על קובץ > Build והרצה... האפליקציה תועלה למכשיר ותופעל אחרי ההתקנה.
- פיד המצלמה אמור להופיע במסך המכשיר.
בשלב הבא מתחילים להוסיף פונקציונליות לאפליקציה.
3. זיהוי מטוסים בעולם האמיתי
אחרי שמגדירים סצנה בסיסית, אפשר להתחיל לפתח את המשחק. בשלב הזה, תזהו את המישורים ותציירו אותם בסצנה.
הוספת רכיב ARPlaneManager
ARPlaneManager מזהה ARPlane ויוצר, מעדכן ומסיר אובייקטים של משחקים כשההבנה של הסביבה במכשיר משתנה.
- בחלונית Hierarchy (היררכיה), יוצרים
GameObjectריק. - משנים את השם ל-
Driving Surface Manager. הרכיב הזה יציג מטוסים עד שהשחקן יבחר אחד מהם. - בוחרים את אובייקט המשחק החדש. בחלונית Inspector, לוחצים על Add Component (הוספת רכיב) כדי להוסיף AR Plane Manager (כלי לניהול מישורי AR).

- מגדירים את
ARPlaneManagerעל ידי הגדרת השדהPlane Prefab:- לוחצים על הלחצן לצד
Noneכדי להציג את החלון Select GameObject (בחירת אובייקט GameObject). - לוחצים על הכרטיסייה נכסים ומחפשים את מישור משטח הנסיעה.
- לוחצים על הלחצן לצד

הפריט המוגמר מראש הזה מחבילת המתחילים מספק טקסטורה מחוספסת לרצפה שתשמש כקישוט של המישור.
- משנים את
Detection Modeל-Horizontal. ההגדרה הזו קובעת ש-ARPlaneManagerיספק רק מישורים אופקיים, שמתאימים במיוחד לנהיגה.
הוספת רכיב ARRaycastManager
ARRaycastManager חושף את הפונקציונליות של raycast. בשלב הבא נשתמש באובייקט הזה כדי לספק את אמצעי הבקרה למשתמש.
- מוודאים שהאובייקט שנקרא
Driving Surface Managerמסומן בחלונית Hierarchy. - ב-Inspector, לוחצים על Add Component כדי להוסיף רכיב
ARRaycastManagerלאובייקט המשחק.
אין צורך בהגדרות נוספות לרכיב הזה.
הוספת רכיב DrivingSurfaceManager
DrivingSurfaceManager הוא סקריפט עזר מחבילת Starter שמאפשר לבחור ARPlane. אחרי שבוחרים ARPlane, כל שאר המטוסים מוסתרים והמטוסים החדשים מושבתים.
- מוודאים שהאובייקט שנקרא
Driving Surface Managerמסומן בחלונית Hierarchy. - ב-Inspector, לוחצים על Add Component כדי להוסיף רכיב
DrivingSurfaceManagerלאובייקט המשחק.
אין צורך בהגדרות נוספות לרכיב הזה.
הפעלת האפליקציה
- לוחצים על File > Build And Run... (קובץ > בנייה והפעלה) כדי לבדוק את השינויים.
- מכוונים את המכשיר אל משטח אופקי בעולם האמיתי ומזיזים את המכשיר כדי לשפר את ההבנה של ARCore לגבי העולם.

- כש-ARCore מזהה מישור, אמור להופיע טקסטורה של אדמה שמכסה את פני השטח בעולם האמיתי. הפונקציה
ARPlaneManagerיוצרת מופע שלPlane Prefabלכל מישור שזוהה. ל-PrefabDriving Surface Planeיש רכיבARPlaneMeshVisualizerשיוצר רשת עבורARPlaneנתון.
בשלב הבא, תשתמשו במישור שזוהה כשדה משחק.
4. ביצוע בדיקה של מיקום המצביע במישורים שזוהו
בשלב הקודם תכנתתם אפליקציה שיכולה לזהות מטוסים. המטוסים האלה משתקפים בסצנה של המשחק. עכשיו תוסיפו אינטראקטיביות למשטחים האלה על ידי יצירת כוונת ומכונית שתנוע על פני המשטח שזוהה.
יצירת כוונת
השליטה באפליקציה הזו מתבצעת על ידי הצבעה של הטלפון על משטח. כדי לספק משוב חזותי ברור לגבי המיקום המיועד, תשתמשו בכוונת.

כדי שהכוונת הזו תישאר על מישור AR, צריך להשתמש בבדיקה של מיקום המצביע. בדיקה של מיקום המצביע היא טכניקה לחישוב נקודות חיתוך כשמטילים קרן בכיוון מסוים. תשתמשו בבדיקה של מיקום המצביע כדי לזהות נקודת חיתוך בכיוון שדה הראייה של המצלמה.

הוספת הכוונת
- בחלונית Project (פרויקט) בחלק התחתון של המסך, עוברים אל Assets > Starter Package (נכסים > חבילת התחלה).
- ממקמים את Reticle Prefab בסצנה על ידי גרירה שלו אל Hierarchy pane של הפרויקט.
- בוחרים את הכוונת בהיררכיה.
- בכלי לבדיקת רכיבים, לוחצים על Add Component (הוספת רכיב). מוסיפים את הסקריפט
ReticleBehaviourמהחבילה למתחילים. הסקריפט הזה מכיל קוד boilerplate לשליטה בכוונת. - הסקריפט
ReticleBehaviourתלוי ב-Driving Surface Managerשיצרתם קודם, לכן צריך להוסיף את התלות על ידי לחיצה על בוררDriving Surface Manager. לוחצים על הכרטיסייה סצנה ובוחרים אתDriving Surface Manager.

עריכת ReticleBehaviour
הסקריפט ReticleBehavior ימקם את הכוונת במישור שנמצא במרכז אזור התצוגה של המכשיר.
- פותחים את הסקריפט
ReticleBehaviour.csבאמצעות לחיצה כפולה על השדהScript. - קובעים את מרכז המסך באמצעות התכונה 'מצלמה'
ViewToScreenPoint. עורכים את השיטהUpdate()כדי להוסיף את הפרטים הבאים:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- משתמשים בנקודה הזו כדי לבצע raycast. מוסיפים את הפרטים הבאים:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
המשתנה hits יכיל ARRaycastHits שמתארים נקודות בפריטים שאפשר לעקוב אחריהם, שמוצגים בחיתוך עם ray.
- כדי לקבוע את נקודת העניין של החיתוך, שולחים שאילתה לרשימה
hits. תנו עדיפות למטוס הנעול שמופיע ב-DrivingSurfaceManager, ואם הוא לא קיים, השתמשו במטוס הראשון שפגעתם בו. מוסיפים את הטקסט הבא לסוף הקובץUpdate():
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
// If you don't have a locked plane already...
var lockedPlane = DrivingSurfaceManager.LockedPlane;
hit = lockedPlane == null
// ... use the first hit in `hits`.
? hits[0]
// Otherwise use the locked plane, if it's there.
: hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
- אם התוצאה מופיעה ב-
hit, מעבירים את הטרנספורמציה שלGameObjectלמיקום ההיט.
if (hit.HasValue)
{
CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
// Move this reticle to the location of the hit.
transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);
בדיקת הכוונת
- לוחצים על File > Build And Run... (קובץ > בנייה והפעלה) כדי לבדוק את השינויים.
- כשמכוונים את המכשיר למטוס, אמורה להופיע כוונת שעוקבת אחרי התנועות של המצלמה.

יצירת רכב
השחקן ישלוט במכונית צעצוע שתנוע לכיוון המיקום של הכוונת. חבילת המתחילים כוללת מודל והתנהגות של המכונית הזו.
הוספת CarManager לסצנה
- בהיררכיה, יוצרים
GameObjectחדש וריק. - משנים את השם ל-
Car Spawner. - בוחרים את האובייקט שיצרתם. בחלונית Hierarchy, לוחצים על Add Component (הוספת רכיב) כדי להוסיף את הרכיב
CarManager. - מגדירים את התלויות של
CarManagerעל ידי לחיצה על הכלי לבחירה של כל שדה:- Car Prefab: ב-Assets, בוחרים באפשרות Car Prefab.
- כוונת: בסצנה, בוחרים באפשרות Reticle Prefab.
- המרכז לניהול משטחי נהיגה: בקטע Scene (סצנה), בוחרים באפשרות Driving Surface Manager (המרכז לניהול משטחי נהיגה).
ההתנהגות הזו של CarManager יוצרת מכונית צעצוע במישור שבו נמצא הכוונת. אם רוצים, אפשר לעיין בסקריפט CarBehaviour כדי להבין איך המכונית מתוכנתת.
נהיגת מבחן
- לוחצים על File > Build And Run (קובץ > בנייה והרצה) כדי לבדוק את השינויים.
- כשמקישים על מטוס, אמורה להופיע מכונית קטנה במיקום הזה. המכונית תעקוב אחרי הכוונת.
הוספת רכיב המשחק
עכשיו שהשחקן יכול לשלוט בישות בסצנה, צריך לתת לו יעד לנסוע אליו.
- יוצרים
GameObjectחדש וריק בהיררכיה. - משנים את השם ל-
Package Spawner. - בוחרים את האובייקט שיצרתם. בחלונית Hierarchy, לוחצים על Add Component כדי להוסיף את הרכיב
PackageSpawner. - מגדירים את התלויות של
PackageSpawnerעל ידי לחיצה על הכלי לבחירה של כל שדה:- Package Prefab: ב-Assets, בוחרים באפשרות Package Prefab.
- המרכז לניהול משטחי נהיגה בסצנה, בוחרים באפשרות המרכז לניהול משטחי נהיגה.
ההתנהגות הזו של PackageSpawner יוצרת חבילה חדשה במיקום אקראי ב-ARPlane נעול, אם עדיין אין חבילה.
בדיקת המשחק
- לוחצים על File > Build And Run (קובץ > בנייה והרצה) כדי לבדוק את השינויים. 2. אחרי שיוצרים מכונית, אמורה להופיע חבילה.
- נוסעים ברכב אל החבילה.
- הוא יופיע שוב במיקום אקראי.

5. הגדרת הערכת התאורה
אחרי שסיימתם ליצור את המשחק הבסיסי, תוכלו להוסיף לסצנת ה-AR מגע של מציאות. בשלב הזה, תשתמשו ב-Lighting Estimation API של ARCore כדי לזהות את התאורה שקיימת בעולם האמיתי על סמך פריימים נכנסים מהמצלמה. המידע הזה ישמש להתאמת התאורה בסצנה לתאורה בעולם האמיתי.
הפעלת הערכת תאורה
- בקטע Hierarchy, מרחיבים את AR Session Origin ובוחרים באובייקט AR Camera.
- ב-Inspector, מרחיבים את הסקריפט AR Camera Manager.
- משנים את השדה Lighting Estimation (הערכת תאורה) לEverything (הכול).

שינוי התאורה הכיוונית
- בהיררכיה, בוחרים באובייקט Directional Light.
- מוסיפים את הרכיב
LightEstimation. הרכיב הזה מחבילת Starter מספק קוד boilerplate להרשמה לשינויים בתאורה. - בפונקציה
FrameReceived(), מוסיפים:
ARLightEstimationData lightEstimation = args.lightEstimation;
if (lightEstimation.averageBrightness.HasValue)
Light.intensity = lightEstimation.averageBrightness.Value;
if (lightEstimation.averageColorTemperature.HasValue)
Light.colorTemperature = lightEstimation.averageColorTemperature.Value;
if (lightEstimation.colorCorrection.HasValue)
Light.color = lightEstimation.colorCorrection.Value;
if (lightEstimation.mainLightDirection.HasValue)
Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);
if (lightEstimation.mainLightColor.HasValue)
Light.color = lightEstimation.mainLightColor.Value;
if (lightEstimation.mainLightIntensityLumens.HasValue)
Light.intensity = lightEstimation.averageMainLightBrightness.Value;
if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
RenderSettings.ambientMode = AmbientMode.Skybox;
RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}
בדיקת השינויים
- לוחצים על File > Build And Run (קובץ > בנייה והרצה) כדי לבדוק את השינויים.
- כשמסתכלים על האובייקטים בסצנה, אפשר לראות שהצבע שלהם משתנה בהתאם לתאורה בסביבה.
- אם אפשר, כדאי לשנות את התאורה. לדוגמה, אפשר לנסות לכבות את האורות בחדר שבו אתם נמצאים. התאורה של האובייקטים אמורה להשתנות בהתאם לשינוי בתאורה בעולם האמיתי.

6. סיכום
מזל טוב! הגעתם לסוף ה-Codelab הזה בנושא Unity AR Foundation.
מה נכלל
- איך מגדירים פרויקט בסיסי באמצעות AR Foundation ו-Universal Rendering Pipeline של Unity.
- איך משתמשים ב-
ARPlaneManagerכדי להירשם לתוכניות חדשות. - איך משתמשים ב-
Raycastכדי למצוא נקודות חיתוך עם גיאומטריה וירטואלית. - איך משתמשים ב-
ARLightEstimationDataכדי להאיר את הסצנה.
השלבים הבאים
- כדאי לעיין בדוגמאות של AR Foundation ב-Unity.
- מקורות מידע בנושא AR Foundation
- אפשר לעיין במאמרי העזרה של Google בנושא ARCore Extensions for Unity's AR Foundation.
משימות בונוס
אם רוצים להרחיב את המשחק שיצרתם כאן, הנה כמה רעיונות שיכולים לעזור:
- כדי להוסיף מונה ניקוד למשחק, משנים את
TextMeshProכש-PackageManagerיוצר חבילה חדשה. - כדי לראות את נתוני הביצועים בזמן שהמשחק פועל, מפעילים את שכבת העל של הביצועים.
- כדאי להשתמש בהטלות קרניים מתמשכות כדי למקם קודם אובייקטים חדשים בסצנה. כשמטוס מזוהה באזור הזה, האובייקט מתעדכן ומוצמד למישור הזה.