26、游戏开发:集成 Game Center 功能指南

游戏开发:集成 Game Center 功能指南

1. 准备工作

在开始集成 Game Center 功能之前,需要在相关平台上进行一些设置。以下是具体步骤:

1.

添加排行榜

- 点击“Add Language”按钮,打开“Add Language”页面,设置语言选项。

- 若要添加排行榜图片,点击“Choose File”,导航到对应资源文件夹,选择“most_wins.png”文件。

- 完成设置后,点击“Save”保存排行榜及其选项。

2.

添加成就

- 成就可以激励玩家玩游戏,标记玩家在游戏中达到的特定里程碑。例如,在游戏中创建“First Win”成就,玩家首次获胜时可获得。

- 设计成就时,需决定包含哪些里程碑,是否对玩家隐藏这些成就,以及玩家能否多次达成。每个应用最多允许设置 100 个成就。

- 点击“Achievements (0)”右侧的“+”按钮添加新成就。

- 设置“First Win”成就:

- 修改“Achievement ID”以匹配“Bundle ID”,如

{your bundle id}.first.win

- 点击“Add Language”按钮设置语言选项。

- 为图片选择资源文件夹中的“first_win.png”文件。

- 完成设置后,点击“Save”保存成就及其选项。

2. 创建 Game Center 辅助类

完成上述设置后,回到 Xcode 编写与新排行榜和成就交互的代码。

1.

创建新组和文件

- 切换到 Xcode 项目,在“Project Navigator”中,“Assets.xcassets”资产目录下方创建一个新组,命名为“Game Center”,用于存放所有与 Game Center 相关的代码。

- 在新组内,使用“iOS Swift File”模板创建一个新文件,命名为“GameKitHelper.swift”,并将其内容替换为以下代码:

import GameKit

class GameKitHelper: NSObject {

// Shared GameKit Helper

static let shared: GameKitHelper = {

let instance = GameKitHelper()

return instance

}()

}

此代码是新 GameKit 辅助类的开始,设置了共享实例属性,用于访问主要的 GameKit 方法。

3. 认证本地玩家

在使用 Game Center 功能之前,需要对本地 Game Center 玩家进行认证,此过程应尽早进行。

1.

设置认证处理程序

- 通过在

GKLocalPlayer

对象的共享实例上设置认证处理程序来完成认证。使用

Notification Center

广播特定信息给指定观察者,观察者会在通知发生时采取特定行动。

- 在“GameKitHelper.swift”文件底部(

GameKitHelper

类外部)添加以下代码,创建自定义通知:

// MARK: - NOTIFICATION EXTENSIONS

extension Notification.Name {

static let presentAuthenticationViewController =

Notification.Name("presentAuthenticationViewController")

}

设置认证视图控制器属性

GameKitHelper

类中添加新属性:

// Game Center- & GameKit-Related View Controllers

var authenticationViewController: UIViewController?

添加认证方法

在新的

authenticationViewController

属性下方添加以下代码:

// MARK: - GAME CENTER METHODS

func authenticateLocalPlayer() {

// Prepare for new controller

authenticationViewController = nil

// Authenticate local player

GKLocalPlayer.local.authenticateHandler = { viewController, error in

if let viewController = viewController {

// Present the view controller so the player can sign in

self.authenticationViewController = viewController

NotificationCenter.default.post(

name: .presentAuthenticationViewController,

object: self)

return

}

if error != nil {

// Player could not be authenticated

// Disable Game Center in the game

return

}

// Player was successfully authenticated

// Check if there are any player restrictions before starting the game

if GKLocalPlayer.local.isUnderage {

// Hide explicit game content

}

if GKLocalPlayer.local.isMultiplayerGamingRestricted {

// Disable multiplayer game features

}

if GKLocalPlayer.local.isPersonalizedCommunicationRestricted {

// Disable in game communication UI

}

// Place the access point in the upper-right corner

// GKAccessPoint.shared.location = .topLeading

// GKAccessPoint.shared.showHighlights = true

// GKAccessPoint.shared.isActive = true

// Perform any other configurations as needed

}

}

此代码设置了

authenticationViewController

