远程设置 (Remote Settings) 组件
测试 Remote Settings

Remote Settings 脚本

使用 Unity Scripting API RemoteSettings 类可以在代码中访问 Remote Settings。RemoteSettings 类提供访问 Remote Settings 的函数(如 RemoteSettings.GetString())以及在提取或更新设置时可用于触发函数的事件。

事件 目的
BeforeFetchFromServer RemoteSettings 类发出网络请求以获取 Remote Settings 之前立即分发。
Completed 在网络请求完成时分发。即使网络请求失败且 Remote Settings 没有变化,也始终分发 Completed。可以使用传递给委托函数的 serverResponse 代码来确定请求是成功还是失败。该参数包含一个标准 HTTP 响应代码,例如 200 表示成功。
Updated 在网络请求成功完成后但仅在 Remote Settings 自上次检查后发生更改的情况下才分发。

注意:在 Unity 2018.1 之前,即使设置未更改,也始终分发 Updated 事件。如果您依赖委托函数在游戏中应用设置,无论是否有更改,都必须使用 Completed 事件而不是 Updated 事件。

应该在应用程序启动期间尽早为这些事件注册处理程序函数,例如在第一个 Unity 场景中加载的 MonoBehaviour 的 Awake() 函数中进行。

因为获取设置需要网络处理,所以 RemoteSettings 对象通过异步方式分发其事件。可能不会在每个平台上甚至不会在同一平台每次启动时以相对于其他事件的相同顺序调用您的处理程序函数。请始终用合理的默认值来初始化您的配置变量,并允许在应用程序启动期间的不同时间调用事件处理程序。

代码示例

以下示例显示的一个类定义了可调整游戏难度的多个属性,并根据 Remote Settings 更新这些属性:

using UnityEngine;

public class RemoteTuningVariables : MonoBehaviour {

    public float DefaultSpawnRateFactor = 1.0f;
    public float DefaultEnemySpeedFactor = 1.0f;
    public float DefaultEnemyStrengthFactor = 1.0f;
    public static float SpawnRateFactor{ get; private set; }
    public static float EnemySpeedFactor{ get; private set; }
    public static float EnemyStrengthFactor{ get; private set; }

    void Start () {
        SpawnRateFactor = DefaultSpawnRateFactor;
        EnemySpeedFactor = DefaultEnemySpeedFactor;
        EnemyStrengthFactor = DefaultEnemyStrengthFactor;

        RemoteSettings.Completed += HandleRemoteSettings;
    }

    private void HandleRemoteSettings(bool wasUpdatedFromServer, bool settingsChanged, int serverResponse){
        SpawnRateFactor 
            = RemoteSettings.GetFloat ("SpawnRateFactor", DefaultSpawnRateFactor);
        EnemySpeedFactor
            = RemoteSettings.GetFloat ("EnemySpeedFactor", DefaultEnemySpeedFactor);
        EnemyStrengthFactor 
            = RemoteSettings.GetFloat ("EnemyStrengthFactor", DefaultEnemyStrengthFactor);
    }
}

注意,该类在 RemoteSettings.GetFloat() 方法调用中提供了默认值。如果 RemoteSettings 对象无法找到指定的键(例如,如果您拼错键名称),该方法仍会将默认值分配给调整变量。否则,GetFloat()GetInt() 方法为数字分配零,GetString() 为字符串分配空字符串,而 GetBool() 为布尔值变量分配 false。

该类还为 Start() 方法中的属性分配相同的默认值,以防另一个类在获取 Remote Settings 之前访问设置而本地没有先前缓存的配置可用。在 Start() 方法中分配默认值可以确保这些属性始终有合理值。

确保设置一致性

如果您的游戏中有多个类在不同时间访问 Remote Settings,某些对象可能会在异步网络请求完成之前访问您的设置,而另一些对象则在之后访问设置,因此可能导致设置值不一致。要避免这种不一致问题,必须等待异步网络请求完成之后才访问设置,或者直接使用当前会话开始时的现有设置。在后一种情况下,本地设置在后台更新,玩家将在下一个会话中看到它们。

方法 优点 缺点
等待请求完成 - 设置值是一致的
- 始终使用最新设置
- 设置可用性的延迟不确定
- 异步代码复杂
使用当前设置 - 设置值是一致的
- 设置立即可用
- 在第二个会话才能使用新设置值
- 玩家第一次运行游戏时,没有可用的设置。(使用默认值。)

