游戏开发:集成 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 功能有所帮助。