การแก้ปัญหาและคำถามที่พบบ่อยเกี่ยวกับ Unity และ Firebase

หน้านี้นำเสนอเคล็ดลับและการแก้ปัญหาเฉพาะสำหรับ Unity ที่คุณอาจพบเมื่อใช้ Firebase

หากมีความท้าทายอื่นๆ หรือไม่พบปัญหาของคุณตามที่ระบุไว้ด้านล่าง อย่าลืมดูคำถามที่พบบ่อยเกี่ยวกับ Firebase หลักสำหรับคำถามที่พบบ่อยอื่นๆ เกี่ยวกับ Firebase หรือคำถามที่พบบ่อยเฉพาะผลิตภัณฑ์

รองรับ .NET เมื่อใช้ Unity 2017.x ขึ้นไป

Firebase รองรับ .NET 4.x เป็นตัวเลือกบิลด์เวอร์ชันทดลองใน Unity 2017 ขึ้นไป ปลั๊กอิน Firebase ใช้คอมโพเนนต์ของ Parse SDK เพื่อให้บริการคลาส .NET 4.x บางรายการใน .NET เวอร์ชันก่อนหน้า

ดังนั้น Firebase Unity SDK เวอร์ชัน 5.4.0 ขึ้นไปจึงมีปลั๊กอินที่เข้ากันได้กับ .NET 3.x หรือ .NET 4.x ในไดเรกทอรี dotnet3 และ dotnet4 ของ Firebase Unity SDK

หากนำเข้าปลั๊กอิน Firebase ที่เข้ากันไม่ได้กับเวอร์ชัน .NET ที่เปิดใช้ในโปรเจ็กต์ของคุณ คุณจะเห็นข้อผิดพลาดคอมไพล์จากบางประเภทในเฟรมเวิร์ก .NET ที่ Parse SDK นำมาใช้งาน

หากต้องการแก้ไขข้อผิดพลาดในการคอมไพล์ หากใช้ .NET 3.x ให้ทำดังนี้

  1. นําออกหรือปิดใช้ DLL ต่อไปนี้สําหรับทุกแพลตฟอร์ม
    • Parse/Plugins/dotNet45/Unity.Compat.dll
    • Parse/Plugins/dotNet45/Unity.Tasks.dll
  2. เปิดใช้ DLL ต่อไปนี้สำหรับทุกแพลตฟอร์ม
    • Parse/Plugins/Unity.Compat.dll
    • Parse/Plugins/Unity.Tasks.dll

หากต้องการแก้ไขข้อผิดพลาดในการคอมไพล์ หากคุณใช้ .NET 4.x ให้ทำดังนี้

  1. นําออกหรือปิดใช้ DLL ต่อไปนี้สําหรับทุกแพลตฟอร์ม
    • Parse/Plugins/Unity.Compat.dll
    • Parse/Plugins/Unity.Tasks.dll
  2. เปิดใช้ DLL ต่อไปนี้สำหรับทุกแพลตฟอร์ม
    • Parse/Plugins/dotNet45/Unity.Compat.dll
    • Parse/Plugins/dotNet45/Unity.Tasks.dll

หากคุณนำเข้าปลั๊กอิน Firebase อื่น

  • ในโปรเจ็กต์ Unity ให้ไปที่ชิ้นงาน > ตัวแปลค่าบริการ Google Play > ตัวแฮนเดิลเวอร์ชัน > อัปเดต เพื่อเปิดใช้ DLL ที่ถูกต้องสำหรับโปรเจ็กต์

การคอมไพล์ Unity 2017.1 IL2CPP ในโปรเจ็กต์ .NET 4.x

Firebase รองรับ .NET 4.x เป็นตัวเลือกบิลด์เวอร์ชันทดลองใน Unity 2017 ขึ้นไป ปลั๊กอิน Firebase ใช้คอมโพเนนต์ของ Parse SDK เพื่อให้บริการคลาส .NET 4.x บางรายการใน .NET เวอร์ชันก่อนหน้า

