为 Unity 游戏集成 Firebase Remote Config

1. 简介

您可以使用 Firebase Remote Config 在应用中定义键值对(也称为参数),并在云端更新这些键值对的值。这样,您无需分发应用更新即可修改应用的外观和行为

您将向示例游戏 MechaHamster: Level Up with Firebase Edition 添加此新功能。此示例游戏是经典 Firebase 游戏 MechaHamster 的新版本,其中移除了大部分内置的 Firebase 功能,让您有机会实现新的 Firebase 用途。

为确保应用按预期运行,您将在示例游戏代码中为值设置默认配置,这些值可被您在 Firebase 控制台的 Remote Config 中设置的值覆盖。

学习内容

  • 如何在云端设置 Remote Config 值并检索这些值
  • 如何对 Unity C# 代码进行插桩,以自动使用检索到的值
  • 如何将复合值/对象存储、检测和替换为 JSON 值
  • 如何使用 Remote Config 条件向不同的用户群组提供不同的价值变体

您需要满足的条件

  • Unity 2019.1.0f1 或更高版本,支持 iOS 和/或 Android build
  • 用于构建和运行游戏的实体 Android/iOS 设备或模拟器/仿真器

2. 设置您的开发环境

以下部分介绍了如何下载 Level Up with Firebase 代码、在 Unity 中打开该代码,以及添加 Firebase 项目。这款“使用 Firebase 升级”示例游戏还用于其他多个 Firebase + Unity Codelab,因此您可能已经完成了本部分中的任务。如果是,您可以跳过这些步骤,直接前往“添加 Firebase SDK for Unity”,将 Remote Config 添加到示例游戏代码中。

下载代码

从命令行克隆此 Codelab 的 GitHub 代码库

git clone https://github.com/firebase/level-up-with-firebase

或者,如果您未安装 git,可以以 ZIP 文件的形式下载代码库

在 Unity 编辑器中打开借助 Firebase 进行升级

  1. 启动 Unity Hub,然后在项目标签页中,点击打开旁边的下拉箭头
  2. 点击从磁盘添加项目
  3. 前往包含代码的目录,然后点击 OK
  4. 如果系统提示,请选择要使用的 Unity 编辑器版本和目标平台(Android 或 iOS)。
  5. 点击项目名称 level-up-with-firebase,项目将在 Unity 编辑器中打开。
  6. 如果编辑器未自动打开 MainGameScene,请在 Unity 编辑器的 Project(项目)标签页中依次打开 Assets(资源)> Hamster

如需详细了解如何安装和使用 Unity,请参阅 Working in Unity

3. 将 Firebase 添加到您的 Unity 项目

创建 Firebase 项目

  1. 使用您的 Google 账号登录 Firebase 控制台
  2. 点击相应按钮以创建新项目,然后输入项目名称(例如 LevelUpWithFirebase)。
  3. 点击继续
  4. 如果看到相关提示,请查看并接受 Firebase 条款,然后点击继续
  5. (可选)在 Firebase 控制台中启用 AI 辅助功能(称为“Gemini in Firebase”)。
  6. 在此 Codelab 中,您需要使用 Google Analytics 才能充分利用 Firebase 产品,因此请确保 Google Analytics 选项的开关处于开启状态。按照屏幕上的说明设置 Google Analytics。
  7. 点击创建项目,等待项目完成预配,然后点击继续

在 Firebase 中注册您的应用

  1. 打开 Firebase 控制台,然后在项目概览页面的中心位置点击 Unity 图标以启动设置工作流;如果您已向 Firebase 项目添加了应用,请点击添加应用以显示平台选项。
  2. 选择同时注册 Apple (iOS) 和 Android build 目标。
  3. 输入 Unity 项目针对具体平台的 ID。在此 Codelab 中,请输入以下内容:
  4. (可选)输入 Unity 项目针对具体平台的别名。
  5. 点击注册应用,然后前往下载配置文件部分。
  6. 针对您第一次未执行的任何 build 目标重复此流程。

添加 Firebase 配置文件

