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

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

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

ความเข้ากันได้กับ .NET เมื่อใช้ Unity 2017.x ขึ้นไป

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

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

หากคุณนําเข้าปลั๊กอิน 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 ให้ไปที่ เนื้อหา > Play Services Resolver > ตัวแฮนเดิลเวอร์ชัน > อัปเดต เพื่อเปิดใช้ DLL ที่ถูกต้องสำหรับโปรเจ็กต์

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

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

ดังนั้น Firebase Unity SDK เวอร์ชัน 5.4.0 ขึ้นไปจึงมี DLL ที่ส่งต่อประเภท ซึ่งส่งต่อประเภทของ Parse (เช่น การใช้งาน System.Threading.Tasks.Task ของ Parse) ไปยังเฟรมเวิร์ก .NET ขออภัย IL2CPP (Transpiler ที่แปลง 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 Realtime Database สร้างการเชื่อมต่อเครือข่าย TLS โดยใช้สแต็กเครือข่าย .NET ฟังก์ชันการทำงานของ TLS ไม่ทำงานใน Unity 2017.2 เมื่อใช้ .NET 4.6 ทําให้ปลั๊กอิน Realtime Database ใช้งานไม่ได้ในเครื่องมือแก้ไขและบนเดสก์ท็อป

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

ไม่มีไฟล์กําหนดค่า Firebase สําหรับ Android ใน 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

ปัญหาเกี่ยวกับ 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 และการกรอง Sugar ออกสําหรับบิลด์ Android ใน Unity 2017 และ Unity 2018 (Firebase Unity SDK 8.0.0 ขึ้นไป)

ในเดือนพฤษภาคม 2021 (Firebase BoM v28.0.0) Firebase ได้ปิดใช้การกรอง Sugar ออกจากไลบรารี 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 - การสร้างที่ดึง Sugar ออกไม่สำเร็จ

ปัญหาเมื่อสร้างสำหรับ 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 (วิธีการนําเข้าที่แนะนํา) ได้หากจําเป็น