WWDC Quick Look 💓 By SwiftGGTeam
Tap into Game Center: Leaderboards, Achievements, and Multiplayer

Tap into Game Center: Leaderboards, Achievements, and Multiplayer

元の動画を見る

ハイライト

2020 年の Game Center には、定期的なリーダーボード、新しいリーダーボードと実績ページ、実績の進行状況レポート プロセス、マルチプレイヤー マッチメイキング UI オプション、および PersonalizedCommunicationRestricted 制限フラグが追加され、ゲームが定期的な競争、実績の収集、リアルタイムまたはターンベースのマッチングを GameKit に接続できるようになります。

主要内容

多くのゲームでは、最初にハイスコアリストのみが必要です。プレイヤーの数が増えると、問題が発生します。永続的なランキングは初期のマスターによって占められ、新規プレイヤーが追いつくのが困難になります。毎週のアクティビティには個別のランキングが必要であり、開発者は時間枠にも対処する必要があります。達成状況はゲーム UI に散在しており、プレイヤーは次に何をすればよいのかわかりません。複数人からの招待では、友達、最近プレイした人、連絡先、自動マッチングにも配慮する必要があります。

WWDC 2020 の Game Center では、これらの一般的なゲーム サービスが GameKit に組み込まれています。リーダーボードには定期的なリーダーボードが追加されており、時間単位、日単位、または週単位でオカレンス (単一サイクル) を作成できます。 Game Center のゲーム内 UI も再設計され、ランキング、実績、マルチプレイヤー マッチはすべてシステム ページでホストできるようになりました。

この変更の価値は明白です。開発者は、毎週の競争テーブル、実績ページ、招待ロビーの UI 全体を自分で保守する必要はありません。ゲームはスコアを送信し、実績を報告し、適切なタイミングでマッチング リクエストを作成するだけで済みます。その後は、表示、マッチング、およびネットワーク プロセスの一部を Game Center に任せることができます。

セッションは3つのセクションに分かれています。最初の段落では、クラシック リーダーボードとリカーリング リーダーボードの違いに焦点を当てて、リーダーボードについて説明します。 2 番目の段落では、4 つの表示状態、数量制限、およびGKAchievement報告。 3 番目のセクションでは、リアルタイム、ターンベース、サーバーホストの 3 つのモードと、iOS 14 に追加された新しい一致する UI 構成とプライバシー制限フラグに焦点を当てたマルチプレイヤー ゲームについて説明します。

詳細

定期的なリーダーボード: 期間限定の競争を Game Center に引き継ぎます

(01:23) Game Center の過去のリーダーボードは古典的なリーダーボードでした。プレーヤーのスコアとランキングを永続的に保持し、合計経験値、史上最高スコア、レベルでの最短時間を記録するのに適しています。 2020 年の新機能としては、1 時間ごとの 15 分間のチャレンジ、毎週日曜日の正午に行われる 1 時間のイベント、毎日の新しいリーダーボード ラウンドなど、短い繰り返しのコンテスト用の繰り返しリーダーボードがあります。

(02:32) 定期的なランキングは App Store Connect で設定されます。開発者は、最初の開始日、頻度、期間を設定します。各オカレンスには開始時刻と終了時刻があり、新しいオカレンスは現在のオカレンスが終了した後にのみ開始されます。発生は重複できないため、期間を頻度より大きくすることはできません。

(04:05) クラシック リーダーボード スコアを送信する場合は、次を使用します。GKLeaderboard.submitScore。同じ呼び出しで 1 つ以上のリーダーボード ID にスコアを送信できます。

// Use the class method to submit score to one or more leaderboards at once
GKLeaderboard.submitScore(self.points, context: 0, player: GKLocalPlayer.local,
    leaderboardIDs: ["my.leaderboard.id"]) { error in
}

キーポイント:

  • self.pointsが今回提出するスコアです。
  • context: 0Game Center がスコアとともに保存するオプションのコンテキスト値です。
  • player: GKLocalPlayer.local現在認証されているローカル プレーヤーを示します。
  • leaderboardIDsランキングIDは複数配置できるので、1つの集落に複数のランキングを書き込むのに適しています。
  • 完了ハンドラーで送信エラーを処理します。