点击注册应用后,系统会提示您下载两个配置文件(每个 build 目标对应一个配置文件)。您的 Unity 项目需要这些文件中的 Firebase 元数据才能与 Firebase 连接。

  1. 下载两个可用的配置文件:
    • 对于 Apple (iOS):下载 GoogleService-Info.plist
    • 对于 Android:下载 google-services.json
  2. 打开 Unity 项目的 Project 窗口,然后将这两个配置文件移动到 Assets 文件夹中。
  3. 返回 Firebase 控制台,在设置工作流中,点击下一步,然后继续操作以添加适用于 Unity 的 Firebase SDK。

注意:您可以随时重新下载这些文件,只需打开项目的常规设置,向下滚动到您的应用部分,然后点击所需配置文件对应的下载按钮即可。

添加适用于 Unity 的 Firebase SDK

  1. 在 Firebase 控制台中,点击下载 Firebase Unity SDK
  2. 将 SDK 解压缩到方便的位置。
  3. 在您打开的 Unity 项目中,依次点击 Assets(资源)> Import Package(导入软件包)> Custom Package(自定义软件包)。
  4. 导入软件包对话框中,前往包含解压缩的 SDK 的目录,选择 FirebaseAnalytics.unitypackage,然后点击打开
  5. 在随即显示的 Import Unity Package 对话框中,点击 Import
  6. 重复上述步骤,导入以下两个软件包:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      Crashlytics 是一个轻量级的实时崩溃报告解决方案,可帮助您对影响应用质量的稳定性问题进行跟踪、确定优先解决顺序并加以修复。如果您之前未使用过 Crashlytics,请考虑完成 Unity 版 Crashlytics 学习路线
  7. 返回 Firebase 控制台,然后在设置工作流中点击下一步

如需详细了解如何将 Firebase SDK 添加到 Unity 项目,请参阅其他 Unity 安装选项

4. 设置 Remote Config 默认值并提取新值

在此 Codelab 中,您将更新使用代码中定义的值或在 Unity 编辑器中序列化的对象,以使用通过 Remote Config 检测的值。您将使用 SetDefaultsAsync 为每个参数配置默认值,以便应用在连接到 Remote Config 后端之前能够按预期运行。您的应用将通过从 Remote Config 提取新值并激活这些值来保持最新状态,以便在代码中使用这些值。

如需从 Remote Config 中提取新值,Assets/Hamster/Scripts/MainGame.cs 文件中已存在许多未实现的方法,必须完成这些方法。

  1. 将以下 using 语句添加到 MainGame.cs
    using Firebase.Crashlytics;
    using Firebase.Extensions;
    using Firebase.RemoteConfig;
    
    Firebase.Extensions 模块包含 C# Tasks API 的一些扩展,有助于简化通过回调管理初始化流程的过程。
  2. 通过将现有的 InitializeCommonDataAndStartGame() 方法替换为当前未实现的方法 InitializeFirebaseAndStartGame(),向 MainGame.cs Start() 方法添加 Firebase 初始化:
    void Start()
    {
       Screen.SetResolution(Screen.width / 2, Screen.height / 2, true);
       InitializeFirebaseAndStartGame();
    }
    
  3. MainGame.cs 中,找到 InitializeFirebaseAndStartGame()。声明一个应用变量,并按如下方式覆盖该方法的实现:
    public Firebase.FirebaseApp app = null;
    
    // Begins the firebase initialization process and afterwards, opens the main menu.
    private void InitializeFirebaseAndStartGame()
    {
       Firebase.FirebaseApp.CheckAndFixDependenciesAsync()
       .ContinueWithOnMainThread(
          previousTask =>
          {
             var dependencyStatus = previousTask.Result;
             if (dependencyStatus == Firebase.DependencyStatus.Available) {
             // Create and hold a reference to your FirebaseApp,
             app = Firebase.FirebaseApp.DefaultInstance;
             // Set the recommended Crashlytics uncaught exception behavior.
             Crashlytics.ReportUncaughtExceptionsAsFatal = true;
             SetRemoteConfigDefaults();
             } else {
             UnityEngine.Debug.LogError(
                $"Could not resolve all Firebase dependencies: {dependencyStatus}\n" +
                "Firebase Unity SDK is not safe to use here");
             }
          });
    }
    
  4. Firebase 初始化成功后会调用 SetRemoteConfigDefaults 来设置应用内默认值。将未实现的 SetRemoteConfigDefaults 方法替换为以下代码:
    private void SetRemoteConfigDefaults()
    {
       var defaults = new System.Collections.Generic.Dictionary < string, object > ();
       defaults.Add(
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceKey,
          Hamster.MapObjects.AccelerationTile.AccelerationTileForceDefault);
       defaults.Add(
          Hamster.States.MainMenu.SubtitleOverrideKey,
          Hamster.States.MainMenu.SubtitleOverrideDefault);
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.SetDefaultsAsync(defaults).ContinueWithOnMainThread(
          previousTask =>
          {
             FetchRemoteConfig(InitializeCommonDataAndStartGame);
          }
       );
    }
    

