You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS下使用Game Center Fast Start处理多人游戏受邀及相关报错问题

问题解决方案

报错原因

GameSceneViewController不属于UIKit、GameKit等系统公共框架,是WWDC 2021 Fast Start演示项目中自定义的业务类,你需要自行实现该类才能解决作用域查找失败的报错。

具体实现步骤

    1. 自定义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) {
        // 处理玩家进出房间的业务逻辑
    }
}
    1. 给你的GameScene新增匹配实例属性,接收ViewController传递的参数
import SpriteKit
import GameKit

class GameScene: SKScene {
    // 接收控制器传递的联机匹配实例
    var match: GKMatch!

    // 自定义方法处理收到的联机数据
    func handleReceivedData(_ data: Data, from player: GKPlayer) {
        // 在此处实现你的游戏联机逻辑,比如同步玩家状态、得分等
    }
}
    1. 调整初始化方式(使用Storyboard的场景适配)
      如果你用Storyboard管理GameSceneViewController,不需要直接调用GameSceneViewController()初始化,需要先在Storyboard中给该控制器设置Storyboard ID,然后用如下方式初始化:
// 替换之前的let gameVC = GameSceneViewController()代码
let gameVC = storyboard?.instantiateViewController(withIdentifier: "你设置的Storyboard ID") as! GameSceneViewController

同时需要在Storyboard中将GameSceneViewController的根视图自定义类修改为SKView。

内容的提问来源于stack exchange,提问作者tdevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:48:04