ניפוי באגים בתהליך הבנייה, ההתקנה וההפעלה של המשחק

מבוא

במדריך הבא מוסבר איך לנפות באגים בתהליך הקימפול וה-build של משחקי Unity באמצעות Firebase SDK ל-Unity. הוא מתאר איך לחקור ולפתור הרבה מהבעיות הנפוצות שאתם עלולים להיתקל בהן בזמן ההגדרה והפיתוח של המשחק לפלטפורמה חדשה או אחרי עדכון. השגיאות מסודרות לפי השלב בתהליך שבו הן עלולות להתרחש. צריך לעיין בהן לפי הסדר ולפעול בהתאם לפתרון של כל אחת מהן.

בנוסף למסמך הזה, מומלץ לעיין בשאלות הנפוצות בנושא Firebase ל-Unity כדי לקבל מידע נוסף.

בעיות בקימפול של מצב Play

הסוג הראשון של בעיות ב-build יכול להתרחש במהלך הבדיקה בכלי העריכה, לפני שמנסים להתחיל build לנייד. הקטע הזה עוסק בכל השגיאות ב-Firebase שמתרחשות לפני מצב Play ובמהלכו.

כשהמערכת של Unity מופעלת או מזהה שינויים ביחסי תלות, בקוד או בנכסים אחרים, היא מנסה לבנות מחדש את הפרויקט. אם הפרויקט לא יכול לעבור קומפילציה באותו זמן, העורך יתעד שגיאות קומפילציה במסוף. אם תנסו להיכנס למצב Play, תקבלו חלון קופץ עם שגיאה בכרטיסייה Scene של Unity עם הכיתוב All compiler errors have to be fixed before you can enter playmode!.

חסרים סוגים, מחלקות, שיטות וחברים

הרבה בעיות ב-Firebase נגרמות בגלל חוסר היכולת של העורך והקומפיילר למצוא את הסוגים, המחלקות, השיטות והחברים הדרושים. התסמינים הנפוצים של הבעיה הזו הם וריאציות של ההודעות הבאות:

The type or namespace name ‘<CLASS OR NAMESPACE NAME>' could not be found. Are you missing a using directive or an assembly reference?

The type or namespace name <TYPE OR NAMESPACE NAME> does not exist in the namespace ‘Firebase<.OPTIONAL NESTED NAMESPACE NAME PATH>' (are you missing an assembly reference?)

‘<CLASS NAME>' does not contain a definition for ‘<MEMBER VARIABLE OR METHOD NAME>'

השלבים לפתרון הבעיה:
  1. אם אתם משתמשים במחלקות או בשיטות של Firebase בקוד, ודאו שהן זמינות על ידי שימוש בהוראות using הנכונות למוצרי Firebase הספציפיים שאתם צריכים.

    1. דוגמאות מ-MechaHamster: Level Up With Firebase Edition:
      1. using Firebase.RemoteConfig;
      2. using Firebase.Crashlytics;
  2. מוודאים שייבאתם את חבילות Firebase המתאימות:

    1. כדי לייבא את החבילות המתאימות:
      1. מוסיפים את Firebase Unity SDK כ-.unitypackage או
      2. בודקים את אחת מהאפשרויות החלופיות באפשרויות נוספות להתקנת Unity ופועלים לפי ההוראות.
    2. חשוב לוודא שכל מוצר של Firebase בפרויקט ו-EDM4U:
      • הגרסה שלהם זהה
      • הותקנו כ-.unitypackage בלבד או רק דרך Unity Package Manager.
  3. אם ייבאתם את Firebase Unity SDK לפני גרסה 10.0.0 כקובצי .unitypackage, ארכיון ה-ZIP של Firebase Unity SDK מכיל חבילות לתמיכה גם ב-‎ .NET 3.x וגם ב-‎ .NET 4.x. חשוב לוודא שכללתם בפרויקט רק את רמת ‎ .NET Framework התואמת:

    1. במאמר הוספת Firebase לפרויקט ב-Unity מוסבר על התאימות בין גרסאות של Unity Editor לבין רמות של .NET Frameworks.
    2. אם ייבאתם בטעות את חבילות Firebase ברמה הלא נכונה של .NET Framework, או אם אתם צריכים לעבור משימוש ב-.unitypackage לאחת מהאפשרויות הנוספות להתקנת Unity, הדרך הכי נקייה היא להסיר את כל חבילות Firebase באמצעות השיטות שמוזכרות בקטע הזה בנושא העברה, ואז לייבא מחדש את כל חבילות Firebase.
  4. חשוב לוודא שהעורך בונה מחדש את הפרויקט, ושהניסיונות להפעיל את המשחק משקפים את המצב העדכני ביותר של הפרויקט:

    1. כברירת מחדל, עורך Unity מוגדר לבנות מחדש בכל פעם שמזוהים שינויים בנכסים או בהגדרות.
    2. יכול להיות שהפונקציונליות הזו הושבתה ושה-Unity Editor מוגדר לרענון/קימפול מחדש באופן ידני. במקרה כזה, כדאי לבדוק את הנושא ולנסות לרענן את הנתונים באופן ידני.