5. 提取并激活新值(根据需要)

现在,我们需要完成现有的 FetchRemoteConfig 方法。这会使用名为 onFetchAndActivateSuccessful 的回调形参,将对 Remote Config 方法 FetchAsync(从 Remote Config 中提取新值)和 ActivateAsync(激活所获取的值以使其可在代码中使用)的调用链接起来。

我们在上一步中添加的启动代码会调用 FetchRemoteConfig,并将 InitializeCommonDataAndStartGame 作为其回调,以便在序列结束时启动游戏。您可以将替代回调传递给 FetchRemoteConfig,以便调用具有不同结果的提取。一个示例(您稍后将实现)是传入一个打开新界面菜单的方法,该方法依赖于 Remote Config 值。这样一来,只有在提取并激活这些值后,菜单才会打开。

  1. 将以下代码粘贴到 FetchRemoteConfig 中:
    public void FetchRemoteConfig(System.Action onFetchAndActivateSuccessful)
    {
       if(app==null)
       {
          Debug.LogError($"Do not use Firebase until it is properly initialized by calling {nameof(InitializeFirebaseAndStartGame)}.");
          return;
       }
    
       Debug.Log("Fetching data...");
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       remoteConfig.FetchAsync(System.TimeSpan.Zero).ContinueWithOnMainThread(
          previousTask=>
          {
             if (!previousTask.IsCompleted)
             {
             Debug.LogError($"{nameof(remoteConfig.FetchAsync)} incomplete: Status '{previousTask.Status}'");
             return;
             }
             ActivateRetrievedRemoteConfigValues(onFetchAndActivateSuccessful);
          });
    }
    
  2. 接下来,完成 ActivateRetrievedRemoteConfigValues 方法,该方法会接收传入的回调 onFetchAndActivateSuccessful。激活完成后,系统会调用指定的回调:
    private void ActivateRetrievedRemoteConfigValues(System.Action onFetchAndActivateSuccessful)
    {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var info = remoteConfig.Info;
       if(info.LastFetchStatus == LastFetchStatus.Success)
       {
          remoteConfig.ActivateAsync().ContinueWithOnMainThread(
             previousTask =>
             {
             Debug.Log($"Remote data loaded and ready (last fetch time {info.FetchTime}).");
             onFetchAndActivateSuccessful();
             });
       }
    }
    

当由 SetRemoteConfigDefaults 从初始化上下文向下游调用时,ActivateRetrievedRemoteConfigValues 会调用之前的起始点 InitializeCommonDataAndStartGame,以通过打开主菜单来启动游戏。

6. 设置 Remote Config 加载策略

如需在应用使用期间的其他时间提取和激活值,您需要再次调用这些函数,并且如果任何对象缓存了这些值,则必须通知这些对象执行更新。为了制定重新提取 Remote Config 值的策略,请考虑何时需要新值,以及何时开始提取和激活新值,以避免在使用过程中发生更改。

按照目前的实现方式,系统会在应用启动时提取并激活远程配置值。在菜单更改期间,提取可以隐藏,同时在过渡期间阻止互动。此外,这也是获取新值的最相关时间,因为菜单状态的更改通常可用于了解玩家将前往“何处”,并预测将使用某个值。

查看 Mechahamster 的菜单系统,添加界面阻塞菜单刷新的最简单方法是在主菜单恢复之前(具体来说,是在通过退出另一个菜单来访问主菜单时)调用它,并将界面显示方法作为 onFetchAndActivateSuccessful 回调传递。您也可以对关卡选择菜单执行相同的操作。

在应用启动时进行初始加载后,任何通过主菜单进行的菜单导航都将由第一个处理,而任何重新进入关卡选择菜单的操作也会导致刷新。进入关卡选择菜单的初始入口并不重要,因为该菜单只能从主菜单访问,因此已涵盖在内。