ดังนั้น Firebase Unity SDK เวอร์ชัน 5.4.0 ขึ้นไปจึงมี DLL สำหรับส่งต่อประเภทซึ่งส่งต่อประเภทการแยกวิเคราะห์ (เช่น การใช้การแยกวิเคราะห์ของ System.Threading.Tasks.Task) ไปยังเฟรมเวิร์ก .NET น่าเสียดายที่ IL2CPP (เครื่องมือเปลี่ยนรูปแบบที่แปลง C# เป็น C++) ที่จัดส่งใน Unity 2017.1.x ไม่ได้ประมวลผล DLL สำหรับการส่งต่อประเภทอย่างถูกต้อง ซึ่งทำให้เกิดข้อผิดพลาดในการสร้างที่คล้ายกับสิ่งต่อไปนี้

Fatal error in Unity CIL Linker Mono.Cecil.ResolutionException: Failed to
resolve System.Threading.Tasks.TaskCompletionSource`1<T>

ขณะนี้ยังไม่มีวิธีแก้ปัญหาสำหรับข้อผิดพลาดของบิลด์ .NET 4.x IL2CPP ใน Unity 2017.1 คุณจึงต้องอัปเกรดเป็น Unity 2017.2 ขึ้นไปเพื่อใช้ .NET 4.x ในโปรเจ็กต์ที่คอมไพล์ด้วย IL2CPP

การสร้างเครือข่าย Unity 2017.2

ฐานข้อมูลเรียลไทม์ของ Firebase สร้างการเชื่อมต่อเครือข่าย TLS โดยใช้สแต็กเครือข่าย .NET ฟังก์ชัน TLS ใช้งานไม่ได้ใน Unity 2017.2 เมื่อใช้ .NET 4.6 ทำให้ปลั๊กอิน Realtime Database ไม่ทำงานในเครื่องมือแก้ไขและบนเดสก์ท็อป

ปัญหานี้ไม่มีวิธีแก้ปัญหาเบื้องต้น คุณจึงต้องใช้ Unity เวอร์ชันอื่น เช่น เวอร์ชัน 2017.1 หรือ 2017.3

ไม่มีไฟล์การกำหนดค่า Android ของ Firebase ใน Unity 2020

โดยเครื่องมือแก้ไข Firebase จะสร้าง Assets/Plugins/Android/Firebase/res/values/google-services.xml เป็นทรัพยากร Android ที่จะรวมไว้ในบิลด์ของ Android เพื่อให้ Firebase SDK นำไปใช้ในการเริ่มต้นอินสแตนซ์ FirebaseApp เริ่มต้นได้ ทั้งนี้เพื่อรองรับ Unity เวอร์ชันที่ไม่มีความสามารถในการปรับแต่งบิลด์ Gradle

ใน Unity 2020 ทรัพยากร Android ทั้งหมดต้องอยู่ในไดเรกทอรีที่มีคำต่อท้าย .androidlib หากโปรเจ็กต์ของคุณใช้ Firebase SDK ที่สร้างไดเรกทอรี Assets/Plugins/Android/Firebase ให้เปลี่ยนชื่อเป็น Assets/Plugins/Android/Firebase.androidlib ตรวจสอบว่ามี AndroidManifest.xml, project.properties และ res/values/google-services.xml

ปัญหาเกี่ยวกับ Single dex ขณะสร้างแอป Android

ขณะสร้างแอป Android คุณอาจพบว่าบิลด์ล้มเหลวเกี่ยวข้องกับการมีไฟล์ dex ไฟล์เดียว ข้อความแสดงข้อผิดพลาดจะคล้ายกับข้อความต่อไปนี้ หากมีการกำหนดค่าโปรเจ็กต์ให้ใช้ระบบบิลด์ Gradle

Cannot fit requested classes in a single dex file.

ไฟล์ Dalvik Executable (.dex) ใช้เก็บชุดคำนิยามของคลาสและข้อมูลเสริมที่เกี่ยวข้องสำหรับแอปพลิเคชัน Android (.apk) ไฟล์ dex ไฟล์เดียวจำกัดให้อ้างอิงได้ถึง 65,536 เมธอด บิลด์จะล้มเหลวหากจำนวนเมธอดจากไลบรารี Android ทั้งหมดในโปรเจ็กต์เกินขีดจำกัดนี้

Unity เปิดตัวการลดขนาดในปี 2017.2 ซึ่งใช้ Proguard (หรือเครื่องมืออื่นๆ ใน Unity บางเวอร์ชัน) เพื่อตัดโค้ดที่ไม่ได้ใช้ออก ซึ่งจะช่วยลดจำนวนเมธอดที่อ้างอิงทั้งหมดในไฟล์ dex ไฟล์เดียวได้ ตัวเลือกนี้อยู่ในการตั้งค่าโปรแกรมเล่น > Android > การตั้งค่าการเผยแพร่ > ลดขนาด ตัวเลือกอาจแตกต่างกันไปใน Unity เวอร์ชันต่างๆ โปรดดูเอกสารประกอบอย่างเป็นทางการของ Unity

หากจำนวนเมธอดที่อ้างอิงยังคงเกินขีดจำกัด อีกตัวเลือกหนึ่งคือเปิดใช้ multidex ซึ่งดำเนินการได้หลายวิธีใน Unity ดังนี้

  • หากเปิดใช้ Custom Gradle Template ภายใต้ Player Settings ให้แก้ไข mainTemplate.gradle
  • หากใช้ Android Studio เพื่อสร้างโปรเจ็กต์ที่ส่งออก ให้แก้ไขไฟล์ build.gradle ระดับโมดูล

ดูรายละเอียดเพิ่มเติมได้ในคู่มือผู้ใช้ Multidex

การสนับสนุนและการลดน้ำตาลใน Java 8 สำหรับ Android บิลด์ใน Unity 2017 และ Unity 2018 (Firebase Unity SDK 8.0.0 ขึ้นไป)

ในเดือนพฤษภาคม 2021 (Firebase BoM v28.0.0) Firebase ได้ปิดใช้การนำน้ำตาลออกสำหรับไลบรารี Android ทั้งหมด (ดูบันทึกประจำรุ่น) เมื่อสร้างแอป Android ด้วย Firebase Unity SDK (8.0.0 ขึ้นไป) คุณอาจเห็นข้อผิดพลาดในการสร้างต่อไปนี้

> Error while dexing.
 The dependency contains Java 8 bytecode. Please enable desugaring by adding the following to build.gradle

การเปลี่ยนแปลงนี้ส่งผลต่อบิลด์ของ Android ใน Unity 2017 และ Unity 2018 เท่านั้น Unity เวอร์ชันใหม่จะเพิ่มการบล็อก compileOptions ในไฟล์บิลด์ Gradle โดยค่าเริ่มต้น ในการแก้ไขข้อผิดพลาดของบิลด์ใน Unity 2017 และ Unity 2018 ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้

  • เพิ่มบล็อก compileOptions ในเทมเพลต Gradle

    1. ใช้ Gradle เป็นระบบบิลด์
    2. เปิดใช้ Custom Gradle Template ภายใต้ Player Settings
    3. เพิ่มบรรทัดต่อไปนี้ลงใน mainTemplate.gradle (หรือระดับโมดูล build.gradle หากส่งออกโปรเจ็กต์สำหรับ Android Studio)

      android {
          compileOptions {
              sourceCompatibility 1.8
              targetCompatibility 1.8
          }
      }
      
  • หรือเพิ่ม minSdkVersion สําหรับโปรเจ็กต์ Android เป็น 26 ขึ้นไป

ดูการแก้ปัญหาของ Android - การลดความซ้ำซ้อนของบิลด์

ปัญหาขณะสร้างแอปสำหรับ iOS ด้วย Cocoapods

เมื่อสร้างสำหรับ iOS การติดตั้ง Cocoapod อาจล้มเหลวโดยมีข้อผิดพลาดเกี่ยวกับภาษาของภาษาหรือการเข้ารหัส UTF-8 ปัจจุบันคุณมีวิธี หลีกเลี่ยงปัญหาหลายวิธี

  • จากเทอร์มินัล ให้เรียกใช้ pod install โดยตรงและเปิดไฟล์ xcworkspace ที่ได้

  • ดาวน์เกรดเวอร์ชัน Cocoapods เป็น 1.10.2 ปัญหาเกิดขึ้นเฉพาะในเวอร์ชัน 1.11 ขึ้นไปเท่านั้น

  • ใน~/.bash_profileหรือเทียบเท่า ให้เพิ่ม export LANG=en_US.UTF-8

วิธีอัปเดตเวอร์ชันของ Firebase Unity SDK

กระบวนการอัปเดตเวอร์ชันของ Firebase Unity SDK ขึ้นอยู่กับวิธีนำเข้าเวอร์ชันครั้งแรก นี่คือวิธีการนำเข้าที่เป็นทางเลือก 2 วิธี:

  • กำลังนำเข้า .unitypackage ไฟล์ภายใต้ไดเรกทอรี Assets/ ของโปรเจ็กต์
  • การนำเข้าโดยใช้ Unity Package Manager (UPM)
    • วิธีนี้เป็นวิธีที่แนะนำในการจัดการแพ็กเกจใน Unity 2018.4 ขึ้นไป
    • ใช้วิธีนี้เพื่อให้การอัปเดตเวอร์ชันในอนาคตง่ายขึ้นและล้างไดเรกทอรี Assets/ ได้ง่ายขึ้น

ในโปรเจ็กต์ Unity คุณควรใช้วิธีการนำเข้าเพียงวิธีเดียวในการจัดการแพ็กเกจ Firebase ทั้งหมด วิธีการด้านล่างนี้ไม่เพียงแค่ใช้เพื่ออัปเดตเวอร์ชันของแพ็กเกจแต่ละรายการ แต่ยังใช้เพื่อย้ายข้อมูลการจัดการแพ็กเกจไปยัง UPM (วิธีนำเข้าที่แนะนำ) ได้อีกด้วย หากจำเป็น