疑難排解 &;Unity 和 Firebase 常見問題

本頁面提供使用 Firebase 時可能會遇到的 Unity 相關問題的提示和疑難排解。

是否遇到其他挑戰,或是您的問題與下方無關?請務必查看主要 Firebase 常見問題,進一步瞭解展開 Firebase 或特定產品的常見問題。

使用 Unity 2017.x 以上版本時有.NET 相容性

在 Unity 2017 以上版本中,Firebase 支援 .NET 4.x 做為實驗性建構選項。Firebase 外掛程式會使用 Parse SDK 的元件,在舊版 .NET 中提供部分 .NET 4.x 類別。

因此,Firebase Unity SDK 5.4.0 以上版本提供與 Firebase Unity SDK 的 dotnet3dotnet4 目錄相容的 .NET 3.x 或 .NET 4.x 外掛程式。

如果您匯入的 Firebase 外掛程式與專案中啟用的 .NET 版本不相容,將會看到 Parse SDK 實作的部分 .NET 架構中的編譯錯誤。

如果你使用 .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 專案中,依序前往「Assets」 >「Play Services Resolver」 >「Version Handler」 >「Update」,為專案啟用正確的 DLL。

在.NET 4 .x 專案中進行 Unity 2017.1 IL2CPP 編譯

在 Unity 2017 以上版本中,Firebase 支援 .NET 4.x 做為實驗性建構選項。Firebase 外掛程式會使用 Parse SDK 的元件,在舊版 .NET 中提供部分 .NET 4.x 類別。

因此,Firebase Unity SDK 5.4.0 以上版本提供了類型轉送 DLL,可將剖析類型 (例如 System.Threading.Tasks.Task 的剖析實作) 轉送至 .NET 架構。不過,在 Unity 2017.1.x 中發布的 IL2CPP (將 C# 轉換為 C++ 的轉譯器) 無法正確處理 DLL 類型轉送 DLL,進而導致發生類似以下的建構錯誤:

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

在 Unity 2017.1 中,目前沒有 .NET 4.x IL2CPP 建構錯誤適用的解決方法,因此您必須升級至 Unity 2017.2 以上版本,才能在使用 IL2CPP 編譯的專案中使用 .NET 4.x。

Unity 2017.2 網路

Firebase 即時資料庫會使用 .NET 網路堆疊建立 TLS 網路連線。使用 .NET 4.6 時,Unity 2017.2 中的 TLS 功能無法正常運作,導致即時資料庫外掛程式在編輯器和電腦上無法運作。

這個問題沒有解決方法,因此您必須使用其他版本的 Unity,例如 2017.1 或 2017.3。

Unity 2020 中缺少 Firebase Android 設定檔

為了支援無法自訂 Gradle 建構作業的 Unity 版本,Firebase 編輯器工具會產生 Assets/Plugins/Android/Firebase/res/values/google-services.xml 做為要封裝至 Android 版本的 Android 資源,讓 Firebase SDK 可以使用它來初始化預設的 FirebaseApp 執行個體。

在 Unity 2020 中,所有 Android 資源都必須位於含有 .androidlib 後置字串的目錄中。如果您的專案使用會產生 Assets/Plugins/Android/Firebase 目錄的 Firebase SDK,請將該 SDK 重新命名為 Assets/Plugins/Android/Firebase.androidlib。請確保其中包含 AndroidManifest.xmlproject.propertiesres/values/google-services.xml

建構 Android 應用程式時發生單一 dex 問題

建構 Android 應用程式時,您可能會遇到與擁有單一 dex 檔案相關的建構失敗問題。如果專案設為使用 Gradle 建構系統,系統會顯示類似以下的錯誤訊息。

Cannot fit requested classes in a single dex file.

Dalvik 執行檔 (.dex) 檔案是用來保存一組類別定義及相關的 Android 應用程式裁定資料 (.apk)。單一 DEX 檔案只能參照 65,536 個方法。如果專案中所有 Android 程式庫的方法總數超過此上限,建構作業就會失敗。

Unity 在 2017.2 推出了壓縮功能,可使用 Proguard (或部分 Unity 版本中的其他工具) 去除未使用的程式碼,可減少單一 dex 檔案中參照方法的總數。如要查看這個選項,請依序前往「Player Settings」>「Android」>「Publish Settings」>「Minify」。選項可能因不同 Unity 版本而異,因此請參閱官方 Unity 說明文件。

如果參照的方法數量仍超過上限,另一個選項就是啟用 multidex。在 Unity 中有許多方法可以達到這個效果:

  • 如果已啟用 Player Settings 下的 Custom Gradle Template,請修改 mainTemplate.gradle
  • 如果您使用 Android Studio 建立匯出的專案,請修改模組層級的 build.gradle 檔案。

詳情請參閱 Multidex 使用手冊

Unity 2017 和 Unity 2018 (Firebase Unity SDK 8.0.0 以上版本) 針對 Android 版本,支援 Java 8 與脫糖程序

Firebase 已於 2021 年 5 月 (Firebase BoM v28.0.0) 停用其所有 Android 程式庫的脫糖功能 (請參閱版本資訊)。使用 Firebase Unity SDK (8.0.0 以上版本) 建構 Android 應用程式時,可能會看到下列建構錯誤:

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

這項變更只會影響 Unity 2017 和 Unity 2018 中的 Android 版本。較新版本的 Unity 預設會在 Gradle 建構檔案中新增 compileOptions 區塊。如要修正 Unity 2017 和 Unity 2018 中的這個建構錯誤,請執行下列任一操作:

  • 在 Gradle 範本中新增 compileOptions 區塊:

    1. 使用 Gradle 做為建構系統。
    2. 啟用 Player Settings 底下的 Custom Gradle Template
    3. 將下列幾行新增至 mainTemplate.gradle (如果匯出 Android Studio 專案,則為模組層級 build.gradle):

      android {
          compileOptions {
              sourceCompatibility 1.8
              targetCompatibility 1.8
          }
      }
      
  • 或者,您也可以將 Android 專案的 minSdkVersion 提高至 26 以上。

另請參閱「Android 疑難排解 - 脫糖建構失敗」。

使用 Cocoapods 建構 iOS 應用程式時遇到的問題

針對 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 版本的程序取決於最初的匯入方式。以下是兩種替代匯入方法:

  • 正在匯入專案 Assets/ 目錄下的 .unitypackage 個檔案
  • 使用 Unity Package Manager (UPM) 匯入
    • 建議您使用這個方法管理 Unity 2018.4 以上版本中的套件。
    • 使用這個方法可簡化日後的版本更新作業,並讓 Assets/ 目錄更加簡潔。

在 Unity 專案中,建議您只使用一種匯入方法管理所有 Firebase 套件。下列操作說明不僅可讓您更新個別套件的版本,也能視需要用於將套件管理遷移至 UPM (建議的匯入方法)。