(04:30) 定期的なリーダーボードの場合、スコアを定期的なリーダーボード ID に直接送信することもできます。 Game Center は、現在アクティブなオカレンスにスコアを投稿します。デバイスがオフラインの場合、Game Center は送信を遅らせます。サーバーはスコアを受信するまでに検証するため、スコアの有効期限が切れるとオフライン送信が失敗する可能性があります。

// Use the class method to submit score to one or more leaderboards at once
GKLeaderboard.submitScore(self.points, context: 0, player: GKLocalPlayer.local,
    leaderboardIDs: ["my.recurring.leaderboard.id"]) { error in
}

キーポイント:

  • コード形式は従来のリーダーボードと同じです。
  • "my.recurring.leaderboard.id"App Store Connectで設定された定期的なランキングリストを指します。
  • 送信は、現在アクティブなオカレンスにのみ該当します。
  • オフライン シナリオの場合、ゲーム決済エクスペリエンスでエラー処理を予約する必要があります。

(04:48) ゲームがすでにオカレンスをロードしている場合は、パスすることもできますGKLeaderboardインスタンスの提出。セッションがおすすめですstartDateそしてdurationオカレンスがまだアクティブであるかどうかを確認します。

// Submitting to a specific occurrence of a recurring leaderboard
GKLeaderboard.loadLeaderboards(IDs:["my.recurring.leaderboard.id"]) { (fetchedLBs, error) in
    if let lb = fetchedLBs?.first {
       lb.submitScore(self.points, context: 0, player: GKLocalPlayer.local) { error in
       }
    }
}

キーポイント:

  • loadLeaderboardsまず ID 別にリーダーボードをロードします。
  • fetchedLBs?.first現在のオカレンスに対応するオカレンスを取得しますGKLeaderboard
  • lb.submitScoreこのオカレンスにスコアを送信します。
  • この記述方法は、カスタム UI がすでにオカレンス オブジェクトを保持しているシナリオに適しています。

ランキング UI: システム ページとカスタム ページには別の入り口があります

(05:25) ランキングを表示するには2つの方法があります。 Apple は GameKit のゲーム内 UI を使用することを推奨しています。GKGameCenterViewControllerリスト、リーダーボードの詳細、フレンドとグローバル スコープ、クラシック リーダーボードの時間範囲、定期的なリーダーボードの発生切り替えを処理します。

// Launching in-game UI

// Display a list of leaderboards
let vc = GKGameCenterViewController(
             state: .leaderboards)
vc.gameCenterDelegate = self
present(vc, animated: true, completion: nil)


// Or directly display scores for a specific leaderboard
let vc = GKGameCenterViewController(
             leaderboardID: "YOUR_ASC_LEADERBOARD_ID",
             playerScope: .global,
             timeScope: .allTime)
vc.gameCenterDelegate = self
present(vc, animated: true, completion: nil)

キーポイント:

  • state: .leaderboardsリーダーボードのリストを開きます。
  • gameCenterDelegateGame Center ページの終了などのイベントを受信するために使用されます。
  • 2 番目のイニシャライザは、特定のランキング リストのスコア ページにディープ リンクできます。
  • playerScope: .globalグローバルスコープを表示するか、GameKitがサポートするスコープによって切り替えることができます。
  • timeScope: .allTimeクラシックリーダーボードの時間ディメンション。

(07:14) ゲームが独自のリーダーボード UI を描画したい場合は、リーダーボードをロードして自身でスコアを取得する必要があります。繰り返しのリーダーボードでも発生を処理します。 Game Center は、期限切れのイベントを最大 30 日間のみ保持します。ログインしているプレイヤーは通常、現在の出来事と 1 つ前の出来事を見ることができます。

// Accessing previous occurrence

// Load current occurrence of a recurring leaderboard
GKLeaderboard.loadLeaderboards(IDs:["my.recurring.leaderboard.id"]) { (fetchedLBs, error) in
    if let current = fetchedLBs?.first {
       // Load previous occurrence using the current occurrence
       current.loadPreviousOccurrence { (prevOccurrence, error) in
           // Do something with the previous occurrence
       }
    }
}

