故障排除與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 實時數據庫使用 .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 構建,以便 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 可執行文件 ( .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 中 Android 版本的 Java 8 支持和脫糖(Firebase Unity SDK 8.0.0 及更高版本)

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

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