使用 Firebase Remote Config 对您的 Unity 游戏进行插桩处理

1. 简介

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

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

为了确保应用的行为符合预期,您需要为示例游戏代码中的值设置默认配置,并且这些值可以替换为您在 Firebase 控制台的 Remote Config 中设置的值。

学习内容

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

所需条件

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

2. 设置您的开发环境

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

下载代码

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

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

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

在 Unity 编辑器中打开 Level Up with Firebase

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

如需详细了解如何安装和使用 Unity,请参阅在 Unity 中工作

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

创建 Firebase 项目

  1. Firebase 控制台中,点击添加项目
  2. 如需创建新项目,请输入所需的项目名称。
    此操作还会根据项目名称将项目 ID(显示在项目名称下方)设置为相应的值。您可以选择点击项目 ID 上的修改图标,进一步对其进行自定义。
  3. 如果看到相关提示,请查看并接受 Firebase 条款
  4. 点击继续
  5. 选择为此项目启用 Google Analytics(分析)选项,然后点击继续
  6. 选择要使用的现有 Google Analytics(分析)帐号,或选择创建新帐号以创建新帐号。
  7. 点击 Create project
  8. 创建项目后,点击 Continue(继续)。

在 Firebase 中注册您的应用

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

添加 Firebase 配置文件

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

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

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

添加适用于 Unity 的 Firebase SDK

  1. 在 Firebase 控制台中点击下载 Firebase Unity SDK
  2. 将 SDK 解压缩到方便的位置。
  3. 在您打开的 Unity Project 中,依次点击 Assets(资源)> Import Package(导入软件包)> Custom Package(自定义软件包)。
  4. Import package 对话框中,前往包含解压缩的 SDK 的目录,选择 FirebaseAnalytics.unitypackage,然后点击 Open
  5. 在随即显示的 Import Unity Package 对话框中,点击 Import
  6. 重复前面的步骤导入以下两个软件包:
    • FirebaseRemoteConfig.unitypackage
    • FirebaseCrashlytics.unitypackage
      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(),以将 Firebase 初始化添加到 MainGame.cs Start() 方法中:
    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 方法的调用(会激活获取的值以将其用于代码)。

我们在上一步中添加的启动代码以 InitializeCommonDataAndStartGame 作为回调调用 FetchRemoteConfig,以便在序列结束时开始游戏。您可以将备用回调传递给 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 值的策略,请考虑何时需要新值以及何时开始提取和激活新值,以避免这些值在使用时发生变化。

如当前所实现的那样,系统会在应用启动时提取并激活 Remote Config 值。抓取操作可以在菜单更改期间隐藏,同时也会在转换期间阻止互动。此外,这通常是获取新值最相关的时间,因为菜单状态的变化通常可用于了解播放器的“位置”并预测将使用某个值。

查看 Mechahamster 的菜单系统,添加界面阻塞菜单刷新的最简单方法是在恢复主菜单之前(特别是通过退出另一个菜单进行访问时)调用它,然后将界面显示方法作为 onFetchAndActivateSuccessful 回调传递。对于 Level Select 菜单,您也可以执行相同的操作。

初始加载是应用启动过程的一部分,通过主菜单的所有菜单导航都将由第一个加载项处理,而再次进入 Level Select 菜单也会导致刷新。进入关卡选择菜单的初始入口无关紧要,因为它只能通过主菜单访问,因此已涵盖在内。

如需在应用中启用此功能,请在主菜单和级别选择文件中完成相关方法,这将会阻止界面显示,直到 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 值。

这些信息将打印在模拟器、设备或编辑器日志中。对于 iOS,您可以在 Xcode 中查看设备和模拟器日志。对于 Android,请运行 adb logcat 来查看日志。如果您在 Unity 中通过在编辑器中按 Play 来运行代码,日志会显示在“Console”标签页中。

  1. 重新构建并运行应用(在编辑器中,使用设备或模拟器)。
  2. 显示游戏的主菜单后,查看游戏的日志输出,其中应包含 Debug.LogFetchRemoteConfigActivateRetrievedRemoteConfigValues 中生成的日志。这些标签页应该会显示“正在提取数据...”和“远程数据已加载并就绪”消息。请注意这些消息开头的时间戳。
  3. 在游戏中,按许可
  4. 确定
  5. 等待游戏的主菜单出现。
  6. 查看游戏的日志输出,日志输出应该与上一步类似,只是添加了新的时间戳(与运行游戏的系统时钟上设置的时间一致)。
  7. 在游戏中,按开始游戏
  8. Let's Roll
  9. 使用键盘上的方向键将球引向目标,这会打开“完成关卡”菜单。
  10. 级别
  11. 等待 Level Select 菜单加载。
  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. 针对您在应用中定义的以及下表中列出的每个参数,点击添加参数,粘贴参数名称(键),选择表格中列出的数据类型,停用使用应用内默认值,然后粘贴新的默认值:

    参数名称(键)

    数据类型

    默认值

    加速平铺强制

    数字

    100

    subtitle_override

    JSON

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

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

10. 使用 Remote Config 条件传送变体

您可能需要根据用户使用的语言、所在位置、时段或所使用的平台来为用户提供应用体验。通过 Remote Config 条件,您可以单独使用或组合使用这些属性和其他属性,为用户提供不同的值(称为变体)。

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

  1. Firebase 控制台中打开项目的“Remote Config”标签页。
  2. 点击“subtitle_override.”的修改按钮
  3. 点击左下角的新增
  4. 在随即显示的下拉菜单中,将鼠标悬停在条件值上,然后点击创建新条件Remote Config 参数编辑器:\n“条件值”选项
  5. 当系统提示时,如果您以 iOS 为目标平台,请将条件命名为“is iOS”;如果您以 Android 为目标,请将条件命名为“is Android”。如果您同时以这两种方式作为目标平台,只需在此处选择一个,然后在此 Codelab 的其余部分中使用即可。使用“定义新的条件”对话框\n 定义 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

为了说明其在游戏中的工作原理,请对您的代码进行以下更改。

创建 Config Update 处理程序

使用配置更新事件的第一步是创建一个能够监听该事件的方法。将以下方法放在 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.");
         });
   }

此方法会在激活新值时将更新后的键列表和成功消息输出到日志。

订阅更新事件

如需在调用事件时激活 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

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

fcbc1df848f88009.png

  1. 点击发布更改按钮。

3785c1e00e7a6359

  1. 检查日志。
  2. 如果您看到以“Error found when billing”(监听时出错)开头的日志消息,请阅读其余部分,并尝试根据系统输出的错误消息进行调试。
  3. 如果您看到以“已更新的键”开头的日志,则表示您的应用已收到更改后的值。
  4. 如果您没有看到上述任何选项,请查看日志其余部分,然后再次查看创建配置更新处理程序中的说明,重新测试并重新检查日志,以确定是否存在任何问题。

12. 恭喜!

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

所学内容

  • 如何设置和检索 Remote Config 值
  • 如何对 Unity C# 代码进行插桩以使用检索到的值
  • 如何将复合值/对象存储、插桩和替换为 JSON 值
  • 如何使用 Remote Config 条件提供不同的值变体

后续步骤

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