属性并发布通知,观察者将根据此通知呈现认证控制器。

4. 呈现认证控制器

配置主视图控制器作为观察者来呈现 Game Center 认证控制器。

1.

添加呈现方法

- 切换到“GameViewController.swift”文件,在文件末尾附近,将

// TODO: Add Game Center Notification Handlers

替换为以下代码:

@objc func showAuthenticationViewController() {

if let viewController = GameKitHelper.shared.authenticationViewController {

present(viewController, animated: true, completion: nil)

}

}

设置观察者并调用认证方法

viewDidLoad()

方法中,将两个

TODO

注释替换为以下代码:

// Add Game Center Observers

NotificationCenter.default.addObserver(

self,

selector: #selector(self.showAuthenticationViewController),

name: .presentAuthenticationViewController, object: nil)

// Authenticate the Local GC Player

GameKitHelper.shared.authenticateLocalPlayer()

构建并运行项目

首次运行游戏时,会提示登录 Game Center,使用沙盒测试账户登录。登录成功后,停止项目,再次构建并运行,此时玩家已登录并认证。

5. 显示 Game Center 仪表盘

在游戏中,玩家需要一种方式访问 Game Center 仪表盘、排行榜和成就。

1.

创建共享视图控制器

- 切换到“GameKitHelper.swift”文件,添加新属性:

var gameCenterViewController: GKGameCenterViewController?

- 在`Notification.Name`扩展中添加以下代码,使用通知呈现控制器:

static let presentGameCenterViewController =

Notification.Name("presentGameCenterViewController")

实现协议

实现

GKGameCenterControllerDelegate

协议,处理关闭 Game Center 控制器。在“GameKitHelper.swift”文件底部,

Notification.Name

扩展标记上方添加以下代码:

// MARK: - DELEGATE EXTENSIONS

extension GameKitHelper: GKGameCenterControllerDelegate {

func gameCenterViewControllerDidFinish(_ gameCenterViewController:

GKGameCenterViewController) {

gameCenterViewController.dismiss(animated: true, completion: nil)

}

}

添加显示方法

在刚刚创建的扩展中添加处理显示 Game Center 视图控制器的方法:

// Show the Game Center View Controller

func showGKGameCenter(state: GKGameCenterViewControllerState) {

guard GKLocalPlayer.local.isAuthenticated else { return }

// Prepare for new controller

gameCenterViewController = nil

// Create the instance of the controller

if #available(iOS 14, *) {

gameCenterViewController = GKGameCenterViewController(state: state)

} else {

gameCenterViewController = GKGameCenterViewController()

gameCenterViewController?.viewState = state

}

// Set the delegate

gameCenterViewController?.gameCenterDelegate = self

// Post the notification

NotificationCenter.default.post(name: .presentGameCenterViewController,

object: self)

}

更新视图控制器

切换到“GameViewController.swift”文件,在文件底部类内部添加以下代码:

@objc func showGameCenterViewController() {

if let viewController = GameKitHelper.shared.gameCenterViewController {

present(viewController, animated: true, completion: nil)

}

}

- 在`viewDidLoad()`方法中添加观察者:

NotificationCenter.default.addObserver(

self,

selector: #selector(self.showGameCenterViewController),

name: .presentGameCenterViewController, object: nil)

更新按钮操作

切换到“LobbyScene.swift”文件,在

touchDown(atPoint:)

方法中,将

// TODO: Add code to open Game Center

替换为:

GameKitHelper.shared.showGKGameCenter(state: .dashboard)

- 切换到“GameOverScene.swift”文件,在`touchDown(atPoint:)`方法中,将`// TODO: Add code to open Leaderboards`替换为:

GameKitHelper.shared.showGKGameCenter(state: .leaderboards)

- 将`// TODO: Add code to open Achievements`替换为:

GameKitHelper.shared.showGKGameCenter(state: .achievements)

构建并运行项目

点击大厅场景中的“Game Center”按钮,可看到标准的 Game Center 仪表盘。

测试游戏结束场景按钮,点击大厅场景中的筹码或骰子,场景加载后,点击“Leaderboards”按钮打开排行榜视图,关闭该视图后点击“Achievements”按钮打开成就视图。