שגיאות זמן ריצה במצב Play Mode

אם המשחק מתחיל, אבל נתקל בבעיות ב-Firebase בזמן ההפעלה, נסו את הפעולות הבאות:

חשוב לוודא שאישרתם את החבילות של Firebase בקטע "אבטחה ופרטיות" ב-Mac OS

אם כשאתם מפעילים את המשחק בעורך ב-Mac OS, מוצגת תיבת דו-שיח עם ההודעה "לא ניתן לפתוח את FirebaseCppApp-<version>.bundle כי לא ניתן לאמת את המפתח", אתם צריכים לאשר את קובץ החבילה הספציפי הזה בתפריט "אבטחה ופרטיות " ב-Mac.

כדי לעשות את זה, לוחצים על סמל Apple > העדפות המערכת > אבטחה ופרטיות.

בתפריט האבטחה, בערך באמצע הדף, יש קטע שבו כתוב "השימוש ב-"FirebaseCppApp-<version>.bundle" נחסם כי הוא לא ממפתח מזוהה".

לוחצים על הכפתור בכל זאת לאשר.

c35166e224cce720.png

חוזרים ל-Unity ולוחצים שוב על Play (הפעלה).

לאחר מכן תופיע אזהרה דומה לאזהרה הראשונה:

5ad9ddb0d3a52892.png

לוחצים על פתיחה והתוכנה תמשיך לפעול. לא תתבקשו שוב לאשר את הקובץ הספציפי הזה.

צריך לוודא שהפרויקט מכיל קובצי תצורה תקינים ומשתמש בהם

  1. מוודאים שהגדרות ה-build מוגדרות ליעד הרצוי (iOS או Android) בקטע File > Build Settings. לדיון מקיף יותר, קראו את המסמכים בנושא הגדרות ה-Build של Unity.
  2. מורידים את קובץ התצורה של האפליקציה (google-services.json ל-Android או GoogleService-Info.plist ל-iOS) ואת יעד ה-build ממסוף Firebase בקטע הגדרות הפרויקט > האפליקציות שלך: אם כבר יש לכם את הקבצים האלה, מחקו אותם מהפרויקט והחליפו אותם בגרסה העדכנית ביותר. ודאו שהם מאויתים בדיוק כמו שמוצג למעלה, בלי "(1)" או מספרים אחרים שמצורפים לשמות הקבצים.
  3. אם הקונסולה מכילה הודעה לגבי קבצים ב-Assets/StreamingAssets/, צריך לוודא שאין הודעות בקונסולה שאומרות ש-Unity לא הצליחה לערוך קבצים שם
  4. צריך לוודא שהקובץ Assets/StreamingAssets/google-services-desktop.json נוצר ושהוא תואם לקובץ התצורה שהורדת.
    • אם הוא לא נוצר באופן אוטומטי ו-StreamingAssets/ לא קיים, יוצרים את הספרייה באופן ידני בספרייה Assets.
    • בודקים אם Unity יצרה עכשיו את google-services-desktop.json.

מוודאים שכל מוצר של Firebase ו-EDM4U הותקנו רק דרך .unitypackage או דרך Unity Package Manager.

  1. בודקים גם את התיקייה Assets/ וגם את Unity Package Manager כדי לוודא שערכות ה-SDK של Firebase ו-EDM4U הותקנו רק באחת מהשיטות.
  2. יכול להיות שיישומי פלאגין מסוימים שפותחו על ידי Google, כמו Google Play, ויישומי פלאגין של צד שלישי, תלויים ב-EDM4U. יכול להיות שהפלאגינים האלה כוללים את EDM4U בחבילות .unitypackage או בחבילות של Unity Package Manager ‏ (UPM). מוודאים שיש רק עותק אחד של EDM4U בפרויקט. אם חבילות UPM כלשהן תלויות ב-EDM4U, מומלץ לשמור רק את גרסאות ה-UPM של EDM4U, שאפשר למצוא בדף הארכיון של Google APIs ל-Unity.

חשוב לוודא שכל מוצר של Firebase בפרויקט הוא באותה גרסה.

  1. אם ערכות ה-SDK של Firebase הותקנו דרך .unitypackage, צריך לבדוק אם כל הספריות של FirebaseCppApp בקטע Assets/Firebase/Plugins/x86_64/ הן באותה גרסה.
  2. אם ערכות ה-SDK של Firebase הותקנו דרך Unity Package Manager‏ (UPM), פותחים את Windows > Package Manager, מחפשים את Firebase ומוודאים שכל החבילות של Firebase הן באותה גרסה.
  3. אם הפרויקט מכיל גרסאות שונות של ערכות Firebase SDK, מומלץ להסיר את כל ערכות Firebase SDK לחלוטין לפני שמתקינים את כולן שוב, הפעם עם אותן גרסאות. הדרך הכי נקייה היא להסיר כל חבילת Firebase באמצעות השיטות שמוזכרות בקטע הזה בנושא העברה.

