WWDC Quick Look 💓 By SwiftGGTeam
What's new in Game Center: Widgets, friends, and multiplayer improvements

What's new in Game Center: Widgets, friends, and multiplayer improvements

元の動画を見る

ハイライト

iOS 15 では、Friends API (プライバシーに配慮したフレンド リストへのアクセス)、ファスト スタート マルチプレイヤー モード (最小限の人数でゲームを開始でき、後続のプレイヤーは動的に参加)、および 2 つのシステム レベル ウィジェット (フレンドがプレイ中とプレイ継続) を Game Center に導入し、すべてゼロコード アクセスで提供されます。

主な内容

Game Center は、プレイヤーが 1 つの ID でリーダーボードに参加し、実績を追跡し、マルチプレイヤー ゲームをプレイできるようにする Apple のゲーム ソーシャル ネットワークです。しかし、開発者は長い間、友人関係をソーシャル機能に利用したいと考えてきましたが、基本的には利用できませんでした。iOS 15 では、発見、ソーシャル インタラクション、マルチプレイヤー ゲームという 3 つの側面で大幅な改善が加えられています。

ゲームディスカバリー: 自動露出

01:04

Apple は Game Center を App Store に深く統合しています。[ゲーム] タブと [アーケード] タブでは、プレイヤーは友達がプレイしているゲームを確認できます。ゲームの製品ページに入ると、どの友達がそのゲームをプレイしているのかも確認できます。友達のアバターをクリックすると、他の人の Game Center 情報が表示され、他の人がプレイしたゲームを直接ダウンロードできます。

これらの機能は、Game Center 対応のすべてのゲームで自動的に動作し、追加のコードは必要ありません。

ゲームセンターウィジェット

02:37

iOS 15 では、2 つの新しい Game Center ウィジェットが追加されています。

  • 友達がプレイ中: 友達が最近プレイしているゲームを表示します。クリックすると直接ジャンプします
  • プレイを続ける: プレーヤーが最近プレイしたゲームを表示し、Game Center をサポートしているため、ゲームにすぐに戻ることが簡単になります。

どちらのウィジェットも iPad のラージ フォーマットをサポートしています。ゲームが Game Center をサポートしている限り、コード アクセスは不要で、ウィジェットに自動的に表示されます。

フレンドシステムの改善

03:26

友達リクエストは引き続きメッセージを通じて送信されますが、すべての保留中のリクエストを集中管理するために新しい友達リクエスト受信箱が追加されます。macOS では、友達リクエストの送受信もサポートされています。

Friends API

03:55

これは、今年最も重要な開発者向けの機能です。Friends API を使用すると、認証後にプレーヤーの Game Center フレンド リストにアクセスできます。リストには双方向のフレンド (つまり、相手もゲームを承認している) のみが含まれており、Apple はデバイス間で承認ステータスを自動的に同期します。

ゲーム内でフレンドリクエストを送信してください:

let error = GKLocalPlayer.local
    .presentFriendRequestCreatorFromViewController(using: navigationController)

if error != nil {
    print("Fail to send friend request with error: \(error!.localizedDescription).")
}

キーポイント:

  • 電話をかけると、メッセージの友達リクエストインターフェイスがポップアップ表示されます。
  • ユーザーが完了すると自動的に閉じられ、オプションのエラーが返されます。
  • ボタンアイコンにはSFシンボルを使用することを推奨します

フレンドリストの承認ステータスを確認してください:

GKLocalPlayer.local.loadFriendsAuthorizationStatus { (authorizationStatus, error) in
    guard error == nil else {
        print("Fail to load friends list with error: \(error!.localizedDescription).")
        return
    }

    switch authorizationStatus {
    case .notDetermined:
        // プレイヤーはまだ選択していない
    case .denied:
        // プレイヤーがアクセス要求を拒否した
    case .restricted:
        // 収集済みのプレイヤーデータを削除する必要がある
    case .authorized:
        // プレイヤーが許可済みのため、フレンドリストを読み込める
    @unknown default:
        break
    }
}

キーポイント:

  • Info.plistに追加する必要がありますNSGKFriendListUsageDescription
  • .restricted収集したデータは削除する必要があります
  • で推奨applicationDidFinishLaunchingステータスを時々確認し、適切な時点まで認証プロンプトを遅らせてください。

