Check out what’s new from Firebase at Google I/O 2022. Learn more

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 兼容的插件。

如果您導入與項目中啟用的 .NET 版本不兼容的 Firebase 插件,您將看到來自 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 及更高版本提供了將 Parse 類型(例如, System.Threading.Tasks.Task的 Parse 實現)轉發到 .NET 框架的類型轉發 DLL。不幸的是,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 實時數據庫使用 .NET 網絡堆棧創建 TLS 網絡連接。 Unity 2017.2 中的 TLS 功能在使用 .NET 4.6 時被破壞,導致實時數據庫插件在編輯器和桌面上失敗。

此問題沒有解決方法,因此您必須使用不同版本的 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 中引入了Minification ,它使用 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(Firebase Unity SDK 8.0.0 及更高版本)中對 Android 構建的 Java 8 支持和脫糖

2021 年 5 月(Firebase BoM v28.0.0),Firebase 禁用了所有 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 中修復此構建錯誤,請執行以下操作之一:

  • compileOptions塊添加到您的 gradle 模板:

    1. 使用Gradle作為構建系統。
    2. Player Settings下啟用Custom Gradle Template
    3. 將以下行添加到mainTemplate.gradle (或模塊級build.gradle ,如果為 Android Studio 導出項目):

      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 包管理器(UPM) 導入
    • 這是在 Unity 2018.4+ 中管理包的推薦方法。
    • 使用此方法可以使將來的版本更新更容易,並使您的Assets/目錄更乾淨。

在您的 Unity 項目中,您應該只使用一種導入方法來管理您的所有 Firebase 包。以下說明不僅可用於更新單個包的版本,還可以在需要時將包管理遷移到 UPM(推薦的導入方法)。