שגיאות ב-Resolver וב-build של מכשיר היעד

אם המשחק פועל בכלי העריכה (מוגדר ליעד ה-build המתאים שבחרתם), צריך לוודא ש-External Dependency Manager for Unity‏ (EDM4U) מוגדר ופועל כמו שצריך.

במאגר של EDM4U ב-GitHub יש מדריך מפורט לחלק הזה בתהליך. כדאי לעיין בו ולפעול לפי ההוראות לפני שממשיכים.

בעיות ב-Single Dex והקטנה (חובה אם משתמשים ב-Cloud Firestore)

בזמן פיתוח אפליקציה ל-Android, יכול להיות שתיתקלו בשגיאה שקשורה לקובץ dex יחיד. הודעת השגיאה נראית בערך ככה (אם הפרויקט שלכם מוגדר להשתמש במערכת ה-build של Gradle):

Cannot fit requested classes in a single dex file.

קובצי .dex משמשים לאחסון קבוצה של הגדרות מחלקה ונתונים נלווים שמשויכים אליהן באפליקציות ל-Android. קובץ dex יחיד מוגבל להפניה ל-65,536 שיטות. אם המספר הכולל של השיטות מכל ספריות Android בפרויקט חורג מהמגבלה הזו, ה-builds ייכשלו.

אפשר לבצע את שני השלבים הבאים ברצף. צריך להפעיל את multidex רק אם ההקטנה לא פותרת את הבעיה.

הפעלת צמצום הקוד

ב-2017.2, ‏Unity הציגה את Minification כדי להסיר קוד שלא בשימוש, מה שיכול להפחית את המספר הכולל של השיטות שאליהן יש הפניות בקובץ dex יחיד. * האפשרות הזו נמצאת ב-Player Settings > Android > Publishing Settings > Minify (הגדרות הנגן > Android > הגדרות פרסום > כיווץ). * האפשרויות עשויות להשתנות בגרסאות שונות של Unity, לכן כדאי לעיין במסמכי התיעוד הרשמיים של Unity.

הפעלת Multidex

אם אחרי הפעלת ההקטנה מספר השיטות שמופנים אליהן עדיין חורג מהמגבלה, אפשרות נוספת היא להפעיל את multidex. יש כמה דרכים לעשות את זה ב-Unity:

  • אם האפשרות Custom Gradle Template (תבנית Gradle בהתאמה אישית) מופעלת בקטע Player Settings (הגדרות הנגן), צריך לשנות את mainTemplate.gradle.
  • אם אתם משתמשים ב-Android Studio כדי ליצור את הפרויקט שייצאתם, אתם צריכים לשנות את הקובץ build.gradle ברמת המודול.

פרטים נוספים זמינים במדריך למשתמש של multidex.

הסבר על שגיאות זמן ריצה במכשיר היעד ואיך לתקן אותן

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

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

Android

סימולטור

  • בודקים את היומנים שמוצגים במסוף של האמולטור או פותחים את החלון Logcat.

מכשיר

כדאי להכיר את adb ואת adb logcat ולדעת איך להשתמש בהם.

  • אפשר להשתמש בכלים השונים של סביבת שורת הפקודה כדי לסנן את הפלט, אבל כדאי גם לבדוק את האפשרויות של logcat.
  • דרך פשוטה להתחיל סשן ADB עם דף נקי:

    adb logcat -c && adb logcat <OPTIONS>

    כאשר OPTIONS הם הדגלים שאתם מעבירים לשורת הפקודה כדי לסנן את הפלט.

שימוש ב-Logcat דרך Android Studio

כשמשתמשים ב-Logcat דרך Android Studio, יש כלי חיפוש נוספים שמאפשרים ליצור חיפושים יעילים בצורה פשוטה יותר.

iOS

בדיקת יומנים

אם אתם משתמשים במכשיר פיזי, חברו אותו למחשב. בודקים את lldb ב-Xcode.

בעיות ב-Swift

אם נתקלתם ביומני שגיאות שמוזכרת בהם Swift, עיינו בקטע External Dependency Manager for Unity (מנהל יחסי תלות חיצוניים ל-Unity) בנוגע אליהם.

השלבים הבאים

אם עדיין יש במשחק בעיות שקשורות לקימפול, לבנייה או להפעלה של Firebase, כדאי לעיין בדף הבעיות של Firebase SDK for Unity ולשקול לדווח על בעיה חדשה. בנוסף, אפשר לעיין בדף התמיכה של Firebase כדי לקבל מידע על אפשרויות נוספות.