友達をロードして進行状況マップに表示:

func loadFriendsOnProgressionMap() async {
    do {
        let friends = try await GKLocalPlayer.local.loadFriends()
        if friends.count > 0 {
            let leaderboards = try await GKLeaderboard.loadLeaderboards(IDs: ["progress"])
            if let leaderboard = leaderboards.first {
                let entries = try await leaderboard.loadEntries(for: friends, timeScope: .allTime)
                for entry in entries.1 {
                    let avatar = try await entry.player.loadPhoto(for: .normal)
                    let name = entry.player.displayName
                    let friendLevel = entry.score
                    // 進行マップ上にフレンドの位置を表示する
                }
            }
        }
    } catch {
        print("Error: \(error.localizedDescription).")
    }
}

キーポイント:

  • loadFriends()戻る[GKPlayer]、双方向で承認された友人のみが含まれます
  • 組み合わせるGKLeaderboard.loadEntries(for:timeScope:)特定のリーダーボードで友達のスコアを取得する
  • Swift async/await を使用して非同期呼び出しチェーンを簡素化する

マルチプレイヤーのマッチメイキングの改善

05:26

新しい提案シェルフがマッチング インターフェイスに追加され、招待したい人をインテリジェントに推薦できるようになりました。

  • 近くのプレイヤー
  • 最近一緒にプレイした Game Center グループ
  • 頻繁にチャットするためのメッセージグループ

Game Center グループは今年の新しいコンセプトです。最近リアルタイムまたはターンベースのバトルを一緒にプレイしたプレイヤーは自動的にグループを形成し、ワンクリックでグループ全体を招待できるようになります。

招待が送信された後、ロビーでプレーヤーを動的に追加または削除できます。まだ承諾していないプレイヤーは [X] をクリックして削除できます。また、承諾して退出したプレイヤーも削除できます。

ファストスタートモード

17:44

Fast Start は、今年のマルチプレイヤー ゲームの中核となる新しい API です。オンにすると、最小プレイヤー数に達するとすぐにゲームを開始できます。他のプレイヤーはバックグラウンドで接続を続け、接続後は動的にゲームに参加します。

高速スタートを有効にする:

let request = GKMatchRequest()
request.minPlayers = 2
request.maxPlayers = 6
request.playerGroup = 2021

let vc = GKMatchmakerViewController(matchRequest: request)
vc.canStartWithMinimumPlayers = true
vc.delegate = self
self.present(vc, animated: true, completion: nil)

キーポイント:

  • canStartWithMinimumPlayers = trueファストスタートをオンにする
  • minPlayersゲームをプレイできる最小人数です
  • minPlayers に達すると、モデレーターはすぐに開始するか待機し続けるかを選択できます。

参加する後続のプレイヤーの処理:

func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) {
    viewController.dismiss(animated: true, completion: nil)
    let gameVC = GameSceneViewController()
    gameVC.match = match
    match.delegate = gameVC
    self.present(gameVC, animated: true, completion: nil)
}

func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) {
    if state == .connected {
        self.addPlayer(player)
    }
}

キーポイント:

  • didFindMatch中程度の設定match.delegateプレーヤーの接続ステータスを監視する
  • didChangeState中処理.connectedステータス、ゲームに新しいプレイヤーを追加
  • 招待された側はパスしますGKMatchmakerViewController(invite:)招待を受け入れる
func player(_ player: GKPlayer, didAccept invite: GKInvite) {
    if let vc = GKMatchmakerViewController(invite: invite) {
        vc.matchmakerDelegate = self
        self.present(vc, animated: true, completion: nil)
    }
}

コントローラーのサポート

06:04

すべての Game Center UI がゲームパッド ナビゲーションをサポートするようになりました。コントローラーのホーム ボタンを押すと Game Center ダッシュボードが直接呼び出され、もう一度押すとゲームに戻ります。ゼロコードアクセス、Xcode バージョンのアップグレードは必要ありません。独自の UI にはハンドルのサポートを別途追加する必要があります。

##詳細

ゲームを Game Center に接続する完全なプロセス

