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

本頁面提供使用 Firebase 時可能遇到的 Unity 專屬問題提示和疑難排解方式。

有其他問題或未在下方找到您的問題嗎?如要進一步瞭解 Firebase 或特定產品的常見問題,請務必查看 主要 Firebase 常見問題

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

Firebase 支援 .NET 4.x 做為 Unity 2017 以上版本中的實驗性建構選項。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 編譯

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

因此,Firebase Unity SDK 5.4.0 以上版本提供類型轉送 DLL,可將 Parse 類型 (例如 System.Threading.Tasks.Task 的 Parse 實作) 轉送至 .NET 架構。很遺憾,Unity 2017.1.x 中提供的 IL2CPP (將 C# 轉換為 C++) 轉譯器無法正確處理類型轉送 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 Realtime Database 會使用 .NET 網路堆疊建立 TLS 網路連線。使用 .NET 4.6 時,Unity 2017.2 中的 TLS 功能會中斷,導致 Realtime Database 外掛程式在編輯器和電腦上失敗。

這個問題沒有解決方法,因此您必須使用其他版本的 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,請將其重新命名為 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 Executable (.dex) 檔案用於儲存 Android 應用程式 (.apk) 的一系列類別定義及其相關附加資料。單一 DEX 檔案只能參照 65,536 個方法。如果專案中所有 Android 程式庫的方法總數超過此上限,建構作業就會失敗。

Unity 在 2017.2 版中推出了縮減功能,可使用 Proguard (或某些 Unity 版本中的其他工具) 去除未使用的程式碼,進而減少單一 DEX 檔案中參照方法的總數。這個選項位於「Player Settings」>「Android」>「Publishing Settings」>「Minify」。不同版本的 Unity 可能會提供不同的選項,因此請參閱 Unity 官方文件。

如果參照的方法數量仍超過上限,您可以選擇啟用 multidex。在 Unity 中,您可以透過多種方式達成這項目標:

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

詳情請參閱MultiDex 使用者指南

在 Unity 2017 和 Unity 2018 中,針對 Android 建構作業提供 Java 8 支援和脫糖功能 (Firebase Unity SDK 8.0.0 以上版本)

2021 年 5 月 (Firebase BoM 28.0.0 版),Firebase 已為所有 Android 程式庫停用 desugaring 功能 (請參閱版本資訊)。使用 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 中修正這個建構錯誤,請執行下列任一操作:

  • compileOptions 區塊新增至 Gradle 範本:

    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 (建議的匯入方法)。