キーポイント:

  • loadLeaderboards定期的なリーダーボードには、デフォルトで現在のオカレンスが読み込まれます。
  • current.loadPreviousOccurrence現在のオカレンスから以前のアクセス可能なオカレンスを取得します。
  • prevOccurrence前のラウンドの結果を表示したり、試合後の振り返りに使用できます。
  • ゲームが独自の UI を描画する場合、発生がクリアされた場合やプレイヤーが前のラウンドに参加しなかった場合の状況を考慮する必要があります。

実績: 進行状況を利用してプレイヤーをゲームに戻す

(10:20) 実績は、プレイヤーが目標を達成した後の収集アイテムです。 Game Center の実績には、ロック、進行中、完了、非表示の 4 つの表示状態があります。 hidden は、事前にプロットや目的を台無しにしたくない実績に適しています。 iOS、macOS、および tvOS の Game Center ダッシュボードにはすべて実績が表示されるため、実績のテキスト、画像、および進行状況でプレーヤーの目標を個別に示す必要があります。

(13:01) 数量制限も非常に明確です。ゲームには最大 100 個の実績があり、それぞれ最大 100 ポイント、合計最大 1000 ポイントです。後続のアップデートで新しい実績が必要になる可能性があるため、最初のバージョンのリリース時に予算を使い切らないようにしてください。

(14:34) 統合の成果は 3 つのステップに分かれています。最初にローカル プレーヤーを認証します。GKAchievement進捗状況を報告します。最後に、Game Center ダッシュボードまたは実績ページを使用して表示します。 GameKit の実績の進行状況が 0 である限り、ロックされた状態で表示されます。

if let achievement = GKAchievement(identifier: identifier) {
    achievement.percentComplete = percentComplete
    GKAchievement.report([achievement]) { error in
        if let error = error {
            print("Error in reporting achievements: \(error)")
        }
    }
}

キーポイント:

  • identifierApp Store Connect で設定された実績 ID に対応する必要があります。
  • percentComplete完了の進行状況を示します。 100に達すると実績完了となります。
  • GKAchievement.report一度にレポートできる配列は 1 つです。
  • 完了ハンドラーは、報告されたエラー、特にネットワークまたは認証の問題を処理する必要があります。

(16:05) 実績表示時に使用を優先するGKGameCenterViewController(state: .achievements)。独自の実績ページを描画する場合は、次を使用しますGKAchievementDescriptionローカライズされたタイトル、不完全な説明、完成した説明、完成したイメージと不完全なイメージを読みます。

// Showing the Game Center achievements page

let viewController = GKGameCenterViewController(state: .achievements)
viewController.gameCenterDelegate = self
present(viewController, animated: true)

キーポイント:

  • state: .achievements現在のゲームの実績ページを直接開きます。
  • gameCenterDelegateページのライフサイクル コールバックを担当します。
  • presentプレイヤーがゲームを終了せずにゲーム内の進行状況を確認できるようにします。
  • 独自の UI を描画する場合でも、テキスト ローカリゼーションは GameKit から返されたデータから取得する必要があります。

マルチプレイヤー: マッチメイキング、招待、プライバシー制限

(19:22) Game Center は 3 種類のマルチプレイヤー ゲームをサポートしています。リアルタイム モードは、プレーヤーの検索、接続の確立、データの送信を担当します。ターンベース モードは、ターン管理とデータ ストレージを担当します。サーバーホストモードでは、プレイヤーリストが開発者自身のサーバーに渡されます。

(21:23) リアルタイム マルチプレイヤー マッチングの基本プロセスは次のとおりです: プレイヤーの認証、作成GKMatchRequest、プレーヤーの数と招待可能なオブジェクトを設定し、自動マッチングまたは表示を選択します。GKMatchmakerViewController。アプリケーションも次のように開始する必要がありますGKInviteEventListener、ローカル プレーヤーに登録して、他のプレーヤーからの招待を受け取ります。

キーポイント:

  • GKMatchRequestゲームに必要なプレイヤーの数を説明します。
  • セッションでは、開発者がリクエストでプレーヤーの数を設定し、誰を招待するかを定義できると明示的に述べています。
  • GKMatchmaker自動マッチング プロセスでは他のプレーヤーが検索され、返されたマッチング オブジェクトはプレーヤー間でデータを送信するために使用されます。
  • プレイヤーが自分のプレイヤーを選択する必要がある場合は、それを表示できますGKMatchmakerViewController
  • GKInviteEventListenerアプリ起動時に登録して他のプレイヤーからの招待を受け取るのに適しています。

