ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Game Centerの新機能:ウィジェット、フレンド、マルチプレイヤーの改良点
GameKitを使ってオンラインゲーム体験をパワーアップし、マルチプレイヤー、リーダーボード、達成項目などの機能をゲームに採用します。ここでは、プレイヤーのマッチングやマルチプレイヤーAPIなど、Game Centerの最新の改良点を紹介し、ゲームの発見率を高める方法を探ります。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
-
ダウンロード
♪ (Game Centerの新機能:ウィジェット、 フレンド、マルチプレイヤーの改良点) こんにちは Allyです Game Centerのエンジニアリング プログラム部長です 今日はGame Centerに 追加された 改善についてお話しします また今年の春 Friends API など素晴らしい新機能も スタートしたので こちらもご紹介します 詳細に入る前に Game Centerの 主要な機能について 簡潔にお話しします その多くも昨年 完全に更新されているからです Game CenterはApple独自の ソーシャルゲーミングネットワークです デベロッパの方は GameKitフレームワークを 通じて Appに適した Game Center機能を 活用することができます プレイヤーはGame Centerの ゲームIDが1つあれば Leaderboard上で競争したり 進捗を確認したり マルチプレイヤーゲームで 一緒に遊んだり 友だちのプロフィールを チェックしたりできます 新しく素晴らしいゲームを 見つけやすくするのも Game Centerの主なゴールの1つです 私たちはゲームを見つけやすくするための 多くの新機能をiOS 14に加えましたが 今年はさらに多くの機能が加わりました ゲームは基本的にコミュニティです 友達がプレイしている ゲームをチェックできれば 新しいタイトルを 見過ごさないですみます そこでGame Centerを 昨年App Storeと直接 統合しました これでGame Centerの 友達がプレイしているゲームを App Storeのゲームと Arcadeタブの両方から 見られるようになりました もっと詳しく言うと Arcadeタブをのぞくと Game Centerの友だちが 面白そうな ゲームをしているのが 見えます 中には「Wonderbox」という 新ゲームもありますね プロダクトページで詳細を見てみましょう プロダクトページではゲーム自体の 詳細の他 そのゲームをプレイしている Game Centerの友だち全員 のリストも見られます タップするとGame Center プロフィールが出てきて そこでは 彼らがプレイしている 他のゲームも見られます 気に入ったものがあれば プロフィールから直接 ダウンロードできます 「プレイ中の友達」は Game Centerを有効にしている ゲームのプロダクトページ 全てに自動的に表示されます もちろん App Store以外から 友だちのプロフィールを チェックする方法もあります 例えば こんな感じで Leaderboard上で 友だちをタップすると プロフィールが出てきます このようにして新しいゲームを 簡単に見つけることができます ゲームを表示させるのに 追加のステップは不要です Game Centerのゲームは全て プレイ中の友達と 最近プレイしたゲームの両方に 自動的に表示されます 今年の秋 Game Centerに 2つのウィジェットが追加されました 1つはご推測通り プレイ中の友達です これで ホーム画面から直接 友達がプレイしているゲームを見つけたり 参加したりするのが さらに簡単になりました 2つ目のウィジェット 「プレイを続ける」は ユーザーが起動して プレイしたことのあるゲームを 再浮上させます 1度タップするだけで 前回中断した場面に すぐに戻れます この2つのウィジェットは iPadのより大きな フォーマットにも対応しています プレイ中の友達と 最近プレイしたゲーム同様 新たなコードや機能の追加は不要です Game Center対応のゲームなら 自動的に含まれています また 友達はソーシャルゲームに 欠かせない要素なので 友達リクエストや マルチプレイヤーフローにも 大幅な改善を行いました まずは友達関連です Game Centerの友達リクエストは 引き続きメッセージ経由で 送信されますが 見逃した場合に備え 友達リクエスト受信箱 を新しく追加し 1つの場所から管理 できるようにしました またメッセージ内のフローにも 大きな改善を行いました MacOSでの友達リクエスト送受信の サポートなどです しかしデベロッパの方は Game Centerの友達機能で 何ができるのかに 一番興味があるでしょう そこでFriends APIの出番です Friends APIではプレイヤーの Game Centerの友達に プライバシーに配慮しつつ アクセスできるため ゲームの中でありとあらゆる ユニークな体験を作れます 進捗マップで 友だちのレベルを 表示したり 友達をミッションに招待するなど Friends APIを導入することで 全て実現できます Chee Hanが追ってその方法を説明します ここまでGame Centerで ゲームの見つけやすさを改善し ゲームの外から他のプレイヤーと つながる方法を紹介しました 今度はゲーム内で活用できる Game Centerの メリットを見ていきましょう iOS 14では新しいプレイヤー ダッシュボードが導入されました Access Point API経由で ゲームに追加できます またUIも一新し ほぼ全ての画面が新しくなりました ゲームの基盤トーンにマッチする 鮮やかな色をキープしつつ どのゲームでもぴったり 馴染むようになっています また Appleのネイティブな Game Center UIと ご自身のAppに最適な カスタムUIと 合わせて使うこともできます 例えば レベル選択画面で 現在のLeaderboardスコアや レベルプレイ中のライブ インジケータを表示するなど UIをゲームに合わせる例は 非常にたくさんあります レベルプレイ中でなくても このようにアクセスポイントを通じ Game Centerの 全データへのアクセスを ユーザーに与えられます これにより プレイヤーは Game Centerのランキングや アチーブメントを さらに多彩に 使えるようになりました マルチプレイ対応のゲームにも 素晴らしいアップデートがあります 今年も つながりを 豊かにすることに注力し できるだけ早く一緒に プレイできるようにしました マルチプレイ対戦を始めると おすすめセクションに 既存のメッセージグループも 出てきます グループをタップすると その既存の スレッド内で招待が 送信されます また一緒にプレイした Game Centerの友達グループも 記憶しておすすめもします つまり1回タップするだけで ゲームに戻りまた同じ友達と プレイできるのです また 新しいマルチプレイヤーAPI Fast Startも導入します 後で登場するZhehongがFast Startの メリットや実装方法を説明します 最後に iPhoneとiPadの 全てのGame Center UIに コントローラーサポートも 追加しました 素晴らしいことに APIの新規導入や Xcodeのバージョニング などの手間は一切なく 対応するコントローラーで ホームボタンを押すだけで Game Centerダッシュボードが すぐ出てきます もう1度押すと ゲームに戻ります Game Centerダッシュボードと その中のセクションは全て デフォルトでナビゲート可能ですが ご自身のUIにコントローラー サポートを追加する必要があります またコントローラーの 他の改善点などの 詳細については 「Tap into Virtual Physical Game Controllers」 をご覧ください。 このセッションの残り部分では まず Chee Hanが友達関連機能の 改善についてお話しします Friends APIの詳細や ゲーム内で実装して Game Center friendsを 活用する方法などです そして最後に ZhehongがAppleで行われた 招待フローの合理化や Fast Start APIの実装による プロセスの迅速化など マルチプレイヤーについて 詳しく始めます まずは友達機能について Chee Hanがお話しします こんにちは Game Centerチーム エンジニアのChee Hanです ゲームで一番の楽しさとは 家族や友達と体験を 共有できることです ある人にとっては 競い合うことで またある人にとっては つながりです Game Center friendsでは それを実現できます 今日は2つの機能に フォーカスします 1つ目は プレイヤーが ゲーム内から招待を 送れるようにしたことです 2つ目は 皆さんが Friends APIで プレイヤーの友達リストを 活用できるように 新しいAPIを導入したことです まずは友達リクエストの 送信についてです 一緒にプレイするほうが良い ゲームの場合 プレイヤーにゲーム内で Game Centerの友達を 作ってもらうほうが 理にかなっています 今回 そのためのAPIを導入しました UI上に友達追加ボタンを 置けるようになりました ボタン画像としてSF Symbolsを 使うのがおすすめです ユーザーがボタンを押すと 友達リクエストのAPIを呼び出し プレイヤーにゲーム内での 友達追加を許可できます コードではどう見えているか 確認してみましょう presentFriendRequestCreator FromViewController API を呼び出すと 渡した本当の コントローラーと一緒に メッセージシートが 表示されます プレイヤーが友達リクエスト を送信し終えると シートをdismissし 任意エラーと共に コントロールをAppに返します それだけです コードを数行書くだけで プレイヤーはゲームを 閉じることなく 友達リクエストを 送信できるようになりました それでは Game Center friendsで 何ができるのか 見ていきましょう この春追加した2つ目の機能は Game Centerの友達への プライバシー配慮のAPIアクセスです ゲームを起動したプレイヤーが Game Center friendsアクセス が必要なこの機能を 初めて使おうとすると 友達リストへのアクセスを 許可するか拒否するか 選ぶよう促されます 許可すると プレイヤーの双方向の 友達リストが返されます つまりゲームへのアクセスを 同様に許可した友達のみの リストが返されるということです またこの許可は 全てのデバイス上で 同期されます ユーザー側ではリクエストを 1回しか必要としません では プレイヤーが友達リストへの アクセスを許可したら どうなるのでしょうか 次のようなことが できるようになります 友だちのレベルを 進捗マップで表示したり ロビーにいる友達との ミッションを開始したり 友達限定の 周期Leaderboardを マルチプレイゲームを している時に表示したり 他にも色々できます Friends APIが プレイヤーにどう見えているか 説明します プレイヤーの友達リストへの アクセス許可を求める APIがゲームから呼び出され プレイヤーはリクエストの 許可または拒否を求める おなじみのシステムプロンプト を受け取ります また 友達リストへの アクセスが必要な理由を 説明するオプションもあります プレイヤーがリクエストを承認すると ゲームへのアクセスを許可した 友だちのリストが返されます この例では Leaderboardで プレイヤーの進捗を Leaderboardに 送信したスコアと一緒に 記録しています スコアが送信されると Friends APIを使って Leaderboardスコアに基づく レベルの横の 進捗マップ上に 友だちを表示できます ご自身のゲームUIの中では こんな感じになっています 友達がどこまで進んだかが マップ上でこのように 表示されます これでゲーム内での友達の位置を 明確に把握できます では コードでこのUIを どう書くか説明します Friends APIを呼び出す前に いくつか設定が必要です まず NSGKFriendListUsageDescription をinfo.plistに加えます 前述の通り この記述はプレイヤーへの 許可プロンプトの一部として 表示されます 記述がない場合 Friends API呼び出しは 全てエラーになります 記述が設定されると GKLocalPlayerクラスで 2つの新しいAPIを呼び出せます 友達リストのアクセスを 確認するには GKLocalPlayerクラスで loadFriendAuthorizationStatus を呼び出してください これはAppの applicationDidFinishLaunchingで 呼び出しても良いです またステータスが 決定されていない場合は 許可プロンプトを 表示できるようになるまで プレイヤーの友達リストの 読み込みを遅らせたほうが 良いでしょう これで プロンプトが出た時に プレイヤーが判断するための 時間を与えられます 完了ブロック内の以下の 4つのステートのいずれかで GKFriendAuthorizationStatus を受け取ります 各ステートの詳細説明は GKLocalPlayerヘッダーから参照できます 返されたステートが 拒否または制限である場合 このプレイヤーから以前 情報を取得したことがあれば そのデータはデベロッパが 削除する必要があります プレイヤーが許可のステートで アクセスを与える場合は loadFriends APIを呼び出して プレイヤーの友達リストを 読み込めるようになります ちょっと見てみましょう このコードでは GameKit フレームワークを簡素化できる Swiftの非同期呼び出しを 使っています loadFriendsOnProgressionMap という名前の 非同期メソッドから始めます まず GKLocalPlayerクラスで loadFriends APIを呼び出します GameKitはプレイヤーの友だちを GKPlayerオブジェクトの 配列として返します 次に進捗Leaderboardを GameKitから LeaderboardID「progress」 として読み込みます Leaderboardオブジェクトが 取得されたら プレイヤーの友達のloadEntriesメソッドに 渡します そのスコアをLeaderboard 上で取得できます これはプレイヤーの現在のレベルの 確認に使われるものです これで 進捗マップの プレイヤーの友達の表示に 必要な全ての情報が得られました そして ゲームのFriends API の統合が正常に行われ 進捗マップ上のプレイヤーの 友達が表示されました この新機能を使って Appleのデベロッパの皆様から どんな素晴らしい体験が 生まれるのか とても楽しみです さてこれからZhehongが 今年マルチプレイに追加された 素晴らしい変更について説明します Chee Han ありがとう こんにちは Game Center チームのZhehongです 今年Game Center マルチプレイヤーに追加した 新機能や改善点をご紹介します Allyが先程述べたように Game Centerマルチプレイヤー は大幅に改善されました こうした変更の主な目的は プレイヤーができるだけ早く プレイする相手を見つけて プレイを開始できるようにすることです Game Centerのマルチ プレイヤーUIにより プレイヤーは様々な方法で プレイ相手とつながれます これには他のプレイヤーとの オートマッチや 複数の友達や連絡先 近くのプレイヤーや電話番号 Game Centerグループや メッセージグループへの 招待一斉送信などがあります 様々なソースからの友達候補を 表示する労力がかなり省けます ご存知かもしれませんが オートマッチングとは プレイヤーがGame Centerの マッチメイクプールから プレイする相手を 見つけるメカニズムです 次のスライドで その他の新しい コンセプトを説明します プレイヤーにより良い おすすめをするため Suggestion Shelfを導入しました これはプレイヤーが 招待する可能性がある Game Center内外の人のリストです 近くにいるプレイヤーや Game Centerグループ メッセージグループなどです Game Centerグループとは 今年導入された新コンセプトで リアルタイムまたはターン制の対戦で 最近一緒にプレイした プレイヤーグループを指します この新機能は 特定のグループの人々と 何度もゲームをプレイしたい プレイヤーにとって とても便利でしょう なぜなら1回タップするだけで グループのプレイヤー全員を 選択できるからです またメッセージグループでは iMessageで既に定期的に 会話している人々を 表示しています 1回タップするとメッセージ グループ全体が選択され 招待は既存のグループチャットで 送られます メッセージで 友達をすぐに招待できるだけでなく ゲームの後もチャットできます 招待したい相手を選択して 右上の送信ボタンをタップすると ロビーに表示されます 招待を送った後でも プレイヤーの追加や削除を 行える機能も追加しました 例えば 招待したプレイヤーのうち 応答できない人を 削除したいけれど 既に招待を受け入れた 他のプレイヤーは 削除したくない場合です そこで 招待したプレイヤーを 個別に削除できるようにしました プレイヤースロットの Xボタンをタップすると 相手がまだ承認していないか 承認後にゲームをやめた場合に その相手を削除できます また プレイヤーは その後もゲームに 人を招待できるので 一緒にプレイする人のグループを すばやく適切に形成する 柔軟性が得られました このようにマルチプレイヤー ゲームが 今まで以上に速く 簡単にプレイでき シンプルで合理的な体験を 提供できるようになりました プレイヤーが知っている人を 招待しやすくなると ゲームの見つけやすさ向上に つながるでしょう お分かりの通り Game Center マルチプレイヤーUIを活用すれば こうした素晴らしい機能を 全て無料で得られます マルチプレイを さらに速く始められるよう 「Fast Start」という 新APIを今年追加しました Fast Startを導入すると ゲームイニシエータには 全員の接続を待つか 招待後に必要最低人数が 接続した時点で ゲームを始めるかを 選択できます Game Center UIから ご自身のゲームUIへ プレイヤーをもっと素早く 引き戻せます 一方でバックグラウンドでは Game Centerは 残りのプレイヤーをつなげ 空のプレイヤースロット とのオートマッチを続行します 全てのプレイヤーが接続した時に ゲームに参加できます プレイヤーがばらばらの タイミングで参加できる マルチプレイセッションに対応 している場合 Game Center UIから Fast Startを活用できます この機能では ゲームのウォームアップシーンも作れます その実際の動作を 見てみましょう ここでは Fast Startを活用する 「The Coast」を例にします Fast Startによるゲーム構築が どれほどパワフルか お分かりいただけるでしょう まず minPlayers 2人 maxPlayers 5人に設定した GKMatchRequestで GKMatchmakerViewController を表示します これでローカルプレイヤーを含む 2人のプレイヤーが揃い次第 ゲームを始められます そして友達招待ボタンをタップして プレイヤーピッカーを起動します 招待したいプレイヤーを選んで 応答を待ちます ご覧の通り 招待が承認されると ゲーム開始ボタンが ハイライトされるので ゲームを始めるか他のプレイヤーの 参加を待つか選べます ここでは開始を選んだので マッチメーカービュー コントローラーが消え次第 ゲームが始まります 2人のプレイヤーが揃い次第 始めたので 2つのボートが見えます 一方 Game Centerは まだ背景につながっています 3人目のプレイヤーが参加すると ゲームに通知され 3つ目のボートが出てきます オートマッチされた スロットも2つあったので Game Centerは背景で オートマッチを続行中です マッチメイキングプロセスが終わると オートマッチされた2人の プレイヤーが参加します これでこのゲームに上限の 5人が参加しました ご覧の通りFast Startの導入により 様々なプレイヤーが様々な タイミングで同じゲーム セッションに参加できます 最後に今一緒に見てきた 流れで加えるべき コードを見てみましょう GKMatchmakerViewContollerを Fast Startモードが オンの状態で構成するには canStartWithMinumumPlayers プロパティを 「true」に設定するだけです GKMatchRequestの minPlayersは ゲームでプレイ開始に 必要な最低人数を意味します GKMatchインスタンス取得後に デリゲートを設定して マッチ対象のプレイヤーの接続状況を 把握できるようにします また didChangeConnectionStateは 後から参加するプレイヤーの処理を行える デリゲートメソッドです 招待された側では GKInviteインスタンスで初期化された GKMatchmakerViewContollerを 提示するだけです これは今やっていることと ほとんど同じものでしょう matchmakerDelegateも 忘れずに設定します 以上です 皆さんが今後 Fast Startだけでなく 今年追加された マルチプレイヤーの新機能や 改善点をどう導入するのか とても楽しみです では今日触れた内容をまとめます Game Centerで ゲームの見つけやすさを どう改善するかを説明しました 次に Friends APIと 友達関連の改善についてお話ししました そして マルチプレイヤーゲームを なるべく速くプレイできるようにする マルチプレイヤー機能や 改善点についてです また今年は コントローラーの サポートもさらに充実しました 最後に 関連性の高い 2つのセッションもご紹介します 周期Leaderboardと ゲームコントローラーについてです ご視聴ありがとうございました WWDCをお楽しみください ♪
-
-
8:23 - Friending API
// Call Friend Requests API to present friend request view from a view controller, when player click on Add Friends Button in your game let error = GKLocalPlayer.local .presentFriendRequestCreatorFromViewController(using: navigationController) if error != nil { print("Fail to send friend request with error: \(error!.localizedDescription).") }
-
11:47 - loadFriendsAuthorizationStatus
// Checking authorization GKLocalPlayer.local.loadFriendsAuthorizationStatus { (authorizationStatus, error) in guard error == nil else { // Error handling print(“Fail to load friends list with error: \(error!.localizedDescription).”) return } // Handle GKFriendsAuthorizationStatus switch authorizationStatus { case .notDetermined: // Player have not made a choice on friends list sharing case .denied: // Player have denied your request to access their friends list case .restricted: // You should delete collected player data from your end case .authorized: // Player have authorized your request to access their friends list } }
-
12:53 - loadFriends
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 // Display player on progression map } } } } catch { print("Error: \(error.localizedDescription).") } }
-
20:17 - Enable Fast Start Mode
// Set canStartWithMinimumPlayers to true to enable Fast Start mode 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)
-
20:39 - Handle Players Who Join The Game
// Set the GKMatch delegate and present your game scene when didFindMatch is called 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) } // Add players who join later by implementing didChangeState delegate func match(_ match: GKMatch, player: GKPlayer, didChange state: GKPlayerConnectionState) { if state == .connected { self.addPlayer(player) } }
-
20:54 - Present GKMatchmakerViewController on The Invitee Side
// On the invitee side, present GKMatchmakerViewController with the invite func player(_ player: GKPlayer, didAccept invite: GKInvite) { if let vc = GKMatchmakerViewController(invite: invite) { vc.matchmakerDelegate = self self.present(vc, animated: true, completion: nil) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。