欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

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(推荐的导入方法)。