远程配置可以使我们在不重新发包的前提下来实现如下功能:
- 根据玩家的地区和语言进行更人性化的设置
- 调整用户的游戏难度,使之有更好的游戏体验
- 在特殊节日打开对应的特殊事件
- 运行不同的颜色和样式方案,找到用户偏好的趋势
- 监控用户群像时,逐步打开新的功能
- 针对用户设备性能,提供最合适的游戏配置
以上只是列出了广为人知的几个功能,通过这些手段我们可以更好的改进产品,提高用户粘度.Unity开发除了使用 Firebase 的远程配置,Unity官方在今年的二月份发布了自己的远程配置服务: Unity Remote Config,目前已经更新到了1.0.8版本,下面我会结合官方文档,介绍下这个服务的使用.
1. 使项目关联Unity Services
项目要使用Unity Services,需要一个Unity Services Project ID,通过该ID把项目连接到Unity Services,使之可以使用Services中的各项功能,比如 IAP, Ads 以及 Remote Config 等.可以在Unity编辑器内快速创建这个ID.通过 Window > General > Services 或者点击工具栏中下方标记出的图标
来打开Unity Services界面.首先需要选择 Organization ,一般是你在注册Unity时使用的账号. Organization
然后需要选择一个 Project Name ,默认是你当前打开的项目:
Project Name
至此,Unity Services Project ID创建完毕,现在可以使用 Unity Services 了.
更多信息请查阅: 创建Unity Services Project ID
2. 下载Unity Remote Config Package并配置环境
打开 Window > Package Manager ,搜索 Remote 关键字找到对应的Package下载.
Remote Config 有两种配置环境, Development 和 Release ,顾名思义,一种是测试环境,一种是生产环境,两种环境下对应的配置项是独立的,如果要在手机上测试 Development 环境的配置,在打包时需要打开 Development Build 开关,这样在手机上启动应用后从服务器拉取的才是 Development 下的配置.默认是 Release 环境配置.
Package下载完成后,我们就可以在 Window 列表下看到它:
Window > Remote Config
3. Settings Config(配置) and Rules(规则)
我们先来说明下这两个概念:
- Settings Config: 远程配置的基本单元,是一个 key/value 键值对,根据产品需求来定义该字段,代表应用启动后可能会被远程覆盖的字段.
- Rules: 配置启用规则,每种规则都可以包含不同的 Settings Config ,并决定这些配置在何种条件下启用.
在需求定下来之后, Settings Config 的值要确定,开发人员可以根据这些值来进行逻辑布局,而 Rules 则可以由PM根据要测试的情景在 Dashboard 中创建或者修改.
只看概念可能不太了解,我们通过实际操作来说明.
配置和规则的设置可以在Unity编辑器内部,也可以在网页上.点击 Window > Remote Config可以打开本地设置界面.需要注意的是: 在本地的编辑需要推送到服务器才会被应用拉取到.
Dashboard
Dashboard中的选项跟在Unity编辑器中的基本是一一对应的,大家可以自己对照下.
我们这里就以Unity编辑器中的界面来讲解. Rules
这里重点讲解一下 Conditon 选项:
规则使用 Conditon 来定位该规则应用的用户群体, Conditon 是 JEXL 表达式,这种表达式的更多信息请查阅:JEXL语法
有三种类别的条件可以设置:
- 根据用户信息,使用内置的 user 字段和点语法,比如我们要对用户年龄大于18的人群使用该规则,可以设置 Conditon 为
user.age>18
,关于 age 的定义见下一章. - 根据应用信息,使用内置的 app 字段和点语法,比如要对应用的level大于2的人群使用该规则,可以设置 Conditon 为
app.level>2
,关于 level 的定义见下一章. - 使用Unity预定义的属性:
属性 | 描述 | 例 |
---|---|---|
unity.appBuildVersion |
应用程序的构建版本号(Edit > Project Settings > Player)。 | unity.appBuildVersion == '1' |
unity.appVersion |
应用程序的版本号(Edit > Project Settings > Player)。 | unity.appVersion == '1.0' |
unity.cpu |
cpu处理器的名称。 | unity.cpu == 'Intel(R) Core(TM) i7-7920 HQ CPU @ 3.10GHz' |
unity.cpuFrequency |
运行设备的处理器频率(MHz)。 | unity.cpuFrequency >= 3100 |
unity.country |
国家/地区编码。此属性使用 ISO 3166-1 alpha2 国家/地区代码。 | unity.country == 'US' |
unity.language |
语言编码。此属性使用 ISO 639-1 语言代码。 | unity.language == 'en' |
unity.osVersion |
运行应用程序的设备的操作系统版本。 | unity.osVersion == 'Mac OS X 10.14.4' |
unity.platform |
适用的设备或平台。可以是以下值:Android iOS Linux macOS Metro SamsungTV Switch Tizen tvOS WebGL Wii Windows
|
unity.platform == 'iOS' |
unity.timeSinceStart |
应用程序会话开始以来的时间(以毫秒为单位)。 | unity.timeSinceStart >= 60000 |
unity.graphicsDeviceVendor |
用户图形卡的供应商。 | unity.graphicsDeviceVendor == 'ATI Technologies Inc.' |
unity.ram |
设备上的RAM内存量,以MB为单位。 | unity.ram >= 16384 |
unity.model |
设备的型号。 |
unity.model == "LGE Nexus 5" 或者 unity.model.contains("Nexus")
|
还可以使用逻辑表达式来作为表达式:user.score >= 10 && app.level == 5
.
如果想让此规则适用于所有用户, 只需要填写 true
就可以了.
我们来看几个例子:
- 根据应用关卡的 level ,关卡越高,敌人越多,敌人伤害越高
level rule -
根据特定节日来配置规则
halloween rule
更多关于配置和规则的信息: Rules and Settings
还可以使用 REST API
来设置规则和配置: REST API
4. 代码集成
通过上面的学习,我们知道了如何设置规则和配置,那么我们应该如何获取这些规则和配置呢?
我设置了三个配置,它们的默认值如下:
再来配置两条Rule:
Vip_Rule
Score_Rule
Vip_Rule: 对于
app.level>5
的用户, Money
被修改为 8888
,isVip
被修改为 False
.Score_Rule: 对于
user.score>100
的用户,Name
被修改为ScoreKing
.配合下面的代码,我们来看打印结果.
using UnityEngine;
using Unity.RemoteConfig;
using Newtonsoft.Json;
public class RemoteConfigExample : MonoBehaviour {
public struct userAttributes {
// 这个结构体用来定义用户画像相关的字段,如果不需要,请设置为一个空的结构体.
// 下面的字段都可以使用 user 配合点语法设置为 condition.
public int score;
public int age;
}
public struct appAttributes {
// 这个结构体用来定义应用相关的字段,如果不需要,请设置为一个空的结构体.
// 下面的字段都可以使用 app 配合点语法设置为 condition.
public int level;
public string appVersion;
}
// 每次请求都会生成一个 assignmentId, 可以用来分析和追踪请求数据
public string assignmentId;
// 这里声明的就是我们需要远程动态配置的字段了.必须设置合适的默认值
public bool isVip = false;
public int Money = 100;
public string Name = "Default Name";
void Awake () {
// 在这里我们设置为应用启动的时候去请求远程配置
// 添加一个回调
ConfigManager.FetchCompleted += ApplyRemoteSettings;
// 可以设置自定义的CustomUserID,用来分析和筛选用户数据
ConfigManager.SetCustomUserID("calabash_one");
// 因为存在请求不回来或者回来的时候应用已经启动的情况,因此必须要给字段设置合适的初始值.
// app和user的数据初始化后需要存储在本地,等待下次获取远程配置的时候取出使用
userAttributes user = new userAttributes();;
string userStr = PlayerPrefs.GetString("userKey2");
if (string.IsNullOrEmpty(userStr))
{
user.score = 101;
string key = JsonConvert.SerializeObject(user);
PlayerPrefs.SetString("userKey2", key);
}
else
{
user = JsonConvert.DeserializeObject<userAttributes>(userStr);
}
// 这里懒得存了 大家理解意思就好
appAttributes app = new appAttributes();
app.level = 6;
// 使用下面的API来获取远程配置
ConfigManager.FetchConfigs<userAttributes, appAttributes>(user, app);
}
// 使用回调来接收远程配置的数据:
void ApplyRemoteSettings (ConfigResponse configResponse) {
switch (configResponse.requestOrigin) {
case ConfigOrigin.Default:
Debug.Log ("No settings loaded this session; using default values.");
break;
case ConfigOrigin.Cached:
Debug.Log ("No settings loaded this session; using cached values from a previous session.");
break;
case ConfigOrigin.Remote:
Debug.Log ("New settings loaded this session; update values accordingly.");
assignmentId = ConfigManager.appConfig.assignmentID;
isVip = ConfigManager.appConfig.GetBool("isVip");
Money = ConfigManager.appConfig.GetInt("Money");
Name = ConfigManager.appConfig.GetString("Name");
Debug.Log("isVip: " + isVip + "Money: " + Money + "Name: " + Name);
Debug.Log(ConfigManager.appConfig.GetKeys().Length);
break;
}
}
}
打印结果如下:
isVip: False Money: 8888 Name: ScoreKing
可以看到,通过远程配置修改了我们本地配置的值.
需要注意的是:
- 关于
user
和app
两个结构体的数据,在初始化的时候需要保存下来,随着游戏的进程去更新对应的字段,比如用户修改了自己的年龄后,要去更新保存的user
信息,这样每次远程配置请求的时候,取出保存的信息,发送给服务器,才能使配置的Rules
起到准确的效果;在这里我使用的是Newtonsoft.Json + PlayerPrefs
来进行转换和存储,也可以通过写入到文件来读取. -
user
和app
两个结构体是可选的,如果没有需求,保持两个结构体为空就可以了. - 关于代码中使用的类和方法,可以查看这里:Scripting API
5. Assignment reports(摘要报告)
在Dashboard
中可以生成Assignment reports
,有两种格式,一种是Summary
,另一种是Aggregate
,格式都是csv
.
- Summary可以看到更多的用户信息.
列名 | 描述 |
---|---|
projectId |
项目的ProjectId ,在文章第一步的时候生产,在Dashboard 中可以查看到 |
userId |
由Unity生成的随机GUID,用于唯一标识使用应用程序的用户(重新安装后可能会更改),使用的是原始ID的哈希值。 |
customUserId |
开发人员生成的唯一标识符。使用的是原始ID的哈希值。 |
assignmentId |
用户发起远程配置请求时生成的唯一ID。 |
ruleId |
分配给用户的规则的GUID。 |
ruleName |
分配给用户的规则名称 |
ts |
GMT时间戳。 |
- Aggregate可以看到对应规则的人群数量.
列名 | 描述 |
---|---|
ruleId |
分配给用户的规则的GUID。 |
ruleName |
分配给用户的规则名称 |
unique_user_count |
该规则下的用户数量 |
6. 后续改进思路
通过上面的学习和实践,相信大家已经掌握了Unity Remote Config的基本使用,其实在整个流程中可以改进的点很多,我先来抛砖引玉.
- 关于远程配置功能的封装,该模块其实可以作为基本功能给每个新创建的App使用,因此可以集成到公共的Package中.
- 关于
user
以及app
两个结构体应该具有扩展性,可以设置两个接口供外界返回两个对应的自定义结构体,然后再和默认的结构体数据合并后去请求远程配置. - 关于配置项可以抽取为一个单独的Model,方便外界调用和修改.
网友评论