大多数浏览器和
Developer App 均支持流媒体播放。
-
将定期更新的排行榜引入您的游戏
定期更新的排行榜是鼓励玩家不断回归游戏的好方法。请随我们一起编程,我们将带您了解如何在 App Store Connect 以及您的游戏中设置定期更新的排行榜。在开始此编程临摹课程之前,如需回顾定期更新的排行榜和经典排行榜之间的一些差异,我们建议您观看 WWDC20 的“深挖 Game Center:排行榜、成就和多游戏玩家”的“定期更新的排行榜”部分。
资源
相关视频
WWDC22
WWDC21
WWDC20
-
下载
嗨 我是来自 GameCenter团队的哈里森 欢迎加入我一起了解 如何将定期排行榜带到游戏中 GameCenter为玩家 提供了方便的身份 来访问他们在游戏中的所有数据 作为开发者 GameCenter 允许你轻松地 加入像是成就系统、多人模式 或排行榜等功能 也就是我今天要讲的主题 以下是手把手的步骤 首先是一些初始设定 再来 我会做个快速回顾 是关于GameCenter的排行榜类型 以及用游戏演示来加以说明 最后 我会在AppStoreConnect中 加入定期排行榜 并在演示游戏中 展示几种不同的使用方式 先从一些设置开始吧
我们在开发者入口准备了 与Xcode 13适配的项目 来帮助你开始 我建议你们先暂停影片去下载
下载完后继续播放 我会带领你 走过初始设定流程 在你们下载的文件夹里 你会找到一个叫做 The Coast的Xcode项目 直接打开它 因为你们要修改这个应用 并使用GameCenter的功能 这需要向你的团队注册 跟着做 需要的话就按暂停 首先 在项目导览器中 选择TheCoast项目文件 接着 从Targets清单中 选择TheCoast 在Signing& Capabilities 面板中 从Team菜单中选择你的团队 如果你的Apple ID或团队 没有出现在菜单上 首先选择Add an Account 接着输入Apple ID信息 接下来 设定Bundle ID为 唯一识别码 你必须改变bundle ID 才能继续 如果可以的话 点击Register Device 来创建供应配置文件
一但你成功注册了 状况列上不会有任何警告信息
现在你的bundle ID 已经注册完成了 你可以往AppStoreConnect里 添加应用记录 在右上角的AppStoreConnect 选择你在注册bundle ID时 使用的团队 然后 来到My Apps页面 点击左上角的加号 并选择New App 你要开发的是iOS独占应用 所以平台选择iOS 选择合适的名字、主要语言和SKU 至于bundle ID 确保你选择了 在Xcode里注册的bundle ID 在所有必填的字段都填好后 选择Create来添加应用记录 我们稍后会再回来到 AppStoreConnect 但现在 我要对排行榜做个简短回顾
所有排行榜都让玩家能看到 他们在朋友及全球玩家中表现如何 排行榜种类主要是由 排行榜启用的时间长度为区别
传统排行榜永远都在启用状态 没有终点 上头保有了一直以来的排名 以及每周和每日更新排名 对于积分来说非常实用 例如赚取的总经验值 或是目前的硬币数量 另一方面 定期排行榜 是短期的排行榜 会在开发者订定的周期内重复 例如每5分钟 或每30天 你可以取得当下启用中的 排行榜事件 也可以取得 最近期完成的、由玩家发布的事件 从终止时间起最多达30天 定期排行榜适合作为周期性的 限时活动 例如每周日下午的 一小时挑战 或是每周的新排行榜 在本环节中 我会点出一些 使用定期排行榜的特定方法 但首先 先回到你在Xcode 开启的项目上 专门为在iOS装置 或模拟器上运行而打造
这是The Coast的标题画面 现在画面上只有开始游戏的按钮 直接按下“PLAY” 游玩方式非常直观 点击每艘你看到的船 来获取分数 每一场有60秒 在最后 你会有重玩 或回到标题画面的选项 如果你选择右上角的菜单按钮 你可以提早结束 现在 这是如何执行的?
我会重点提示几个主要的类别 TitleScreenViewController 负责的是 标题画面 这之后在与 GameCenter认证会用到 这主要是在PLAY键被按下时 用来呈现GameViewController的
GameViewController非常简单 这会在载入视图后带出一个 叫做GameScene的 SpriteKit场景 以及拥有叫做endGame的 代理方法 来回到标题画面 来看看GameScene吧 它是用来管理所有游玩逻辑的
在呈现时 这会建立出 几个SpriteKit的节点 其中一个是用背景图片创建的 这会根据你的装置屏幕大小调整 而其他所有的节点 会作为子节点被添加进去 另一个则是scoreLabel 一个SKLabelNode 位于屏幕的左上角 显示目前的分数 最后则是CountdownNode 显示玩家剩余的时间 并在时间到时通知GameScene 在添加完这些节点后 setupBoatNodeWithActions() 也被叫出来了
这会引发一系列的SpriteKit动作 使船的雪碧图在关卡过程中 淡入及淡出
而touchesEnded方法 则会在点击及分数增加时被覆写 以移除那些船只的雪碧图
在倒数的最后阶段 在timeIsUp方法里
背景上的所有节点都会被移除 而画面上会出现最终分数的菜单 定期排行榜有很多方法可以被利用 来提升玩家对The Coast的体验 但今天 我会聚焦在三个点上 首先我会告诉你们如何通过 24小时循环排行榜来建立每日总结 然后展示如何与GameCenter的 默认排行榜UI连结 这或许是添加定期排行榜 最简单的方法 也是让玩家知道自己 与其他玩家差距的好方法 每日的频率确保每个人都有 新的机会冲上榜首 接下来我会展示游戏中的实时排名 这会为游戏带来更大的刺激 当玩家能够马上看见 自己的表现如何 以及距离榜首有多近 最后 我们会利用目前的排行 和先前的状态 来呈现一个玩家随着时间的改变 这个简单的方法给予了玩家 在游戏中进步的感觉 让我们开始吧 我先前提过了 我会运用 每日更新的排行榜 在你们把排行榜应用在游戏中之前 得先在AppStoreConnect 进行配置的调整 拉到Safari上 打开你的应用
找到Features页签 确认勾选GameCenter 再来 点击排行榜旁边的加号 选择定期排行榜选项 传统及定期排行榜两者 都有六个字段可供调整 排行榜的参考名称是被用在 AppStoreConnect之中的 选择具描述性的名字 例如“每日高分” 而排行榜ID则是用来代表 你在应用程序中的排行榜 简单来说 我使用了 和参考名称一样的描述性值 分数格式种类决定了分数在 GameCenter UI中呈现的格式 The Coast的得分都是整数 但其它游戏可能会使用时间和金钱 如果玩家对同一个排行榜 提交了多个分数 分数提交种类则决定了 要将哪一种列入排名 最佳得分或是最近得分 非常适合用在The Coast上 因为你们想要记录 玩家当天的最高分数 分类顺序决定了玩家的分数 和其他人之间如何排名 对The Coast而言 越高分越好 所以选择High to Low 你可以为分数的值选定一个范围 任何超出范围外的分数都会被拒绝 这对减少作弊很有用 我要设定最低为0 最高为200 因为我不期待玩家 得分会超出这个范围 定期排行榜还有这些 额外的必填字段 开始日期与时间就是排行榜 首次启用的时间 以世界协调时间为主 你不能设定从过去开始 所以选定即将到来的日期与时间 例如一分钟后 如此你就可以开始 马上使用排行榜了 时长是分数在排行榜上 出现的时间长度 每日排行榜当然是以一天为限 Restarts Every表示 排行榜上事件刷新的频率 频率必须要大于或等于时长 如此事件之间才不会重叠 The Coast在事件之间 不需要任何间隔 所以把它设定为和时长相等 这里有张图表 显示了这些字段 如何影响事件的生成 例如将开始时间设定为 6月11日早上9点 一个事件便被生成了 你可以在一天的期间内 对该事件提交 根据我们所设定的时长 而在事件过期后 6月12日早上9点 新的事件就会被创建出来 因为重启游戏是根据时长而设定的 这个过程会无限地继续 最后要设置的是本地化信息 排行榜需要这个才能顺利 在GameCenter UI上显示 至少得设置一种语言 我要以英语作为设置 为每日排行榜 选定适当的显示名称 例如“每日高分” 你还得选定分数的格式 就整数而言 你可以选用句号 或是逗号来区隔千位数 哪一种最适合你的语言 就选它 分数格式后缀是个 明确表示分数单位的好方法 例如得分或命中数 在The Coast上我决定空着 排行榜图片并非必要 但建议使用 因为看上去会更符合 你的游戏在GameCenter中的UI风格 这张图片来自这个项目的 素材目录 叫做leaderboardImage 把它上传 一但你储存了排行榜 就能通过GameCenter验证 并用在你的游戏中 所以让我们打开 GameCenter验证吧 在TitleScreenViewController中 有个方法叫做 authenticateLocalPlayer() 而它的本体被注释掉了 我们把它反注释 这段代码会在本地玩家端 设定认证处理程序 就会在启动时 触发GameCenter的登入流程 如果你需要更多信息 请参照以下链结的文档 现在我们可以提交分数了 稍早我在GameScene里 展示的这个方法 能够在触碰结束时显示分数 这叫做touchesEnded 找出它
那边有两个submitScore方法 其中一个是类别方法 另一个是实体方法 当你以类别方法提交时 该提交会被送到任意时间内 运作中的事件里 如果没有任何 运作中的事件 就会失败 为了使用实体方法 首先得载入GKLeaderboard 来代表目前的事件
然后 当你在事件完成处理程序 提交分数时 只有在事件处于作用中 才会成功
假如有一款游戏 每小时都会有独特的挑战 所使用的是每小时定期排行榜 你不会希望某个挑战的分数跑到 下一个挑战的事件里 例如说玩家与服务器 之间的网络延迟所导致的缘故 实例提交分数方法 可以确保这不会发生 The Coast的每日排行榜 并没有被绑在 特定的游戏环节上 所以不管 接收分数的是哪个事件 都没关系 我们来使用类别方法吧
现在 分数会被提交到 目前作用中的排行榜事件中 记得我把context设定到了0 context可以被用来 把游戏中的特定信息编码 并和分数存储在一起 而在The Coast上 分数并不需要任何额外的context 现在 你想要提交分数 到每日排行榜上 再来加入一个按钮 在GameCenter UI里显示排行榜 让它出现在标题画面上 首先 来到 TitleScreenViewController
你会需要创建一个新的 IBAction方法
叫做showLeaderboardVC
以GKGameCenterViewController 作为实例
提交排行榜ID
还有playerScope… 我使用的是global… 还有时间范围 对于定期排行榜来说 时间范围必须是allTime
设定gameCenterDelegate 为“self”
再来显示它
你也必须创建一个UIButton
我要把我的称为 leaderboardButton
接着在主故事板上 把所有东西连接起来 我们为你提供了排行榜的字样 就放在素材目录里 用这张图片添加按钮 然后移除文字 我现在要来设置比例限制 确保字样不会被拉伸变形
再来 把它放置在游玩按钮旁边
在你的新方法上 设置Touch Up Inside事件
在新按钮上设定一个新的 referencing outlet
现在建立并运行这个应用程序 测试一下你的排行榜
你们可能都被推广过 登入GameCenter了 现在就做吧 因为排行榜 需要认证过的账户才能运作 点击排行榜的字样 能直接把你带领 到GameCenter UI中的排行榜 如果你还没玩过 排行榜会是空的 简短地玩一下 然后回头检查排行榜 来看看你的新分数
现在你有了新的排行榜 然后也提交了分数 再来让我们在游戏中 添加实时分数吧
来看一下LeaderboardNode类别
这个SpriteKit节点需要一个 由名字和分数组成的排行榜条目列表 接着再根据排名显示出来 可以用条目来初始化 并在 条目有需要更改时更新 加入备用的LeaderboardNode 作为GameScene的成员
我们在setupInitialGameplay中 将排行榜的位置初始化 将下面的节点也初始化
我会用五列来调整它 然后初始条目留下空白
将其添加于背景节点中 来让它显示在场景里
现在我们得载入条目 并更新排行榜 我要为了这个 创建一个updateLeaderboardNode函数
首先 载入“每日高分”排行榜
在完成处理程序中 利用排行榜 来从全球排名中载入前五名的条目 因为这是定期的排行榜 所以时间范围会永远都是allTime
一旦这些都载入了 你得把 GameKit条目转换为 LeaderboardNode使用的 LeaderboardEntry架构 如果条目不为空值的话
♪ ♪
再来 叫出排行榜节点的 updateEntries方法
最后一步是在整个游戏过程中 更新排行榜的节点 本游戏中 玩家的分数会常常变动 你必须要让LeaderboardNode 保持同步 为了做到这点 请在 submitScore的完成处理程序中 叫出updateLeaderboardNode()
为了在玩家得分前 顺利显示排行榜 请在该节点被创建后 马上呼叫
现在我要建立并且再运行一次
我有几个朋友和我一起玩 你可以看到排行榜 随着我们分数的增加 不断在更新
我要做的最后一个更动 就是呈现 玩家当日的排名与前日有何不同 在时间截止时 我会把它放进 GameMenuNode里面
我会使用一系列的嵌套完成处理程序 来实行这点 但通过GameKit的 新的异步方法能让这份代码 变得更好读 创建新的异步方法 就叫它addRankToGameMenu()
因为GameKit的 异步方法可以抛出 你一定想要接到所有错误 我要把它们记录下来
载入每日排行榜 并确认它成功返回 在这个排行榜的实例中 需要做两件事 首先 通过“async let” 以异步方式载入条目 我会把“for”参数留空白 因为我只关心本地玩家的分数
再来 异步载入先前的 排行榜事件 并用它们来载入条目
我必须在gameMenuNode上 写出一个方法 才能显示这个信息 就叫它addRankNode吧
提交目前和先前的排行
你会需要用到“try await” 等待它们准备好
继续从timeIsUp的分离模块中 叫出新的异步方法
再来 前往GameMenuNode 实行addRankNode
addRankNode会通过 先前和目前排名的差别 生成一些简单的文字
如果两个排名都是空值 在标签节点中显示文字 我要使用辅助函式来创建它
把它放好
以水平居中添加它 并且垂直方向稍微往下偏一点
接着 添加到背景里
现在来看看结果吧
我昨天有玩 所以我看得到先前的排名 如你所见 我的排名稍微落后了 继续玩下去的好理由 在本环节中 我已经展示了 如何在AppStoreConnect中 设置定期排行榜 然后如何通过提交分数 运用在游戏中 与GameCenter的 排行榜UI连结 然后运用排行榜API 来实时显示全球排名 以及先前事件中的排名 想知道有关定期排行榜的更多信息 请看《深入了解Game Center: 排行榜、成就 与多人游戏》 就在去年的WWDC中 也请记得收看 《GameCenter的新鲜事》 就在今年的WWDC里 [打击乐]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。