iOS下使用Game Center Fast Start处理多人游戏受邀及相关报错问题
问题解决方案
报错原因
GameSceneViewController不属于UIKit、GameKit等系统公共框架,是WWDC 2021 Fast Start演示项目中自定义的业务类,你需要自行实现该类才能解决作用域查找失败的报错。
具体实现步骤
- 自定义
GameSceneViewController类,遵守GKMatchDelegate协议,声明接收匹配实例的属性
- 自定义
import UIKit import GameKit import SpriteKit // 使用SceneKit的话替换为对应的框架导入 class GameSceneViewController: UIViewController, GKMatchDelegate { // 对外接收匹配完成的GKMatch实例 var match: GKMatch! // 绑定当前控制器持有的游戏场景 private var gameScene: GameScene! // 纯代码构建的话需要重写loadView,把根视图设置为SKView override func loadView() { self.view = SKView(frame: UIScreen.main.bounds) } override func viewDidLoad() { super.viewDidLoad() bindGameScene() } private func bindGameScene() { guard let skView = self.view as? SKView else { return } // 初始化你的游戏场景,尺寸和视图保持一致 gameScene = GameScene(size: skView.bounds.size) gameScene.scaleMode = .aspectFill // 将匹配实例传递给游戏场景,方便场景内处理联机逻辑 gameScene.match = match // 加载展示游戏场景 skView.presentScene(gameScene) } // MARK: GKMatchDelegate 协议实现 func match(_ match: GKMatch, didReceive data: Data, fromRemotePlayer player: GKPlayer) { // 将收到的联机数据转发给游戏场景处理 gameScene.handleReceivedData(data, from: player) } // 按需实现其他GKMatchDelegate方法,比如玩家连接状态变更、数据发送失败等回调 func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) { // 处理玩家进出房间的业务逻辑 } }
- 给你的
GameScene新增匹配实例属性,接收ViewController传递的参数
- 给你的
import SpriteKit import GameKit class GameScene: SKScene { // 接收控制器传递的联机匹配实例 var match: GKMatch! // 自定义方法处理收到的联机数据 func handleReceivedData(_ data: Data, from player: GKPlayer) { // 在此处实现你的游戏联机逻辑,比如同步玩家状态、得分等 } }
- 调整初始化方式(使用Storyboard的场景适配)
如果你用Storyboard管理GameSceneViewController,不需要直接调用GameSceneViewController()初始化,需要先在Storyboard中给该控制器设置Storyboard ID,然后用如下方式初始化:
- 调整初始化方式(使用Storyboard的场景适配)
// 替换之前的let gameVC = GameSceneViewController()代码 let gameVC = storyboard?.instantiateViewController(withIdentifier: "你设置的Storyboard ID") as! GameSceneViewController
同时需要在Storyboard中将GameSceneViewController的根视图自定义类修改为SKView。
内容的提问来源于stack exchange,提问作者tdevin
相关产品推荐
相关产品推荐