6. 向排行榜报告分数

在报告分数之前,可查看“GameData.swift”文件,其中的

wins

属性用于跟踪玩家的获胜次数。每次玩家获胜时,“GameOverScene.swift”文件中的

didMove(to:)

方法会将该值加 1。

1.

添加排行榜 ID 属性

- 切换到“GameKitHelper.swift”文件,在类顶部添加新的静态属性以保存排行榜 ID 字符串:

// Leaderboard IDs

static let leaderBoardIDMostWins = "net.justwritecode.hogdice.wins"

确保使用之前设置的 ID。

2.

创建报告分数方法

- 在

authenticateLocalPlayer()

方法下方添加以下代码:

// Report Score

func reportScore(score: Int, forLeaderboardID leaderboardID: String,

errorHandler: ((Error?)->Void)? = nil) {

guard GKLocalPlayer.local.isAuthenticated else { return }

if #available(iOS 14, *) {

GKLeaderboard.submitScore(score, context: 0,

player: GKLocalPlayer.local,

leaderboardIDs: [leaderboardID],

completionHandler: errorHandler ?? {

error in

print("error: \(String(describing: error))")

})

} else {

let gkScore = GKScore(leaderboardIdentifier: leaderboardID)

gkScore.value = Int64(score)

GKScore.report([gkScore], withCompletionHandler: errorHandler)

}

}

由于 Apple 对 GameKit 向排行榜报告分数的方式进行了修改,在支持旧设备时,可使用

#available

进行 API 可用性检查。

3.

调用报告方法

- 切换到“GameOverScene.swift”文件,在

didMove(to:)

方法末尾,将

TODO

注释替换为以下代码:

// Report Score

GameKitHelper.shared.reportScore(score: GameData.shared.wins,

forLeaderboardID: GameKitHelper.leaderBoardIDMostWins)

测试报告分数

构建并运行项目,玩一局快速游戏至 25 分。为便于获胜,可进行本地游戏或作弊(点击大厅场景中的骰子)。游戏结束后,点击“Leaderboards”按钮,可看到首次获胜记录。

7. 报告成就

成就的报告方式与排行榜分数报告略有不同,需要更多代码。

1.

创建成就辅助类

- 切换到“GameKitHelper.swift”文件,在委托扩展标记上方添加以下代码:

// MARK: - ACHIEVEMENTS HELPER CLASS

class AchievementsHelper {

static let achievementIdFirstWin = "net.justwritecode.hogdice.first.win"

class func firstWinAchievement(didWin: Bool) -> GKAchievement {

let achievement = GKAchievement(

identifier: AchievementsHelper.achievementIdFirstWin)

if didWin {

achievement.percentComplete = 100

achievement.showsCompletionBanner = true

}

return achievement

}

}

此代码创建了一个静态属性保存成就 ID,并根据玩家是否获胜创建

GKAchievement

对象并设置其属性。

2.

添加报告成就方法

- 在

GameKitHelper

类中,报告玩家分数的方法下方添加以下代码:

// Report Achievement

func reportAchievements(achievements: [GKAchievement],

errorHandler: ((Error?)->Void)? = nil) {

guard GKLocalPlayer.local.isAuthenticated else { return }

GKAchievement.report(achievements, withCompletionHandler: errorHandler)

}

调用报告成就方法

切换到“GameOverScene.swift”文件,在报告分数的代码下方添加以下代码:

// Get and report achievements

var achievements: [GKAchievement] = []

achievements.append(AchievementsHelper.firstWinAchievement(didWin: isWinner))

GameKitHelper.shared.reportAchievements(achievements: achievements)

此代码创建成就数组并传递给报告成就的方法,但会导致 Xcode 抱怨缺少

GKAchievement

类型。

4.

解决类型错误

- 滚动到文件顶部,添加导入语句:

import GameKit

测试报告成就

构建并运行项目,获胜时会看到成就横幅。点击“Achievements”按钮,可看到已获得“First Win”成就。

通过以上步骤,你已完成 Game Center 功能的集成,包括设置排行榜和成就,认证本地玩家,显示 Game Center 仪表盘,报告分数和成就等。接下来可以考虑添加更多 Game Center 功能,如多人游戏,以吸引更多玩家。