ゲームで Game Center をサポートするには、App Store Connect で Game Center 機能を有効にし、コードでローカル プレーヤーを認証する必要があります。

GKLocalPlayer.local.authenticateHandler = { viewController, error in
    if let viewController = viewController {
        // ログイン画面を表示する必要がある
        self.present(viewController, animated: true)
    } else if GKLocalPlayer.local.isAuthenticated {
        // 認証に成功したため、Game Center API を呼び出せる
        self.loadGameCenterData()
    } else {
        // 認証に失敗した、またはユーザーがキャンセルした
        print("Game Center authentication failed: \(error?.localizedDescription ?? "unknown")")
    }
}

ランキングと実績

Game Center のコア機能には次のものも含まれます。

  • リーダーボード: プレイヤーはスコアを提出し、世界または友達の間でランク付けします。
  • 実績: ゲーム内のプレイヤーのマイルストーンを追跡します
  • チャレンジ: 友達にスコアチャレンジを開始します

これらの機能は iOS 14 の UI で更新され、iOS 15 ではプレーヤーがいつでも Access Point API を通じてダッシュボードを呼び出すことができるようになりました。

カスタム UI とネイティブ UI の混合

Game Center データをカスタム ゲーム UI に埋め込むことができます。たとえば、レベル選択インターフェイスに現在のレベルの最高スコアを表示したり、ゲーム中にリアルタイムのランキング インジケーターを表示したりできます。同時に、プレイヤーにはアクセス ポイントを介して完全なゲーム センターへの入り口が提供されます。

重要ポイント

  1. 進行中のマップで友達の位置を表示
  • やるべきこと: レベル選択またはワールドマップインターフェイスで、各フレンドが現在いるレベルをマークします。
  • 価値がある理由: ソーシャルでの比較は、ゲームの最も強力な動機の 1 つです。プレイヤーは自分より先に友達を見たとき、追いつきたいという強い欲求を抱くでしょう。
  • 開始方法: Friends API に接続し、リーダーボードのスコアをレベルにマッピングし、マップ上にフレンドのアバターをレンダリングします。
  1. フレンド限定ランキングリスト
  • 対処方法: ゲーム内に「フレンドランキング」ビューを表示し、フレンド間のスコア比較のみを表示します
  • やる価値がある理由: グローバル リーダーボードは一般のプレイヤーにとっては遠すぎますが、フレンド リストはより競争力があり、アクセスしやすいものです。
  • 開始方法:loadFriends()友達リストを取得して使用するloadEntries(for:timeScope:)友達のスコアをロードする
  1. ファスト スタートに接続して待ち時間を短縮します
  • 対処方法: マルチプレイヤー バトル ゲームではファスト スタートが有効になっています。ゲームは2人からスタートできますが、他の人も次々と参加していきます。
  • 価値がある理由: すべてのプレイヤーが所定の位置に着くのを待つのは、バトル ゲームで最大の消耗です。ファスト スタートにより、プレイヤーはすぐにゲームに参加でき、残りの接続はバックグラウンドで処理されます。
  • 開始方法:canStartWithMinimumPlayers = true+でdidChangeState動的結合を処理しています
  1. Game Center グループを使用してクイック再起動を行う
  • やるべきこと: マッチング インターフェースに「最近一緒にプレイした」グループを表示し、ワンクリックで最後のチームメイトを招待します
  • 実行する価値がある理由: 知人ゲームは、ランダム マッチングよりも継続率がはるかに高くなります。Game Center はグループを自動的に管理するため、自分でソーシャル グラフを構築する必要はありません
  • 開始方法: システムの使用方法GKMatchmakerViewController、提案シェルフには最近のグループが自動的に表示されます
  1. 「継続プレイ」ディープリンクを追加
  • 何をすべきか: ゲームが URL スキームまたはユニバーサル リンクを介した最近のレベルへの直接アクセスをサポートしていることを確認してください。
  • 実行する価値がある理由: [続行] ウィジェットをクリックしてゲームに直接入りますが、ゲームが常にメイン メニューから開始される場合、エクスペリエンスは損なわれます。
  • 開始方法: を使用しますNSUserActivityまたは、URL スキームをカスタマイズしてゲームの状態を保存し、起動時に復元します。

関連セッション

コメント

GitHub Issues · utterances