如需在应用中启用此功能,请完成主菜单和关卡选择文件中的相关方法,这些方法会阻止界面显示,直到 FetchAsyncActivateAsync 完成为止:

  1. 打开 Assets/Hamster/Scripts/States/MainMenu.cs 并将现有 Resume 方法替换为以下方法:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.SelectAndPlayMusic(CommonData.prefabs.menuMusic, true);
       CommonData.mainGame.FetchRemoteConfig(InitializeUI);
    }
    
  2. 保存文件。
  3. 打开 Assets/Hamster/Scripts/States/BaseLevelSelect.cs,并将现有 Resume 方法替换为以下代码:
    public override void Resume(StateExitValue results) {
       CommonData.mainGame.FetchRemoteConfig(ShowUI);
    }
    
  4. 保存文件。

7. 调试/验证提取行为

此时,最好进行诊断/验证检查。通过以下步骤,您可以手动测试应用及其提取和激活 Remote Config 值的方式/是否提取和激活 Remote Config 值。

该信息将作为模拟器、设备或编辑器日志的一部分进行打印。对于 iOS,您可以在 Xcode 中查看设备和模拟器日志。对于 Android,请运行 adb logcat 查看日志。如果您在 Unity 中通过按编辑器中的“播放”按钮来运行代码,日志会显示在“控制台”标签页中。

  1. 重新构建并运行应用(在编辑器中,使用设备或模拟器)。
  2. 游戏主菜单显示后,查看游戏的日志输出,其中应包含 FetchRemoteConfigActivateRetrievedRemoteConfigValues 中由 Debug.Log 生成的日志。这些消息应显示“正在获取数据…”和“远程数据已加载并准备就绪”。请注意这些消息开头的相应时间戳。
  3. 在游戏中,按 License
  4. Okay
  5. 等待游戏显示主菜单
  6. 查看游戏的日志输出,该输出应与上一步中的日志输出类似,但具有新的时间戳(与您运行游戏的系统时钟上设置的时间一致)。
  7. 在游戏中,按 Play
  8. 滚动出击
  9. 使用键盘箭头键将球移动到球门,系统会打开“关卡完成”菜单。
  10. 音量
  11. 等待关卡选择菜单加载完毕。
  12. 再次查看游戏的日志输出。它应与之前步骤中的日志消息相匹配,并具有较新的时间戳(与您运行游戏的系统时钟上设置的时间相匹配)。

如果上述任何一项未显示在您的应用中,则可能是提取和激活流程(或您的设备)的某些部分配置有误。如果未显示第一个日志,则游戏可能无法启动。查看编辑器控制台或设备/模拟器日志,了解有关项目/环境的警告和错误,并进行调查 - 问题可能很简单,例如连接到互联网。

如果加载菜单的初始日志显示,但后续日志未显示,请调查/重新实现 Assets/Hamster/Scripts/States/MainMenu.csAssets/Hamster/Scripts/States/BaseLevelSelect.cs 中的 Resume 方法。

8. 检测代码

现在,您已在 SetDefaultsAsync() 中配置了应用内参数值,并使用 FetchAsync()ActivateAsync() 使最新版本可用,接下来您将在代码中引用和使用这些值。

在 Remote Config 后端中设置值后,提取并激活这些值(或同时执行这两项操作),这些值便可供您的应用使用。如需使用这些值,请调用 GetValue(string key),并选择一个参数键作为实参。此方法会返回一个 ConfigValue,该对象具有一些属性,可用于以各种受支持的类型(stringboollongdouble)访问值。在此项目和大多数游戏使用情形中,您必须将后两种类型转换为更惯用的 intfloat。为确保这些转换不会导致问题,请确保在 Remote Config 中设置的初始值在应用代码中将要使用的类型的有效范围内。

  1. 通过将 using Firebase.RemoteConfig; 添加到以下文件的顶部来导入 Remote Config:
    • Assets/Hamster/Scripts/States/MainMenu.cs
    • Assets/Hamster/Scripts/MapObjects/AccelerationTile.cs
  2. 替换 AccelerationTile.csStart 方法:
    private void Start() {
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       Acceleration = (float)remoteConfig.GetValue(AccelerationTileForceKey).DoubleValue;
    }
    
    进行此更改后,加速度功能块施加的力的大小将更改为从 Remote Config 收到的值。
  3. 修改 MainMenu.csInitializeUI 方法的正文:
    private void InitializeUI() {
       if (menuComponent == null) {
          menuComponent = SpawnUI<Menus.MainMenuGUI>(StringConstants.PrefabMainMenu);
       }
    
       var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
       var subtitleOverride = JsonUtility.FromJson<Menus.MainMenuGUI.SubtitleOverride>(
          remoteConfig.GetValue(SubtitleOverrideKey).StringValue);
       // Only sets values if all fields of the override are non-default.
       if(subtitleOverride != null && subtitleOverride.IsValidOverride())
       {
          menuComponent.MenuSubtitleText.text = subtitleOverride.text;
          menuComponent.MenuSubtitleText.fontSize = subtitleOverride.fontSize;
          menuComponent.MenuSubtitleText.color = subtitleOverride.textColor;
       }
       ShowUI();
    }
    
    在此示例中,subtitleOverride 设置为在云端的所有字段都设置为非类型默认值的值时,更改主菜单屏幕上的字幕。

