Tap into Game Center: Dashboard, Access Point, and Profile
Graphics & Games 入门 20m

接入 Game Center:Dashboard、Access Point 和 Profile

Tap into Game Center: Dashboard, Access Point, and Profile

2020年6月23日

在 Apple 官方观看视频

一句话判断

Game Center 在 2020 年改头换面了——新的 Dashboard、Access Point 和 Profile 视图让社交游戏功能的集成变得前所未有的简单。

这场 Session 讲了什么

这场 Session 介绍了 Game Center 在 2020 年的重大 UI 和功能更新。Game Center 曾经是 iOS 中一个独立的应用,后来被整合进设置中,2020 年它又以一种新的形式回归——作为游戏内的 overlay 界面。

首先介绍了 Access Point——一个可以在你游戏界面中显示的小组件,点击后展开 Game Center 的 Dashboard。Access Point 支持三种样式:leaderboard(显示玩家排名)、achievement(显示成就进度)和 profile(显示玩家头像)。它会自动显示当前登录玩家的信息,无需任何额外配置。

然后详细讲解了 Dashboard 的自定义。你可以控制 Dashboard 中显示哪些标签页(Leaderboard、Achievements、Challenges),也可以限制只显示你游戏自己的排行榜和成就。Dashboard 会自动适配游戏的主题色调,你也可以进一步自定义外观。

最后讨论了 Profile 视图——玩家可以在不离开游戏的情况下查看自己的 Game Center 个人资料、好友列表和游戏列表。Session 还介绍了如何处理玩家未登录 Game Center 的情况,以及如何引导他们登录。

值得深挖的点

  • Access Point 的”无侵入”设计:传统方式下,要展示 Game Center 排行榜你需要呈现一个全屏的 GKViewController,打断游戏体验。Access Point 是一个悬浮小组件,点击展开 Dashboard 后玩家可以随时关闭返回游戏。这种模式对游戏沉浸感的影响小得多。
  • 好友系统的变化:Game Center 好友系统从”必须互相添加”变成了”单向关注”模式,类似社交媒体。这降低了社交功能的摩擦,玩家更容易看到好友的游戏动态。

代码片段

// 在游戏中添加 Game Center Access Point
import GameKit

class GameViewController: UIViewController {
    var accessPoint: GKAccessPoint?

    override func viewDidLoad() {
        super.viewDidLoad()

        // 认证本地玩家
        GKLocalPlayer.local.authenticateHandler = { [weak self] vc, error in
            if let vc = vc {
                self?.present(vc, animated: true)
            } else if GKLocalPlayer.local.isAuthenticated {
                self?.setupAccessPoint()
            }
        }
    }

    func setupAccessPoint() {
        let accessPoint = GKAccessPoint.shared
        accessPoint.location = .topLeading  // 放在左上角
        accessPoint.showHighlights = true
        accessPoint.isActive = true
        self.accessPoint = accessPoint
    }
}
// 自定义 Dashboard 显示内容
func showLeaderboardDashboard() {
    // 使用新的 GKGameCenterViewController
    let gameCenterVC = GKGameCenterViewController(
        leaderboardIDs: ["weekly_high_score"],
        achievementIDs: []
    )
    gameCenterVC.gameCenterDelegate = self
    present(gameCenterVC, animated: true)
}

// 实现 delegate 处理关闭
func gameCenterViewControllerDidFinish(
    _ gameCenterViewController: GKGameCenterViewController
) {
    gameCenterViewController.dismiss(animated: true)
}
// 提交分数到排行榜
func submitScore(_ score: Int) {
    let reporter = GKLeaderboardScore(
        value: score,
        player: GKLocalPlayer.local
    )

    GKLeaderboard.submitScores(
        [reporter],
        leaderboardIDs: ["weekly_high_score"],
        context: 0
    ) { error in
        if let error = error {
            print("提交分数失败: \(error)")
        } else {
            print("分数提交成功")
            // 更新 Access Point 显示
            GKAccessPoint.shared.trigger(
                leaderboardID: "weekly_high_score"
            )
        }
    }
}

最佳实践

  • Access Point 放在游戏 UI 的固定位置(推荐角落),不要与游戏操作区域重叠
  • 游戏启动时自动认证 Game Center,不要等到玩家手动触发
  • 排行榜和成就的 ID 在 App Store Connect 中提前配置好
  • 玩家未登录 Game Center 时,优雅降级为本地排行榜
  • 利用 Dashboard 的自定义能力只展示与当前游戏相关的内容

还有什么值得关注

  • Game Center 的社交功能后来在 iOS 16 中有了进一步更新
  • 搭配 “Tap into Game Center: Leaderboards, Achievements, and Multiplayer” 一起看,可以掌握 Game Center 的完整功能集
  • 如果你在做跨平台游戏,Game Center 的好友系统可以与其他平台的好友系统并行存在
WWDC 2020