บทนำ
ต่อไปนี้คือคำแนะนำในการแก้ไขข้อบกพร่องของกระบวนการคอมไพล์และบิลด์สำหรับเกม Unity โดยใช้ Firebase SDK สำหรับ Unity โดยจะอธิบายวิธีตรวจสอบและแก้ปัญหาที่พบบ่อยขณะกำหนดค่าและสร้างเกมสำหรับแพลตฟอร์มใหม่หรือหลังการอัปเดต โดยจะเรียงตามลำดับเวลาที่ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นในกระบวนการ ปรึกษาตามลำดับและดำเนินการต่อเมื่อปัญหาแต่ละอย่างได้รับการแก้ไขแล้ว
นอกจากเอกสารนี้แล้ว โปรดดูข้อมูลเพิ่มเติมในคำถามที่พบบ่อยเกี่ยวกับ Firebase สำหรับ Unity
ปัญหาเกี่ยวกับการคอมไพล์โหมดการเล่น
ปัญหาการสร้างคลาสแรกอาจเกิดขึ้นขณะทดสอบในเอดิเตอร์ก่อนที่คุณจะพยายามเริ่มการสร้างสำหรับอุปกรณ์เคลื่อนที่ ส่วนนี้เกี่ยวข้องกับข้อผิดพลาดทั้งหมดของ Firebase ที่เกิดขึ้นก่อนและระหว่างโหมดเล่น
เมื่อ Unity เริ่มทำงานหรือตรวจพบการเปลี่ยนแปลงในทรัพยากร Dependency, โค้ด หรือชิ้นงานอื่นๆ Unity จะพยายามสร้างโปรเจ็กต์ใหม่ หากโปรเจ็กต์คอมไพล์ไม่ได้ในขณะนั้น เอดิเตอร์จะบันทึกข้อผิดพลาดในการคอมไพล์ไปยังคอนโซล และหากคุณพยายามเข้าสู่โหมดเล่น คุณจะได้รับป๊อปอัปข้อผิดพลาดในแท็บฉากของ Unity ซึ่งระบุว่า All compiler errors have to be fixed before you can enter playmode!
การแก้ไขข้อบกพร่องของปัญหาการคอมไพล์ที่เกี่ยวข้องกับ Firebase
ไม่มีประเภท คลาส เมธอด และสมาชิก
ปัญหา 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>'
ขั้นตอนการแก้ปัญหา
หากคุณใช้คลาสหรือเมธอด Firebase ในโค้ด โปรดตรวจสอบว่าคุณทำให้คลาสหรือเมธอดเหล่านั้นพร้อมใช้งานโดยมี
using
คำสั่งที่ถูกต้องสำหรับผลิตภัณฑ์ Firebase ที่ต้องการตรวจสอบว่าคุณได้นําเข้าแพ็กเกจ Firebase ที่เหมาะสมแล้ว
- หากต้องการนำเข้าแพ็กเกจที่เหมาะสม ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
- เพิ่ม Firebase Unity SDK เป็น
.unitypackage
s หรือ - ดูและทำตามตัวเลือกใดตัวเลือกหนึ่งในตัวเลือกการติดตั้ง Unity เพิ่มเติม
- เพิ่ม Firebase Unity SDK เป็น
- ตรวจสอบว่าผลิตภัณฑ์ Firebase ทุกรายการในโปรเจ็กต์และ EDM4U มีคุณสมบัติดังนี้
- เป็นเวอร์ชันเดียวกัน
- ได้รับการติดตั้งเป็น
.unitypackage
s โดยเฉพาะ OR ผ่าน Unity Package Manager โดยเฉพาะ
- หากต้องการนำเข้าแพ็กเกจที่เหมาะสม ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
หากคุณนำเข้า Firebase Unity SDK ก่อนเวอร์ชัน "10.0.0" เป็น
.unitypackage
s ที่เก็บถาวรแบบ ZIP ของ Firebase Unity SDK จะมีแพ็กเกจที่รองรับทั้ง .NET 3.x และ .NET 4.x ตรวจสอบว่าคุณได้รวมเฉพาะระดับ .NET Framework ที่เข้ากันได้ในโปรเจ็กต์- ความเข้ากันได้ระหว่างเวอร์ชันของ Unity Editor และระดับ .NET Framework จะกล่าวถึงในเพิ่ม Firebase ลงในโปรเจ็กต์ Unity
- หากคุณนำเข้าแพ็กเกจ Firebase ที่ระดับ .NET Framework ไม่ถูกต้องโดยไม่ได้ตั้งใจ หรือต้องการเปลี่ยนจากการใช้
.unitypackage
เป็นตัวเลือกการติดตั้ง Unity เพิ่มเติม วิธีที่ง่ายที่สุดคือการนำแพ็กเกจ Firebase ทั้งหมดออกผ่านวิธีการที่กล่าวถึงในส่วนการย้ายข้อมูลนี้ แล้วนำเข้าแพ็กเกจ Firebase ทั้งหมดอีกครั้ง
ตรวจสอบว่าเอดิเตอร์กำลังสร้างโปรเจ็กต์ใหม่ และความพยายามในการเล่นของคุณแสดงถึงสถานะล่าสุดของโปรเจ็กต์
- โดยค่าเริ่มต้น โปรแกรมแก้ไข Unity จะได้รับการตั้งค่าให้สร้างใหม่ทุกครั้งที่ตรวจพบการเปลี่ยนแปลงของชิ้นงานหรือการกำหนดค่า
- เป็นไปได้ว่าฟังก์ชันนี้ถูกปิดใช้และตั้งค่า Unity Editor เป็นรีเฟรช/คอมไพล์ใหม่ด้วยตนเอง ตรวจสอบปัญหานี้และลองรีเฟรชด้วยตนเองหากเป็นกรณีนี้
ข้อผิดพลาดเกี่ยวกับรันไทม์ของโหมดการเล่น
หากเกมเริ่มทำงาน แต่พบปัญหาเกี่ยวกับ Firebase ขณะทำงาน ให้ลองทำดังนี้
ตรวจสอบว่าคุณอนุมัติแพ็กเกจ Firebase ใน "ความปลอดภัยและความเป็นส่วนตัว" ใน Mac OS
หากเมื่อเริ่มเกมในเอดิเตอร์บน Mac OS คุณเห็นกล่องโต้ตอบที่ระบุว่า "เปิด FirebaseCppApp-<version>.bundle ไม่ได้เนื่องจากยืนยันตัวตนของนักพัฒนาแอปไม่ได้" คุณต้องอนุมัติไฟล์ Bundle นั้นในเมนูความปลอดภัยและความเป็นส่วนตัวของ Mac
โดยคลิกไอคอน Apple > System Preferences > Security & Privacy
ในเมนูความปลอดภัย บริเวณกึ่งกลางหน้าเว็บจะมีส่วนที่ระบุว่า "ระบบบล็อกการใช้ "FirebaseCppApp-<version>.bundle" เนื่องจากไม่ได้มาจากนักพัฒนาแอปที่ระบุ"
คลิกปุ่มที่มีป้ายกำกับว่าอนุญาตต่อไป
กลับไปที่ Unity แล้วกดเล่นอีกครั้ง
จากนั้นคุณจะเห็นคำเตือนที่คล้ายกับคำเตือนแรก
กดเปิดเพื่อให้โปรแกรมดำเนินการต่อได้ และระบบจะไม่ถามเกี่ยวกับไฟล์นี้อีก
ตรวจสอบว่าโปรเจ็กต์มีและใช้ไฟล์การกำหนดค่าที่ถูกต้อง
- ตรวจสอบว่าได้ตั้งค่าบิลด์สำหรับเป้าหมายที่คุณต้องการ (iOS หรือ Android) ในไฟล์ > การตั้งค่าบิลด์ อ่านข้อมูลเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับการตั้งค่าการสร้างของ Unity
- ดาวน์โหลดไฟล์การกำหนดค่าสำหรับแอป (
google-services.json
สำหรับ Android หรือGoogleService-Info.plist
สำหรับ iOS) และสร้างเป้าหมายจากคอนโซล Firebase ในการตั้งค่าโปรเจ็กต์ > แอปของคุณ หากมีไฟล์เหล่านี้อยู่แล้ว ให้ลบไฟล์ในโปรเจ็กต์และแทนที่ด้วยเวอร์ชันล่าสุด โดยตรวจสอบว่าชื่อไฟล์สะกดตรงกับที่แสดงด้านบนโดยไม่มี "(1)" หรือตัวเลขอื่นๆ ต่อท้ายชื่อไฟล์ - หากคอนโซลมีข้อความเกี่ยวกับไฟล์ใน
Assets/StreamingAssets/
ให้ตรวจสอบว่าไม่มีข้อความในคอนโซลที่ระบุว่า Unity แก้ไขไฟล์ในนั้นไม่ได้ - ตรวจสอบว่าได้สร้าง
Assets/StreamingAssets/google-services-desktop.json
แล้วและตรงกับไฟล์การกำหนดค่าที่ดาวน์โหลด- หากระบบไม่สร้างไดเรกทอรีโดยอัตโนมัติและ
StreamingAssets/
ไม่มีอยู่ ให้สร้างไดเรกทอรีในไดเรกทอรีAssets
ด้วยตนเอง - ตรวจสอบว่า Unity สร้าง
google-services-desktop.json
แล้วหรือไม่
- หากระบบไม่สร้างไดเรกทอรีโดยอัตโนมัติและ
ตรวจสอบว่าผลิตภัณฑ์ Firebase และ EDM4U ทุกรายการได้รับการติดตั้งผ่าน .unitypackage
หรือ Unity Package Manager เท่านั้น
- ตรวจสอบทั้งโฟลเดอร์
Assets/
และ Unity Package Manager เพื่อให้แน่ใจว่าได้ติดตั้ง Firebase SDK และ EDM4U ผ่านวิธีใดวิธีหนึ่งเท่านั้น - ปลั๊กอินที่ Google พัฒนาขึ้นบางรายการ เช่น Google Play และปลั๊กอินของบุคคลที่สามอาจต้องใช้ EDM4U ปลั๊กอินเหล่านั้นอาจรวม EDM4U ไว้ในแพ็กเกจ
.unitypackage
s หรือ Unity Package Manager (UPM) ตรวจสอบว่ามี EDM4U ในโปรเจ็กต์เพียงสำเนาเดียว หากแพ็กเกจ UPM ใดขึ้นอยู่กับ EDM4U คุณควรเก็บเฉพาะ EDM4U เวอร์ชัน UPM ซึ่งดูได้ในหน้า Google APIs for Unity Archive
ตรวจสอบว่าผลิตภัณฑ์ Firebase ทุกรายการในโปรเจ็กต์เป็นเวอร์ชันเดียวกัน
- หากติดตั้ง Firebase SDK ผ่าน
.unitypackage
ให้ตรวจสอบว่าไลบรารีFirebaseCppApp
ทั้งหมดในAssets/Firebase/Plugins/x86_64/
อยู่ในเวอร์ชันเดียวกัน - หากติดตั้ง Firebase SDK ผ่าน Unity Package Manager (UPM) ให้เปิดหน้าต่าง > Package Manager ค้นหา "Firebase" และตรวจสอบว่าแพ็กเกจ Firebase ทั้งหมดเป็นเวอร์ชันเดียวกัน
- หากโปรเจ็กต์มี Firebase SDK เวอร์ชันต่างๆ เราขอแนะนําให้นํา Firebase SDK ทั้งหมดออกก่อนที่จะติดตั้ง Firebase SDK ทั้งหมดอีกครั้ง โดยครั้งนี้ให้ใช้เวอร์ชันเดียวกัน วิธีที่สะอาดที่สุดคือการนำแพ็กเกจ Firebase ทุกแพ็กเกจออกผ่านวิธีการที่กล่าวถึงในส่วนการย้ายข้อมูลนี้
ข้อผิดพลาดในการสร้างตัวแก้ไขและอุปกรณ์เป้าหมาย
หากเกมทำงานในเอดิเตอร์ (กำหนดค่าสำหรับเป้าหมายการบิลด์ที่เหมาะสมที่คุณเลือก) ให้ตรวจสอบว่าเครื่องมือจัดการการขึ้นต่อกันภายนอกสำหรับ Unity (EDM4U) ได้รับการกำหนดค่าและทำงานอย่างถูกต้อง
ที่เก็บ EDM4U GitHub มีคำแนะนำแบบทีละขั้นตอนสำหรับกระบวนการส่วนนี้ ซึ่งคุณควรอ่านและทำตามก่อนดำเนินการต่อ
ปัญหา "Single Dex" และการลดขนาด (ต้องระบุหากใช้ Cloud Firestore)
ขณะสร้างแอป Android คุณอาจพบว่าการสร้างล้มเหลวเนื่องจากมีไฟล์ DEX เพียงไฟล์เดียว ข้อความแสดงข้อผิดพลาดจะมีลักษณะคล้ายกับข้อความต่อไปนี้ (หากโปรเจ็กต์ได้รับการกำหนดค่าให้ใช้ระบบบิลด์ Gradle)
Cannot fit requested classes in a single dex file.
.dex
ใช้เพื่อเก็บชุดคำจำกัดความของคลาสและข้อมูลเสริมที่เกี่ยวข้องสำหรับแอปพลิเคชัน Android ไฟล์ DEX เดียวอ้างอิงได้ไม่เกิน 65,536 เมธอด การสร้างจะล้มเหลวหากจำนวนเมธอดทั้งหมดจากไลบรารี Android ทั้งหมดในโปรเจ็กต์เกินขีดจำกัดนี้
คุณสามารถทำตาม 2 ขั้นตอนต่อไปนี้ตามลำดับได้ โดยให้เปิดใช้ Multidex เฉพาะในกรณีที่การลดขนาดไม่สามารถแก้ปัญหาได้
เปิดใช้การลดขนาด
Unity เปิดตัวการลดขนาดในเวอร์ชัน 2017.2 เพื่อนำโค้ดที่ไม่ได้ใช้ออก ซึ่งจะช่วยลดจำนวนเมธอดที่อ้างอิงทั้งหมดในไฟล์ DEX เดียวได้ * ตัวเลือกนี้อยู่ในการตั้งค่าเพลเยอร์ > Android > การตั้งค่าการเผยแพร่ > ลดขนาด * ตัวเลือกอาจแตกต่างกันใน Unity เวอร์ชันต่างๆ โปรดดูเอกสารประกอบอย่างเป็นทางการของ Unity
เปิดใช้ Multidex
หากหลังจากเปิดใช้การลดขนาดแล้ว จำนวนเมธอดที่อ้างอิงยังคงเกินขีดจำกัด อีกตัวเลือกหนึ่งคือการเปิดใช้ multidex
คุณทำได้หลายวิธีใน Unity ดังนี้
- หากเปิดใช้เทมเพลต Gradle ที่กำหนดเองในการตั้งค่า Player ให้แก้ไข
mainTemplate.gradle
- หากใช้ Android Studio เพื่อสร้างโปรเจ็กต์ที่ส่งออก ให้แก้ไขไฟล์ build.gradle ระดับโมดูล
ดูรายละเอียดเพิ่มเติมได้ในคู่มือผู้ใช้ Multidex
ทำความเข้าใจและแก้ไขข้อผิดพลาดรันไทม์ของอุปกรณ์เป้าหมาย
หากเกมทำงานในเอดิเตอร์และสร้างและติดตั้งในอุปกรณ์เป้าหมายได้ แต่พบข้อผิดพลาดขณะรันไทม์ ให้ตรวจสอบและตรวจสอบบันทึกที่สร้างในอุปกรณ์
ส่วนนี้จะอธิบายวิธีตรวจสอบบันทึกเพื่อหาข้อผิดพลาดที่อาจเกิดขึ้น และข้อผิดพลาดดังกล่าวที่เกิดขึ้นเฉพาะรันไทม์ในอุปกรณ์หรือโปรแกรมจำลอง
Android
เครื่องมือจำลอง
- ตรวจสอบบันทึกที่แสดงในคอนโซลของโปรแกรมจำลองหรือดูหน้าต่าง Logcat
อุปกรณ์
ทำความคุ้นเคยกับ adb และ adb logcat รวมถึงวิธีใช้งาน
- แม้ว่าคุณจะใช้เครื่องมือต่างๆ ของสภาพแวดล้อมบรรทัดคำสั่งเพื่อกรองเอาต์พุตได้ แต่คุณอาจลองดูตัวเลือกของ Logcat แทน
วิธีง่ายๆ ในการเริ่มเซสชัน ADB โดยไม่มีการตั้งค่าใดๆ คือ
adb logcat -c && adb logcat <OPTIONS>
โดย
OPTIONS
คือ Flag ที่คุณส่งไปยังบรรทัดคำสั่งเพื่อกรองเอาต์พุต
การใช้ Logcat ผ่าน Android Studio
เมื่อใช้ Logcat ผ่าน Android Studio จะมีเครื่องมือค้นหาเพิ่มเติมที่ช่วยให้การค้นหาที่มีประสิทธิภาพง่ายขึ้น
iOS
การตรวจสอบบันทึก
หากใช้อุปกรณ์จริง ให้เชื่อมต่ออุปกรณ์กับคอมพิวเตอร์ ตรวจสอบ lldb ใน Xcode
ปัญหาเกี่ยวกับ Swift
หากพบบันทึกข้อผิดพลาดที่กล่าวถึง Swift โปรดดูส่วนเครื่องมือจัดการการขึ้นต่อกันภายนอกสำหรับ Unity
ขั้นตอนเพิ่มเติม
หากเกมยังคงมีปัญหาในการคอมไพล์ สร้าง หรือเรียกใช้ที่เกี่ยวข้องกับ Firebase โปรดตรวจสอบหน้าปัญหาเกี่ยวกับ Firebase SDK สำหรับ Unity และพิจารณายื่นปัญหาใหม่ นอกจากนี้ โปรดดูตัวเลือกเพิ่มเติมในหน้าการสนับสนุนของ Firebase