Unity 最新上线了 Unity Gaming Services (UGS) Use Cases 学习手册,其中的每一个样例都采用典型的游戏后端和游戏设计,用户可以参考项目中的代码来学习各种 Unity Gaming Services 的应用方法。样例的代码清晰明了,所有水平的开发者都能轻松地阅读并理解。https://github.com/Unity-Technologies/com.unity.services.samples.use-cases
本文将讲解其中的一个项目——战斗通行证。
战斗通行证是一种用游戏奖励来留住玩家、用付费奖励提高游戏长期收入的机制,现在愈发收到市场的欢迎。它一般可以拆解成以下几步: 玩家在进行游戏的过程中获得积分,用于解锁更高级的奖励。 厂商一般会设置两条并行的奖励路线:b. 另一条更为高级的奖励则需要通过购买通行证解锁,购买通常使用游戏代币完成。
一条奖励路线仅会在限定时间内可用,时限通常为一个“赛季”。
本文将解释该样例的原理及其实际应用的方式。
对于在线游戏,尤其是多人游戏,服务器应该主宰着大部分玩家数据的裁定权,这么做可以有效防止作弊。 同理,为了保证季节性奖励和通行证的公平性,所有的数据及其修改都必须由服务器进行管理。
在本样例中,Cloud
Code (beta) 服务
解决了绝大部分后端基础设施相关的任务。Cloud
Code 支持用户远程编写和运行游戏逻辑。
本样例还用到了支持上传玩家存档至云端的 Cloud
Save (beta),以及不少其他工具。此时,每名玩家的赛季进度都可以被存储到一个扁平化键值系统中。而赛季每一条通行证奖励的所有权标签也会被储存到 Cloud
Save 里。
Game
Overrides(由Remote
Config驱动)支持让开发者个性化玩家体验,并编排当前赛季的内容和战斗通行证的等级。
战斗通行证的所有奖励等级,即游戏代币及物品,都是用 Economy (beta) 管理的。我们还用 Economy 设置了一项用宝石换取通行证的购买选项。
和所有用线上后端管理玩家数据的游戏一样,玩家要想开始游戏就必须用账号登录。为了实现这个功能,我们使用了 Authentication (beta)。当用户登录时,UGS 的 SDK 将自动在每次服务器请求中加上玩家独特的 ID。
客户端从 Game Overrides 或 Cloud Code(只读)获取季节性奖励的配置数据。客户端使用这些数据来生成 UI。Cloud Code 将根据数据来决定玩家所能领取的等级奖励。 Cloud Save 将跟踪玩家的奖励路线等级。两条互不干涉的奖励路线将被赋予三种可能的状态(值):锁定(Locked)、解锁(Unlocked)或已领取(Claimed)。 Cloud Save 还存有一个专门值用以判定玩家是否已经购买了通行证。
客户端可以直接用 Cloud
Save 获取并设置玩家状态,但是,这样做会导致游戏变成客户端权威,而非服务器权威,这就为黑客们打开了方便之门。在使用 Cloud
Code 时,我们可以在数据写入 Cloud
Save 之前验证其改动。
此外,直接从 Cloud
Save 中读取玩家状态可能会导致游戏错误地读取前一个赛季的数据。而在有了 Cloud
Code 时,我们就可以在赛季结束时自动重置玩家的通行证等级。
本样例提供了一个功能齐全、服务器权威的 UGS 战斗通行证应用实例。
季节性奖励与 Game
Overrides
你可以在 Unity
Dashboard 中发起一次 Game
Overrides 活动并用 JSON 进行设置,以此来确定某段时间内的通行证配置。
一次活动的时间跨度并不受限,你既可以举办一个小时、一次周末的特别活动,也可以举行持续几个月的赛季通行证活动。
Cloud Code 的服务器权威游戏逻辑
玩家通过与游戏 UI 的互动来向 Cloud
Code 发送以下请求: 获取赛季 XP 领取奖励 购买战斗通行证
记录玩家赛季进度 将进度数据返回给游戏客户端
其中一些调用更是可以直接发送给 Economy 或 Cloud
Code。在有这么多请求类型时,如果赛季已经更替或是玩家刚刚接触游戏,你还需要重新初始化玩家的赛季进度。
并且,客户端不可能在每次发出请求之前都判定一次赛季数据是否需要初始化。在该样例中,玩家在升级通行证(并且已经领取完免费奖励)后,过去累积的奖励会被自动赠与。正因为如此,购买战斗通行证只能用一段 Cloud
Code 的函数处理。
该函数会呼叫 Economy 完成一次有费用但无奖励的购买。如果购买成功,有两件事会发生: 通行证将以 Cloud Save 值的形式被授予给玩家,这个值只能代表当前赛季的战斗通行证。 玩家将获取所以已经达成的通行证等级奖励。
季节性奖励和战斗通行证有许多的设计可能——Unity
Gaming Service 并不会限制 UGS 的用途。
用户可以自行确定奖励等级的规划,有些等级不一定要包含免费奖励。或者,比起线性的奖励路线,用户更喜欢一种更复杂的系统:让玩家自由地在奖励页面选择自己的奖励组成,在全部达成后解锁下一页。UGS 支持几乎所有复杂度的战斗通行证。 在这个样例中,大部分奖励都是游戏代币,但多人游戏更为常见的奖励是饰品。用户可以根据游戏联机与否来设计战斗通行证。
也可以使用 Unity In-app
Purchase 软件包来应用现金付款,取代游戏代币。
Unity Gaming Services Use Cases
Unity Gaming Services 的 Use Cases 集合除了通行证外还包含了其他几种样例。
战利品箱(loot boxes):用 Cloud Code 随机奖励玩家 Economy 上的代币/通货。 每日奖励(daily rewards):定期奖励玩家随机的代币和物品集。 新手包(Starter Pack):用 Cloud Code 向玩家提供一次性的新手包购买机会。
季节性事件(seasonal events):远程更新限时性的特殊游戏内容。 关卡难度的 A/B 测试:用玩家分组测试并找出最吸引人的游戏变量(这里是升级所需的 XP 量)。 放置点击小游戏:像放置游戏那样实时更新服务器的权威游戏状态。 云端 AI 小游戏:在服务器权威的简单井字棋游戏中对抗具备持久性状态、代币奖励和玩家数据、运行于 UGS 上的简单 AI。 命令批处理:将游戏命令归入一个队列在服务器上一次性执行,减少游戏过程中呼叫服务器的数量和频率。
欢迎时不时地来看看我们的 GitHub 仓库,这个项目将继续发展并推出更多的 UGS 用例。
https://github.com/Unity-Technologies/com.unity.services.samples.use-cases
长按关注
第一时间了解Unity引擎动向,学习最新开发技巧