美文网首页unity
Unity教程:Unity Remote Config的使用

Unity教程:Unity Remote Config的使用

作者: Calabash_Boy | 来源:发表于2019-12-04 17:35 被阅读0次

    远程配置可以使我们在不重新发包的前提下来实现如下功能:

    • 根据玩家的地区和语言进行更人性化的设置
    • 调整用户的游戏难度,使之有更好的游戏体验
    • 在特殊节日打开对应的特殊事件
    • 运行不同的颜色和样式方案,找到用户偏好的趋势
    • 监控用户群像时,逐步打开新的功能
    • 针对用户设备性能,提供最合适的游戏配置

    以上只是列出了广为人知的几个功能,通过这些手段我们可以更好的改进产品,提高用户粘度.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
    来打开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 有两种配置环境, DevelopmentRelease ,顾名思义,一种是测试环境,一种是生产环境,两种环境下对应的配置项是独立的,如果要在手机上测试 Development 环境的配置,在打包时需要打开 Development Build 开关,这样在手机上启动应用后从服务器拉取的才是 Development 下的配置.默认是 Release 环境配置.

    打开Development Build
    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可以打开本地设置界面.需要注意的是: 在本地的编辑需要推送到服务器才会被应用拉取到.

    Settings Config
    Dashboard
    Dashboard中的选项跟在Unity编辑器中的基本是一一对应的,大家可以自己对照下.
    我们这里就以Unity编辑器中的界面来讲解. Rules
    这里重点讲解一下 Conditon 选项:
    规则使用 Conditon 来定位该规则应用的用户群体, ConditonJEXL 表达式,这种表达式的更多信息请查阅:JEXL语法
    有三种类别的条件可以设置:
    1. 根据用户信息,使用内置的 user 字段和点语法,比如我们要对用户年龄大于18的人群使用该规则,可以设置 Conditonuser.age>18,关于 age 的定义见下一章.
    2. 根据应用信息,使用内置的 app 字段和点语法,比如要对应用的level大于2的人群使用该规则,可以设置 Conditonapp.level>2,关于 level 的定义见下一章.
    3. 使用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. 代码集成

    通过上面的学习,我们知道了如何设置规则和配置,那么我们应该如何获取这些规则和配置呢?
    我设置了三个配置,它们的默认值如下:

    Configs Example
    再来配置两条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
    

    可以看到,通过远程配置修改了我们本地配置的值.
    需要注意的是:

    1. 关于userapp两个结构体的数据,在初始化的时候需要保存下来,随着游戏的进程去更新对应的字段,比如用户修改了自己的年龄后,要去更新保存的user信息,这样每次远程配置请求的时候,取出保存的信息,发送给服务器,才能使配置的Rules起到准确的效果;在这里我使用的是 Newtonsoft.Json + PlayerPrefs来进行转换和存储,也可以通过写入到文件来读取.
    2. userapp两个结构体是可选的,如果没有需求,保持两个结构体为空就可以了.
    3. 关于代码中使用的类和方法,可以查看这里: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的基本使用,其实在整个流程中可以改进的点很多,我先来抛砖引玉.

    1. 关于远程配置功能的封装,该模块其实可以作为基本功能给每个新创建的App使用,因此可以集成到公共的Package中.
    2. 关于user以及app两个结构体应该具有扩展性,可以设置两个接口供外界返回两个对应的自定义结构体,然后再和默认的结构体数据合并后去请求远程配置.
    3. 关于配置项可以抽取为一个单独的Model,方便外界调用和修改.

    相关文章

      网友评论

        本文标题:Unity教程:Unity Remote Config的使用

        本文链接:https://www.haomeiwen.com/subject/nnshgctx.html