9. 远程设置参数值

现在,您的应用已完全插桩,可以开始在 Remote Config 服务器上配置参数和值了。在此 Codelab 中,我们将使用 Firebase 控制台进行设置。

  1. Firebase 控制台中,打开您的项目。
  2. 从菜单中选择“Remote Config”,查看 Remote Config 信息中心。
  3. 对于您在应用中定义并列在下表中的每个参数,请点击添加参数,粘贴参数名称(键),选择表中列出的数据类型,停用使用应用内默认值,然后粘贴新的默认值:

    参数名称(键)

    数据类型

    默认值

    acceleration_tile_force

    数字

    100

    subtitle_override

    JSON

    {"text":"We overwrote the subtitle","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}

    填充了 acceleration_tile_force 的 Remote Config 参数编辑器
  4. 点击保存以保存更改。
  5. 点击发布以发布新配置,并使新值可供游戏使用。
  6. 设置这些远程参数后,再次运行应用,并观察它们如何替换原始默认值。启用了调试菜单的 Mechahamster 主屏幕

10. 使用 Remote Config 条件提供变体

您可能需要根据用户所说的语言、所在位置、一天中的时间或所用平台来调整应用体验。借助远程配置条件,您可以单独或组合使用这些属性和其他属性,为用户提供不同的值(称为变体)。

条件的一个常见用途是更改 iOS 和 Android 平台之间的内容。请按照以下步骤实现一个条件,该条件可根据所用平台为 subtitle_override 提供不同的值。

  1. Firebase 控制台中打开项目的“Remote Config”标签页。
  2. 点击 subtitle_override. 的“修改”按钮
  3. 点击左下角的新增
  4. 在随即显示的下拉菜单中,将鼠标悬停在条件值上,然后点击创建新条件Remote Config 参数编辑器:条件值选项
  5. 当系统提示时,如果您定位的是 iOS,请将条件命名为“is iOS”;如果您定位的是 Android,请将条件命名为“is Android”。如果您同时定位这两者,只需在此处选择其中一个,并在 Codelab 的剩余部分中使用该选择。使用“定义新条件”对话框定义特定于 iOS 的条件
  6. 应用条件下,点击选择...下拉菜单,然后选择平台。然后,选择相应的平台。使用“定义新条件”编辑器选择 iOS 平台
  7. 点击创建条件以创建条件。“修改参数”对话框会重新显示,您现在可以设置一个值:
    • 如果您以 Android 为目标平台,请将设置为:
      {"text":"Level Up Android Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
    • 如果您定位的是 iOS,请将设置为:
      {"text":"Level Up iOS Version","fontSize":8,"textColor":{"r":0.0,"g":255.0,"b":0.0,"a":255.0}}
      
  8. 点击保存以保存更改。
  9. 点击发布以发布新配置,并使新值可供游戏使用。

如果您再次构建并运行游戏,应该会看到游戏的副标题替换为特定于平台的变体。

11. 配置 Remote Config 以接收实时更新

Remote Config 现在可以监听并处理对 Remote Config 模板的实时更新。应用可以订阅新的实时 Remote Config API,以监听配置更改和更新的值。

工作原理

如需监听更新,您的应用必须实现一个订阅 OnConfigUpdateListener 事件的方法。当一个或多个配置更新监听器处于订阅状态时,系统会自动提取新的 Remote Config 模板,并调用订阅的处理程序,这些处理程序可用于执行响应逻辑,例如激活新值并使其可供应用的其余部分使用。

实现实时 Remote Config

为了说明此功能在游戏中的运作方式,请对代码进行以下更改。

创建配置更新处理程序

使用“配置更新”事件的第一步是创建一个能够监听该事件的方法。将以下方法放置在 Assets/Hamster/Scripts/MainGame.cs 中:

   void ActivateValuesOnConfigUpdate( object sender, ConfigUpdateEventArgs args)
   {
      if (args.Error != RemoteConfigError.None) {
         Debug.Log($"Error occurred while listening: {args.Error}");
         return;
      }

      Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
      // Activate all fetched values and then logs.
      var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
      remoteConfig.ActivateAsync().ContinueWithOnMainThread(
         task => {
            Debug.Log($"Keys from {nameof(ActivateValuesOnConfigUpdate)} activated.");
         });
   }

此方法会在激活新值时向日志打印更新后的键列表和成功消息。

订阅 Update 事件

为了在调用事件时激活 ActivateValuesOnConfigUpdate,请将其订阅到该事件。将 Assets/Hamster/Scripts/MainGame.cs 中的 InitializeCommonDataAndStartGame() 方法替换为以下代码:

   void InitializeCommonDataAndStartGame()
   {
      CommonData.prefabs = FindObjectOfType<PrefabList>();
      CommonData.mainCamera = FindObjectOfType<CameraController>();
      CommonData.mainGame = this;

      Screen.orientation = ScreenOrientation.LandscapeLeft;

      musicPlayer = CommonData.mainCamera.GetComponentInChildren<AudioSource>();

      CommonData.gameWorld = FindObjectOfType<GameWorld>();

      // Set up volume settings.
      MusicVolume = PlayerPrefs.GetInt(StringConstants.MusicVolume, MaxVolumeValue);
      // Set the music to ignore the listeners volume, which is used for sound effects.
      CommonData.mainCamera.GetComponentInChildren<AudioSource>().ignoreListenerVolume = true;
      SoundFxVolume = PlayerPrefs.GetInt(StringConstants.SoundFxVolume, MaxVolumeValue);

      // Subscribes to on config update after first initial fetch and activate
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ActivateValuesOnConfigUpdate;

      stateManager.PushState(new States.MainMenu());
   }

新行(以 += ActivateValuesOnConfigUpdate; 结尾)将事件处理程序订阅到事件。

当处理程序的所属对象被销毁时,取消订阅

为了防止出现 null 引用错误,具有订阅事件的方法的对象在销毁时必须取消订阅该方法。将以下方法添加到 Assets/Hamster/Scripts/MainGame.cs

   private void OnDestroy() 
   {
      FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ActivateValuesOnConfigUpdate;
   }

测试新功能

如需验证新功能,请试用您构建的应用。以下过程要求您能够使用真实设备读取日志和进行调试

更改 acceleration_tile_force 并观察

启动应用后,在 Firebase 控制台的 Remote Config 部分中执行以下操作:

  1. acceleration_tile_force 旁边的“修改”按钮。

dc602d4db54e50a4.png

  1. 将值更改为“120”,然后按保存

fcbc1df848f88009.png

  1. 点击发布更改按钮。

3785c1e00e7a6359.png

  1. 检查日志。
  2. 如果您看到以“Error occurred while listening”开头的日志消息,请阅读其余部分,并尝试使用其输出的错误消息进行调试。
  3. 如果您看到以“Updated keys”开头的日志,则表示您的应用已收到更改后的值。
  4. 如果您未看到上述任何一项,请查看其余日志,然后重新查看创建配置更新处理程序中的说明,重新测试并重新检查日志,以确定是否存在任何问题。

12. 恭喜!

您已使用 Remote Config 通过在应用中提取游戏内值并使用条件来提供不同的变体,从而远程控制游戏内值!

所学内容

  • 如何设置和检索 Remote Config 值
  • 如何检测 Unity C# 代码以使用检索到的值
  • 如何将复合值/对象存储、检测和替换为 JSON 值
  • 如何使用 Remote Config 条件来投放不同的价值变体

后续步骤

请参阅参数值优先级,以便更好地了解当应用实例使用具有多个值的参数(由于条件或位置信息)时,会获取哪些值的逻辑。