大多数浏览器和
Developer App 均支持流媒体播放。
-
Game Center 的新增功能:小组件、好友功能及多人游戏改进
您可使用 GameKit 提升您的在线游戏体验,并在您的游戏中实现多人游戏、排行榜和成就等功能。我们将带您了解 Game Center 的最新改进,包括玩家匹配和多人游戏 API,并探索如何增强游戏的发现率。
资源
相关视频
WWDC22
WWDC21
WWDC20
-
下载
♪低音音乐播放♪ 艾莉卡兹穆查:大家好 我是艾莉 Game Center的 工程项目经理 我真的很高兴能花一些时间 带你了解我们今年所做的所有改进 今年春天我们还推出了 一些很棒的新功能 比如Friends API 我们也将与你讨论这一点 但在我进入其中一些细节之前 我想简单谈谈一些核心功能 Game Center优惠 其中许多已于去年完全更新 Game Center是Apple 自己的社交游戏网络 作为开发人员 你可以利用任何Game Center功能 通过我们的GameKit框架 在你的游戏中发挥作用 对于玩家来说Game Center 有单一的游戏ID 可以让他们立即在排行榜上竞争 追踪成就进度 一起玩多人游戏 甚至查看他们朋友的个人资料 帮助玩家寻找和发现伟大的新游戏 也是Game Center的主要目标之一 我们在iOS 14中添加了很多功能 来帮助提高游戏的可发现性 而今年我们增加了更多 游戏跟社群息息相关 而了解我们的朋友正在玩什么 是发掘我们可能错过的 新作品的好方法 这就是我们去年直接将Game Center 与App Store整合的原因 我们现在会显示 有关你的Game Center 好友最近在做什么的更多信息 通过App Store的游戏 和街机选项页签 让我们仔细看看 在浏览Arcade选项卡时 我可以看到我的几个 Game Center朋友 正在玩一些我觉得有趣的游戏 包括一款名为 《Wonderbox》的新游戏 让我们查看产品页面以了解更多信息 我不仅可以阅读 有关游戏本身的更多信息 在产品页面上 还可以查看我的 Game Center好友的完整列表 谁已经在玩那个特定的游戏 点击其中之一会显示他们的 Game Center个人资料 从这里 我可以看到更多他们一直在玩的游戏 如果我看到一个我喜欢的 我可以直接从他们的个人资料中下载 “好友正在游玩”区块 将会自动出现在 所有支持Game Center游戏的 产品页面上 当然 还有 在App Store之外也有机会 也可以查看朋友的个人资料 例如 我可以点击任何排行榜中的朋友… 就像这里显示的一样 调出他们的个人资料 这些对玩家来说都是很好的机会 寻找要玩的新游戏 而且你什么都不用做 来使你的游戏符合条件 所有支持Game Center的游戏 都会自动显示在 “好友正在游玩”和“最近游玩”中 今年秋天 我们还将添加两个新的 由Game Center驱动的小部件 第一个是…你猜对了… “好友正在游玩” 我们认为这将是玩家更轻松地了解 和发现更多他们的朋友 正在玩的游戏的方式 就在他们的主屏幕上 第二个小部件称为“接续游玩” 这个小部件会自动重新显示 你已经启动和玩过的游戏 因此 你只需轻按一下 即可立即跳回到上次停下的地方 如果你使用的是iPad 这两个Game Center小部件 也支持新的更大的格式 就像好友正在玩和最近玩过一样 不需要额外的代码或要采用的功能 如果你的游戏支持Game Center 它会自动包含在内 由于朋友是社交游戏的重要组成部分 我们正在做出一些重大改进 我们的交友和多人游戏流程也是如此 首先 朋友们 Game Center好友请求 将继续通过信息发送 就像他们今天一样 但万一你错过了 我们添加了一个 全新的好友请求收件箱 让你在统一管理它们 我们还对信息中的 流程进行了一些重大改进 包括支持在MacOS上 发送和接收好友请求 但是作为开发人员 你最感兴趣的可能是你可以 与Game Center的朋友做些什么 这就是Friends API的用武之地 Friends API为你提供 Game Center玩家间 对隐私友善的访问 这样你就可以在你的游戏中 创造各种独特的体验 无论是在进度图中显示 我的朋友处于什么级别 或者让玩家一起发起任务 所有这些现在都可以通过 采用Friends API来完成 奇翰将带你了解如何做到这一点 所以现在你知道了一些 Game Center帮助提高可发现性 并将玩家在游戏之外 联系在一起的方法 让我们来看看Game Center 在你的游戏中提供的一些好处 在iOS 14中 我们引入了 全新的玩家主页面 你可以通过Access Point API 添加到你的游戏中 我们还发布了一个全新的UI… 屏幕上几乎没有任何是原封不动的 鲜艳的色彩 与游戏的基本色调相匹配 这种刷新旨在让你在任何游戏中 都有宾至如归的感觉 你还可以选择将我们的原生 Game Center UI 与最适合你的游戏的 任何自定义UI结合使用 例如 在级别选择屏幕内 显示当前的排行榜分数 甚至在玩关卡时作为实时指示器… 都是适合在与你的游戏 相匹配的UI中设置主题的范例 虽然不在关卡中 但你仍然可以选择 让玩家通过接入点访问他们的所有 Game Center数据…如这里所示 这只是为你的玩家提供更多方式跟上 并与他们的Game Center 排名和成就互动 如果你的游戏支持多人游戏 我们也有一些很棒的更新 今年 我们继续专注于帮助人们游戏 尽快建立联系并开始一起玩 现在 当你开始多人比赛时 我们的新建议部分 还会显示你现有的信息群组 点击一个群组 邀请将在你 已经进入的讨论串中发送 我们还记得你玩过的 Game Center好友群组 并推荐他们 因此 轻轻一按即可让你再次 与相同的朋友一起玩游戏 我们还推出了全新的多人游戏API 称为“快速启动” 哲宏将带你了解“快速启动”的 一些好处以及如何 在你的游戏中实现它 最后 我们还为 iPhone和iPad上的所有 Game Center UI添加了控制器支持 最棒的部分是:你不需要在Xcode中 采用新API或进行版本控制 只需按下任何受支持控制器上的 主页按钮 即可立即显示Game Center主页面 再次按下它 你又回到了游戏中 默认情况下 在Game Center主页面之中 所有部分都是易于操控的 你只需要为自己的UI添加控制器支持 如果你对控制器的其他新功能感兴趣 请务必查看这场座谈 标题为 《利用虚拟和物理游戏控制器》 来了解更多 再来是座谈的其余部分 首先 奇翰将引导你 完成我们的好友改进 包括Friends API的详细演练 以及如何实施它以在游戏中利用 Game Center好友 在座谈的最后 哲宏会为你介绍多人游戏的一切 包括穿行 了解我们如何简化邀请流程 以及你如何实施我们新的 “快速启动”API 以进一步加快进程 为了让你开始使用Friends 这里是奇翰 林奇翰:你好 我是奇翰 我是Game Center团队的工程师 玩游戏最棒的体验之一 就是能够与你的家人和朋友 分享这些经验 对于我们一些人来说 这是竞争 而对其他人来说 则是连结 Game Center好友可让你做到这一点 因此 我们今天 将重点关注两种能力 首先 我们让玩家可以轻松地 在你的游戏中发送好友请求 其次 我们为你引入了一些新的API 来通过好友API 利用你的玩家好友列表 首先 让我们谈谈发送好友请求 当你的游戏在多人游玩变得更好玩时 鼓励你的玩家是有意义的 在你的游戏中结交Game Center朋友 我们引入了一个新的API 来让你做到这一点 在你的游戏中 你的UI上可以有 一个添加好友按钮 我们建议你使用SF Symbols 作为按钮图像 当你的用户按下按钮时 你可以调用我们的好友API 允许你的玩家在游戏中添加好友 让我们看看如何在代码中做到这一点 当你调用 presentFriendRequestCreator FromViewController API时 信息面板将通过你传入的 真实控制器来显示 在你的玩家发送完好友请求后 我们将关闭面板 并将控制权交还给你的应用 并带有随机错误 这就对了! 只需几行代码 你就可以为你的玩家提供机会 在不离开游戏的情况下发送好友请求 现在 让我们来看看 你可以与所有这些 Games Center朋友一起做什么 我们在今年春天添加的第二个功能 是对Game Center好友 隐私友善的API访问 当玩家启动你的游戏 并首次尝试使用 需要Game Center好友访问的功能时 他们将被提示允许或拒绝访问 他们的朋友列表 如果允许的话 我们将向你交还他们的双向好友列表 这意味着该列表将仅包含 他们已授予你游戏访问权限的朋友 我们还将在他们的所有设备上 为你同步此权限 并且用户只需要批准你的请求一次 那么 如果你的玩家允许你访问 他们的好友列表 你可以创造什么样的体验? 好吧 这将允许你做一些事情 比如在进度地图中 显示我的朋友处于什么级别 让我和我的朋友一起 在大厅里发起任务 显示当我们一起玩多人游戏时 仅限朋友使用的循环排行榜 还有更多 让我们从玩家的角度来看 Friends API的样子 你的游戏将调用API 来请求访问玩家好友的权限 玩家将看到熟悉的系统提示 他们必须决定允许或拒绝你的请求 并且你可以选择向玩家解释 你请求好友访问的原因 一旦你的玩家批准你的请求 我们将交还好友列表 谁还授予了访问你的游戏的权限 在这个例子中 我们将使用排行榜 来追踪玩家的进度 以及我提交到 这个排行榜上的分数 提交分数后 我可以使用 Friends API 在进度图上显示我的朋友 在与他们的排行榜分数 相对应的级别旁边 这在你自己的游戏UI中 可能看起来像这样 你可以看到我朋友的进度 在地图上非常密集 我会确切地知道他们 在我游戏中的位置 让我们来看看如何使用代码创建此UI 在调用Friends API之前 我们需要进行一些设置 首先 你需要将 NSGKFriendListUsageDescription 添加到你的info.plist 此描述将作为权限提示的一部分 显示给我们的玩家 如上一张投影片所示 如果缺少描述 所有Friends API调用都会导致错误 描述设置好之后 你现在可以调用GKLocalPlayer 类别中的两个新API 要检查好友列表访问权限 你应该调用在GKLocalPlayer类中的 loadFriendsAuthorizationStatus 你可能想在你的应用程序的 applicationDidFinishLaunching中 来调用它 如果状态仍未确定 你可能需要延迟加载玩家的好友列表 直到有个好时机 让你显示权限提示 这将使你的玩家在出现提示后 有时间做出决定 你将在完成模块内 在以下四种状态之一中收到 GKFriendsAuthorizationStatus 你可以参考GKLocalPlayer标头 以获取每个状态的详细说明 当返回状态被拒绝或限制时 如果你之前收集过该玩家的数据 你应该在你这端删除收集到的数据 如果你的玩家选择授予你 访问权限的授权状态 然后你就可以继续加载 他们的朋友列表了 通过调用loadFriends API 现在让我们来看看 在这段代码中 我们将利用Swift异步调用的 强大功能来简化我们对 GameKit框架的调用 我们将从名为 loadFriendsOnProgressionMap的 异步方法开始 首先 我们将在GKLocalPlayer类别中 调用loadFriends API GameKit会以 GKPlayer对象数组的形式 交还玩家的朋友 接下来 我们将从GameKit 加载我们的进度排行榜 排行榜 ID为“progress” 一旦我们有了排行榜对象 我们就可以把你玩家的朋友 传送到loadEntries方法 你将获得他们在该排行榜上的分数 用来追踪他们现在处于哪个级别 这样 我们就拥有了在进度地图上 显示玩家好友所需的所有信息 就是这样! 你现在已成功整合 游戏中的好友API 并在进度地图上显示玩家的好友 我们非常高兴看到我们的开发者社群 将提供所有令人惊叹的体验 使用这个新功能 对于这点 我想把它交给哲宏 他会告诉你我们今年 对多人游戏所做的巨大改变 安哲宏:谢谢 奇翰 大家好 我是 Game Center团队的哲宏 我迫不及待地想介绍今年 Game Center 多人游戏的所有新功能和改进 正如艾莉之前提到的 我们对Game Center 多人游戏进行了重大改进 所有这些变化背后的主要目的是 帮助你的玩家找到可以一起玩的人 并尽快进入游戏 Game Center多人游戏UI 允许玩家通过多种不同的方式 找到可以联系和一起玩的人 这包括与其他玩家自动互动 或一次向多个朋友、联系人 附近的玩家、电话号码 或电子邮件地址 Game Center群组或是信息群组 它大大减少了要费的工夫 来展示源自不同地方的人 你可能知道了 自动化是帮助你的玩家 在Game Center的配对池 找到彼此的机制 我将在以下投影片中 介绍其他新概念 为了给玩家带来更好的建议 我们引入了建议架 包含你的玩家可能 想要邀请的来自Game Center 内部和外部的人员列表 它包含附近玩家Game Center群组 以及信息群组 Game Center群组 我们今年引入的一个新概念 就是你最近一起玩的一群玩家 在实时或回合制比赛中 我们相信这个新功能会让 玩家更容易想要反复 与特定人群一起玩游戏 因为这样可以选择所有玩家 只需轻按一下即可在该组中 我们正在通过信息群组来运用你 已经通过iMessage定期交谈的人 单击一次将选择整个信息群组 而邀请将会使用你现有的群聊 现在 你不仅可以通过信息 更快发送邀请 还可以在之后谈论游戏 在选择要邀请的人后 点击右上角的发送按钮 你会在大厅看到他们 即使在最初的邀请发出后 我们现在也可以添加或删除玩家 例如 你可能想要删除一些 无法响应的受邀玩家 但你不想删除 已经接受的其他玩家 所以 我们让单独 删除受邀玩家变得可行 通过点击玩家栏位中的X按钮 只要在他们还没有接受 或者他们在接受后离开游戏 并且玩家可以继续 邀请更多人到你的游戏 这给了他们很大的灵活性 快速打造合适的游玩群体 这些都极大地简化了游戏体验 通过让玩家更轻松地 比以往更快、更容易玩多人游戏 让玩家可以轻松邀请他们认识的人 加入你的游戏 这有助于 提高游戏的可发现性 如你所见 如果你利用Game Center 多人游戏UI 你将免费获得 所有这些出色的功能 为了更快地启动多人游戏 我们今年添加了一个 名为“快速启动”的新API 如果你采用快速启动 游戏发起者将有选择权 等待每个人都连接 或在受邀玩家连接的 最少数量后立即开始游戏 它可以让玩家更快地从 Game Center UI 返回到你的游戏UI 同时在后台 Game Center将继续 连接其余的玩家 并自动处理任何未填充的玩家栏位 所有这些玩家都可以 在连接时加入你的游戏 如果你的游戏可以支持 玩家在不同时间加入多人游戏 那么你可以通过Game CenterUI 来利用“快速启动” 你也可以利用此功能 制作一些游戏热身场景 让你看到这点的最佳方式是 向你展示一个范例 在这里 我们使用一个 名为“The Coast”的游戏 它利用了“快速启动” 你将看到利用“快速启动” 构建游戏的强大功能 首先 我向 GKMatchmakerViewController 呈现一个GKMatchRequest 配置了两个minPlayers 和五个maxPlayers 这样只要有两个玩家准备好 游戏就可以开始了 也包括了本地玩家 然后我点击邀请玩家按钮 来启动玩家选择器 我选择我想邀请的玩家 然后等待他们的响应 如你所见 一旦受邀者接受了 “开始游戏”按钮就会显示被点亮 所以我可以开始游戏 或等待其他玩家加入 我决定开始玩 只要配对器视图 控制器被关闭 游戏就开始了 由于此游戏最初由两名玩家开始 因此你可以看到两条船 同时 Game Center仍在后台连接 一旦第三位玩家加入 游戏中会出现通知 我们就有了第三条船 因为我们还有两个自动配对栏位 Game Center仍在后台自动运行 配对过程完成后 两个自动配对玩家加入 现在 我们有完整的五名玩家 参加这场游戏 如你所见 通过采用快速启动 不同的玩家将能够在不同的时间 加入同一个游玩过程 最后 让我们看看你需要 添加哪些代码 来完成我们刚刚讲解过的内容 要构建一个打开快速启动模式的 GKMatchmakerViewController 只需将其属性 canStartWithMinimumPlayers 设置为“true” 请注意:GKMatchRequest的 minPlayers 是你游戏中的游戏玩法 需要开始的最小玩家数量 拿到GKMatch实例后设置代理 你就可以知道游戏中 玩家的连接状态 而didChangeConnectionState 是你可以处理之后加入的玩家的 代理方法 在受邀者方面 只需展示 GKMatchmakerViewController 使用GKInvite实例初始化 这可能与你今天所做的相同 并且别忘了设置matchmakerDelegate 差不多就是这样 我们很高兴看到了 你不仅采用“快速启动” 而且采用我们今年为多人游戏提供的 所有新功能和改进 回顾一下 这就是我们 今天介绍的内容 我们介绍了Game Center 如何帮助提高游戏的可发现性 之后 我们讨论了Friends API 以及Friends的一些基本改进 然后我们刚刚讨论的 所有多人游戏功能和改进 都可以帮助玩家与他们认识的人 尽快开始多人同乐 而且 今年我们对控制器 有更好的支持 在画面下方你会看到另外两场座谈 是你可能感兴趣的 他们和循环排行榜 和游戏控制器有关 谢谢大家观看 祝你们在WWDC有个愉快的一周 ♪
-
-
8:23 - Friending API
// Call Friend Requests API to present friend request view from a view controller, when player click on Add Friends Button in your game let error = GKLocalPlayer.local .presentFriendRequestCreatorFromViewController(using: navigationController) if error != nil { print("Fail to send friend request with error: \(error!.localizedDescription).") }
-
11:47 - loadFriendsAuthorizationStatus
// Checking authorization GKLocalPlayer.local.loadFriendsAuthorizationStatus { (authorizationStatus, error) in guard error == nil else { // Error handling print(“Fail to load friends list with error: \(error!.localizedDescription).”) return } // Handle GKFriendsAuthorizationStatus switch authorizationStatus { case .notDetermined: // Player have not made a choice on friends list sharing case .denied: // Player have denied your request to access their friends list case .restricted: // You should delete collected player data from your end case .authorized: // Player have authorized your request to access their friends list } }
-
12:53 - loadFriends
func loadFriendsOnProgressionMap() async { do { let friends = try await GKLocalPlayer.local.loadFriends() if friends.count > 0 { let leaderboards = try await GKLeaderboard.loadLeaderboards(IDs: [“progress"]) if let leaderboard = leaderboards.first { let entries = try await leaderboard.loadEntries(for: friends, timeScope: .allTime) for entry in entries.1 { let avatar = try await entry.player.loadPhoto(for: .normal) let name = entry.player.displayName let friendLevel = entry.score // Display player on progression map } } } } catch { print("Error: \(error.localizedDescription).") } }
-
20:17 - Enable Fast Start Mode
// Set canStartWithMinimumPlayers to true to enable Fast Start mode let request = GKMatchRequest() request.minPlayers = 2 request.maxPlayers = 6 request.playerGroup = 2021 let vc = GKMatchmakerViewController(matchRequest: request) vc.canStartWithMinimumPlayers = true vc.delegate = self self.present(vc, animated: true, completion: nil)
-
20:39 - Handle Players Who Join The Game
// Set the GKMatch delegate and present your game scene when didFindMatch is called func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) { viewController.dismiss(animated: true, completion: nil) let gameVC = GameSceneViewController() gameVC.match = match match.delegate = gameVC self.present(gameVC, animated: true, completion: nil) } // Add players who join later by implementing didChangeState delegate func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) { if state == .connected { self.addPlayer(player) } }
-
20:54 - Present GKMatchmakerViewController on The Invitee Side
// On the invitee side, present GKMatchmakerViewController with the invite func player(_ player: GKPlayer, didAccept invite: GKInvite) { if let vc = GKMatchmakerViewController(invite: invite) { vc.matchmakerDelegate = self self.present(vc, animated: true, completion: nil) } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。