以下示例演示了一个提供程序类,该类根据从 Analytics 服务获取的最新版 Remote Settings 来分配其属性。RemoteSettings 类仍然在后台更新设置,因此任何设置更改都将在下一个会话(而不是当前会话)中使用。以下示例使用单例模式,因此无论何时 RemoteSettings 类接收到远程更新,使用这些设置的游戏的所有部分都将获得相同的值。

using UnityEngine;

public class RemoteSettingProvider : MonoBehaviour {
    public float DefaultSpawnRateFactor = 1.0f;
    public float DefaultEnemySpeedFactor = 1.0f;
    public float DefaultEnemyStrengthFactor = 1.0f;
    public float SpawnRateFactor{ get; private set; }
    public float EnemySpeedFactor{ get; private set; }
    public float EnemyStrengthFactor{ get; private set; }

    // 单例模式
    private static RemoteSettingProvider _instance;
    public static RemoteSettingProvider Instance
    {
        get { return _instance; }
    }

    void Awake()
    {
        if (_instance != null && _instance != this)
        {
            Destroy(this.gameObject);
            return;
        }

        _instance = this;
        DontDestroyOnLoad(this.gameObject);

        //在远程更新之前使用当前设置,如果设置(尚)不存在,
        //则使用默认值
        SpawnRateFactor
            = RemoteSettings.GetFloat("SpawnRateFactor", DefaultSpawnRateFactor);
        EnemySpeedFactor
            = RemoteSettings.GetFloat("EnemySpeedFactor", DefaultEnemySpeedFactor);
        EnemyStrengthFactor
            = RemoteSettings.GetFloat("EnemyStrengthFactor", DefaultEnemyStrengthFactor);
    }
}

使用此方法时,始终在玩家安装后第一次运行游戏时使用默认设置。

还可以使用混合方法,此方法使用 RemoteSettings.GetCount() 检查是否存在本地设置。如果设置存在于本地,则可以立即使用它们,但如果没有,则添加一个事件处理程序以等待设置 Updated 事件:

SpawnRateFactor
    = RemoteSettings.GetFloat("SpawnRateFactor", DefaultSpawnRateFactor);
EnemySpeedFactor
    = RemoteSettings.GetFloat("EnemySpeedFactor", DefaultEnemySpeedFactor);
EnemyStrengthFactor
    = RemoteSettings.GetFloat("EnemyStrengthFactor", DefaultEnemyStrengthFactor);


if(RemoteSettings.GetCount() == 0){
    //If there are no settings, get them from remote
    RemoteSettings.Updated += HandleRemoteSettings;
    Ready = false;
} else {
    Ready = true;
}

使用 Remote Settings 的其他类必须检查提供程序类的 Ready 属性,以确定访问设置是否安全。以下示例演示了一个等待设置并使用可配置超时值的类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RemoteSettingConsumer : MonoBehaviour {
    public float SpeedFactor = 0;
    public float StrengthFactor = 0;
    public float SpawnRateFactor = 0;
    public float Timeout = 0.125f;

    void Start () {
        StartCoroutine(GetRemoteSettings(Time.time));
    }

    IEnumerator GetRemoteSettings(float startTime){

        while(!RemoteSettingProvider.Instance.Ready && (Time.time - startTime) < Timeout)
            yield return null;

        SpeedFactor = RemoteSettingProvider.Instance.EnemySpeedFactor;
        StrengthFactor = RemoteSettingProvider.Instance.EnemyStrengthFactor;
        SpawnRateFactor = RemoteSettingProvider.Instance.SpawnRateFactor;
    }
}

如果在 Remote Settings 可用之前超时,则会使用默认值。使用超时值可以让游戏在正常情况下(即网络事务在非常短的时间内完成)获得最新设置,同时在网络故障的情况下通过等待请求本身超时确保了不会过度延迟启动。


  • 2018–08–23 页面已发布并进行了编辑审查
  • 2017.1 中的新功能
  • 2018–08–23 - 自 2018.1 版起,每个会话都不再分发更新的事件。
  • 截至 2018–08–23,服务与 Unity 5.5 之后的版本兼容,但是版本兼容性可能会发生变化。
远程设置 (Remote Settings) 组件
测试 Remote Settings