游戏开发:集成 Game Center 功能指南

8. 总结与回顾

在前面的内容中,我们详细介绍了如何在游戏开发中集成 Game Center 功能。下面通过一个表格来回顾一下各个步骤及其关键操作:

|步骤|关键操作|代码文件|

| ---- | ---- | ---- |

|准备工作|添加排行榜和成就,设置相关选项和图片|无|

|创建 Game Center 辅助类|创建新组和文件,设置共享实例属性|GameKitHelper.swift|

|认证本地玩家|设置认证处理程序、视图控制器属性和认证方法|GameKitHelper.swift|

|呈现认证控制器|添加呈现方法,设置观察者并调用认证方法|GameViewController.swift|

|显示 Game Center 仪表盘|创建共享视图控制器,实现协议,添加显示方法,更新视图控制器和按钮操作|GameKitHelper.swift、GameViewController.swift、LobbyScene.swift、GameOverScene.swift|

|向排行榜报告分数|添加排行榜 ID 属性,创建报告分数方法,调用报告方法|GameKitHelper.swift、GameOverScene.swift|

|报告成就|创建成就辅助类,添加报告成就方法,调用报告方法,解决类型错误|GameKitHelper.swift、GameOverScene.swift|

下面是整个集成过程的 mermaid 流程图:

graph LR

classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px

classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

A([开始]):::startend --> B(准备工作):::process

B --> C(创建 Game Center 辅助类):::process

C --> D(认证本地玩家):::process

D --> E(呈现认证控制器):::process

E --> F(显示 Game Center 仪表盘):::process

F --> G(向排行榜报告分数):::process

G --> H(报告成就):::process

H --> I([结束]):::startend

9. 常见问题及解决方案

在集成 Game Center 功能的过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方案:

1.

认证失败

-

问题描述

:玩家无法成功认证 Game Center 账户。

-

解决方案

:检查网络连接是否正常,确保使用的是有效的沙盒测试账户。同时,检查认证代码是否正确,特别是认证处理程序的设置。

2.

排行榜分数未更新

-

问题描述

:游戏结束后,排行榜分数没有及时更新。

-

解决方案

:检查报告分数的代码是否正确,确保传递的分数值和排行榜 ID 无误。另外,可能存在服务器延迟,可稍等一段时间后再查看。

3.

成就未显示

-

问题描述

:玩家获得成就后,成就没有在 Game Center 中显示。

-

解决方案

:检查成就报告代码是否正确,确保传递的成就对象和 ID 无误。同时,检查成就的配置是否正确,如是否设置了正确的完成百分比和显示横幅。

10. 优化建议

为了提升游戏中 Game Center 功能的用户体验和性能,以下是一些优化建议:

1.

异步操作

:在进行认证、报告分数和成就等操作时,尽量使用异步操作,避免阻塞主线程,提高游戏的流畅性。例如,在报告分数和成就的方法中,可以使用闭包来处理完成回调。

2.

错误处理

:在代码中添加详细的错误处理机制,当出现错误时,能够给玩家明确的提示信息。例如,在报告分数和成就的方法中,添加错误处理闭包,打印错误信息。

3.

缓存机制

:对于一些频繁使用的数据,如排行榜信息和成就状态,可以使用缓存机制,减少网络请求,提高响应速度。

11. 拓展功能思考

除了已经实现的排行榜、成就、认证和显示仪表盘等功能,还可以考虑拓展以下 Game Center 功能:

1.

多人游戏

:实现多人对战功能,让玩家可以与其他玩家进行实时对战,增加游戏的趣味性和社交性。

2.

挑战系统

:允许玩家向其他玩家发起挑战,完成挑战后可以获得额外的奖励或成就。

3.

社交分享

:支持玩家将自己的游戏成绩、成就等分享到社交媒体上,吸引更多的玩家。

通过不断拓展和优化 Game Center 功能,可以让游戏更具吸引力,吸引更多的玩家参与。希望以上内容对你在游戏开发中集成 Game Center 功能有所帮助。