(22:52) ターンベースのマッチング プロセスはリアルタイム マッチングに近いものです。違いは採用にありますGKTurnBasedEventListener、そして使用しますGKTurnBasedMatchまたはGKTurnBasedMatchmakerViewController。ターンベース ゲームでは、すべてのプレイヤーが同時にオンラインになるのを待つ必要はありません。作成後、現在のプレイヤーはすぐに自分のターンを開始できます。

キーポイント:

  • GKMatchRequestそれでもプレイヤーの数とマッチメイキングの条件について説明します。
  • GKTurnBasedEventListenerターンベースのイベントの受信を担当します。
  • GKTurnBasedMatchプログラムによるマッチングの場合、GKTurnBasedMatchmakerViewControllerシステムマッチングインターフェースを表示するために使用されます。
  • 現在のプレイヤーが最初に行動し、後で他のプレイヤーが参加するか応答するのを待つことができます。

(23:29) iOS 14 では、マッチメイキング UI の構成オプションが追加されています。 automatch のみは、プレイヤーが迅速かつランダムに開始する必要があるゲームに適しています。近くにあるのは、同じ部屋での ARKit ゲームにのみ適しています。セッションはまた、新しい制限は複数人招待のカスタムメッセージとボイスチャットの両方に影響を与えると述べた。

// Check if personalized communication is restricted
if GKLocalPlayer.local.personalizedCommunicationRestricted {
    // Disable UI for Voice chat
}

キーポイント:

  • GKLocalPlayer.local現在の Game Center プレーヤーを表します。
  • personalizedCommunicationRestrictedのためにtrue、アプリケーションは関連するパーソナライズされたコミュニケーション ポータルを閉じる必要があります。
  • Session で示された例は、ボイスチャット UI を無効にすることです。
  • このチェックは、マルチプレイヤー ロビー、招待入り口、音声ボタンの表示ロジックと組み合わせて行う必要があります。

重要ポイント

  • 毎週のチャレンジ リストを作成: 定期的なリーダーボードにレベル スコアを受け取り、毎週新しいチャレンジを自動的に開きます。新しいプレイヤーは毎週ランキングを追いかけるチャンスがあるので、やる価値があります。まず、App Store Connect で毎週の頻度と期間を構成してから、GKLeaderboard.submitScoreレベルチェックアウトページで送信してください。

  • 期間限定イベントに参加: メインメニューに次のチャレンジまでのカウントダウンが表示され、イベント期間中の現在のイベントのランキングが表示されます。セッションには、オカレンスの開始時刻、期間、および次回の開始情報があることが明示的に示されているため、実行する価値があります。最初に定期的なリーダーボードをロードし、次に発生時間に基づいてボタンのステータスを決定できます。

  • 段階的な実績ルートを作成する: 初心者、熟練プレイヤー、コア プレイヤーそれぞれの実績をデザインします。 Game Center ダッシュボードにはロック、進行中、完了のステータスがプレイヤーに直接表示されるため、これを実行する価値があります。利用可能GKAchievement(identifier:)そしてpercentCompleteタスクの進行状況が変化するたびにレポートします。

  • ワンクリック実績ページの作成: 一時停止メニューまたはレベル決済ページに「実績」ボタンを配置して、Game Center 実績ページを直接開きます。システム ページでは進行状況、画像、ローカライズされた表示がすでに処理されているため、実行する価値があります。利用可能GKGameCenterViewController(state: .achievements)始めましょう。

  • マルチプレイヤーを簡単に開始: カジュアル モードにのみオートマッチを提供し、ローカルの同じ画面または AR ゲームプレイにのみ近くを提供します。マッチメイキング UI により、プレイヤーがプレイヤーを選択する際に必要な手順が削減されるため、これを行う価値があります。利用可能GKMatchRequestプレイヤーの数を定義し、自動マッチングを選択するか、GKMatchmakerViewController

関連セッション

コメント

GitHub Issues · utterances