WWDC Quick Look 💓 By SwiftGGTeam
Tap into Game Center: Dashboard, Access Point, and Profile

Tap into Game Center: Dashboard, Access Point, and Profile

元の動画を見る

ハイライト

Apple は 2020 年に Game Center をゲームに戻しました。プレイヤーは Access Point からダッシュボードを開いて、情報、友達、ランキング、実績を直接確認できます。開発者は既存の GameKit コントローラーを使用してこのインターフェイスにアクセスします。

主要内容

当初、多くのゲームがGame Centerに接続されていた頃は、入り口は自分でデザインする必要があり、情報ページはゲームから飛び出す必要があり、ランキングや実績、フレンド情報もさまざまな場所に点在していました。自分自身や友達の進歩を見たいプレイヤーは、多くの場合、現在のプロセスから離れなければなりません。開発者にとって、これは、ログイン、プライバシー、軽微な制限、tvOS 共有デバイスでのユーザーの切り替えを処理するだけでなく、ゲーム内 UI を維持することを意味します。

このセッションで最初に行うことは、Game Center をゲームへの固定された入り口に変えることです。ゲーム開始後もウェルカム バナーが表示され、続いてアクセス ポイントが表示されます。最初にリーダーボードに実績やランキングの数を表示し、その後プレーヤーのアバターに折りたたむことができます。プレイヤーは自分のアバターをクリックしてダッシュボードに入り、同じオーバーレイ インターフェイスで情報、ランキング、実績、課題、友人情報を表示します。

2 つ目は、開発者が作成するインターフェイスの量を減らすことです。ダッシュボードは依然として次のもので構成されていますGKGameCenterViewController提示されました、追加されました.dashboardそして.localPlayerProfileなどのステータス。アクセスポイントGKAccessPoint.shared位置、ハイライト、表示ステータスを制御します。ゲームでは、メイン メニューで開き、カットシーン、ゲームプレイ、設定ページで非表示にするだけで済みます。

3 つ目は、プレイヤーのアイデンティティをより明確な開発モデルに変えることです。GKLocalPlayer現在のデバイス上のプレーヤーを表します。GKPlayer他のプレイヤーを指します。認定はできるだけ早く開始する必要があります。認定が完了すると、ゲームは Game Center API を呼び出し、招待、チャレンジ、およびユーザー変更通知を受け取ることができるからです。認証後、プレイヤーのプライバシー、未成年ステータス、マルチプレイヤー ゲームの制限、個人向けの通信制限もチェックされます。

詳細

### 使用GKGameCenterViewControllerダッシュボードを開く

(10:05) 新しいダッシュボードは、Game Center 機能への統合された入り口です。使い慣れたものを今でも使用していますGKGameCenterViewController、違いは初期化状態にあります。

// GKGameCenterViewController

public init(state:)
[...]

// Example: Display Main Dashboard
let vc = GKGameCenterViewController(state: .dashboard)
vc.gameCenterDelegate = self
present(vc, animated: true, completion: nil)

[...]
enum GKGameCenterViewControllerState : Int {
   case `default`
   case leaderboards
   case achievements
   case challenges
   case localPlayerProfile
   case dashboard
}

キーポイント:

  • GKGameCenterViewController(state: .dashboard)最上位のダッシュボードを直接開きます。
  • gameCenterDelegateコントローラーのシャットダウンなどのデリゲート コールバックの処理も引き続き担当します。
  • leaderboardsachievementschallengesそしてlocalPlayerProfileプレイヤーを指定されたエリアに連れて行くことができます。
  • このコードは、メイン メニューの「Game Center」ボタンに適しており、カスタム UI から統合パネルに入るのにも適しています。

(10:51) ゲームに特定のリーダーボード ボタンがすでにある場合は、引き続き 1 つのリーダーボードにディープ リンクできます。

// Display scores for a specific leaderboard
let vc = GKGameCenterViewController(
                leaderboardID: "grp.xyz.laketahoe",
                playerScope: .global,
                timeScope: .allTime)
vc.gameCenterDelegate = self
present(vc, animated: true, completion: nil)

キーポイント:

  • leaderboardIDApp Store Connectで設定されたランキングに対応します。
  • playerScopeグローバル プレーヤーまたはフレンドを表示するかどうかを制御します。
  • timeScope今日、今週、または全期間などの時間枠を制御します。
  • 単一のリーダーボードにディープリンクした後も、プレーヤーはダッシュボード内の利用可能な領域を参照できます。

メインメニューにアクセスポイントを表示

(13:18) アクセス ポイントは恒久的な入り口であり、ゲームプレイ画面ではなくゲームのメイン メニューに配置するのに適しています。その位置は言語の方向によって変わります。topLeading右から左に記述する言語では、右上隅に切り替わります。

// Configure and show Access Point
func showMainMenu() {
    // Call your code to setup the main menu
    self.setupMainMenu()

    // Place access point on top left
    GKAccessPoint.shared.location = .topLeading

    // Show highlights
    GKAccessPoint.shared.showHighlights = true

    // Show it!
    GKAccessPoint.shared.isActive = true
}

キーポイント:

  • GKAccessPoint.shared.locationアクセス ポイントが配置されている隅を選択します。
  • showHighlights実績の数やデフォルトのリーダーボードの位置などの概要情報を開きます。
  • isActive = trueアクセスポイントが表示されます。
  • セッションをメイン メニューに表示し、ムービー スタイルのオープニング、ゲームプレイ、設定ページでは非表示にすることをお勧めします。

ダッシュボードがポップアップしたときにメニュー アニメーションを一時停止する

(14:00) プレーヤーがアクセス ポイントをクリックした後、ゲームはメイン メニューのアニメーションやその他の背景効果を一時停止する必要がある場合があります。isPresentingGameCenterこの信号を提供しました。

let observation = GKAccessPoint.shared.observe(
           \.isPresentingGameCenter
    ) { [weak self] _,_ in
    self.paused = GKAccessPoint.shared.isPresentingGameCenter
}

キーポイント:

  • observe(\.isPresentingGameCenter)Game Center インターフェイスが表示されているかどうかを監視します。
  • ゲーム独自のものをコールバックに入れるpaused状態はアクセス ポイントの状態と同期されます。
  • これにより、ダッシュボードがゲームの上にオーバーレイされているときに、バックグラウンドで高コストのアニメーションが引き続き再生されるのを回避できます。
  • 監視オブジェクトはゲームによって保存され、ライフサイクルが終了した後に解放される必要があります。

アクセスポイントの画面領域を避けてください

(14:44) アクセス ポイントは、ゲームのメイン メニューのタイトル、キャラクター、またはボタンをブロックする場合があります。frameInScreenCoordinatesその位置はレイアウト システムに任せることができます。

// Observable properties
// frameInScreenCoordinates

let observation = GKAccessPoint.shared.observe(
           \.frameInScreenCoordinates
    ) { [weak self] _,_ in
    let screenFrame = GKAccessPoint.shared.frameInScreenCoordinates
    let accessPointFrame = myView.convert(screenFrame, from: nil)
    // adjust your layout
}

キーポイント:

  • frameInScreenCoordinatesアクセス ポイントに現在の画面の四角形を与えます。
  • myView.convert(screenFrame, from: nil)画面座標をゲームビュー座標に変換します。
  • アクセス ポイントがさまざまなハイライトを表示すると、サイズが変化する可能性があるため、ここでの観察に適しています。
  • ゲームは、アバターの入り口で覆われないように、タイトル画像、ボタン、または装飾要素を移動できます。

Apple TV とコントローラー フォーカスをサポート

(15:18) tvOS またはコントローラーのシナリオでは、ゲーム自体がフォーカス フィードバックを描画する場合があります。この時点でも、アクセスポイントをフォーカス判定に含める必要があります。

// Apple TV and controllers

// track and update focus
func trackController(position: CGPoint) {
  let screenFrame = GKAccessPoint.shared.frameInScreenCoordinates
  let accessFrame = myView.convert(screenFrame, from: nil)
  // if the point is in the access point turn on feedback
  accessPointElement.focusFeedback = CGRectContainsPoint(accessFrame, position)
}

キーポイント:

  • positionゲームが追跡しているリモコンまたはコントローラーのフォーカス位置です。
  • コードはまずアクセス ポイントの画面領域を取得し、それをゲーム ビューの座標に変換します。
  • CGRectContainsPointフォーカスがアクセス ポイント内にあるかどうかを確認します。
  • ヒット後、ゲームは独自のアクセス ポイント プロキシ要素にフォーカス フィードバックを描画できます。

(15:38) プログラム API を使用して、プレーヤーが選択キーを押したときにダッシュボードを開きます。

// Apple TV and controllers

// Handle selection
func accessPointSelected() {
  GKAccessPoint.shared.triggerAccessPoint {}
}

キーポイント:

  • triggerAccessPointシミュレートされたプレーヤーはアクセス ポイントをトリガーします。
  • これにより、リモート コントロールとコントローラーのプロセスがタッチ クリックに依存しなくなります。
  • 呼び出し後、システムはアバターをクリックしたときと同じダッシュボード プロセスに入ります。

ローカル プレーヤーのプロフィールを開いて制限を処理する

(20:01) プレイヤー情報は設定ページからゲームに入力されます。開発者は、ローカル プレーヤーのプロフィール ページを直接レンダリングできます。

// Local player profile

let profileVC = GKGameCenterViewController(state: .localPlayerProfile)
profileVC.gameCenterDelegate = self

present(profileVC, animated: true, completion: nil)

キーポイント:

  • .localPlayerProfile現在のプレーヤーのプロフィール ページに直接移動します。
  • プレイヤーはここで実績を確認したり、友達を見つけたり、友達がプレイしているゲームを確認したりできます。
  • このコードは、「My Profile」ボタンの後ろに配置するのに適しています。

(20:28) 認証が完了すると、ゲームはローカル プレーヤーの制限も読み取り、機能を非表示にするかどうかを決定します。

// Local player restrictions

GKLocalPlayer.local.authenticateHandler = { viewController, error in
    let isGameCenterReady = (viewController == nil) && (error == nil)

    if isGameCenterReady {
        if GKLocalPlayer.local.isUnderage {
            // Hide explicit game content
        }

        if GKLocalPlayer.local.isMultiplayerGamingRestricted {
            // Disable multiplayer game features
        }

        if GKLocalPlayer.local.isPersonalizedCommunicationRestricted {
            // Disable in game communication UI
        }
    }
}

キーポイント:

  • authenticateHandlerGame Center の認証は自動的に開始され、ステータスが変化すると呼び戻されます。
  • viewController == nilそしてerror == nilローカルプレーヤーの準備ができていることを示します。
  • isUnderage未成年のプレイヤーにとって不適切なコンテンツを非表示にするために使用されます。
  • isMultiplayerGamingRestrictedマルチプレイヤー ゲームの入り口を閉じるために使用されます。
  • isPersonalizedCommunicationRestrictedこれは、iOS 14 での新しい制限であり、ゲーム内の音声やメッセージなどのパーソナライズされたコミュニケーション UI をオフにするために使用されます。

重要ポイント

  • 干渉ゼロの Game Center メイン メニュー入口を作成: アクセス ポイントをメイン メニューの隅に配置して開きます。showHighlights実績の数またはデフォルトのリーダーボードの位置を表示します。プレイヤーはゲームを離れることなく自分のプロフィールやソーシャル情報を見つけることができるので、やる価値があります。メインメニューのライフサイクルで設定することから始めますGKAccessPoint.shared.locationshowHighlightsそしてisActive

  • 「マイ ゲーム プロフィール」ページ ボタンを作成: ゲーム設定ページまたはアーカイブ ページにローカル プレーヤー プロフィール エントリを追加します。これを実行する価値がある理由は、プレイヤーが実績、フレンド、最近のプレイ情報を同じ場所で確認できるためです。から始めるGKGameCenterViewController(state: .localPlayerProfile)システム情報ページを表示します。

  • ダウングレード可能なマルチプレイヤー ポータルを作成: 認証後のチェックisMultiplayerGamingRestricted、制限がオンの場合はマルチプレイヤー ボタンを非表示にし、制限がオフの場合はマッチング プロセスに入ります。これを実行する価値がある理由は、ペアレンタル コントロールとアカウント制限がマルチプレイヤー機能に直接影響するためです。先頭に制限チェックを入れますGKLocalPlayer.local.authenticateHandler成功したブランチ。

  • コントローラーに適応するダッシュボード エントリを作成します: tvOS または外部コントローラー メニューで、次を使用します。frameInScreenCoordinatesフォーカスがアクセス ポイントにあるかどうかを判断します。これを実行する価値がある理由は、リビング ルームのシーンではタッチ操作がなく、プレーヤーは依然として明確なフォーカス フィードバックを必要としているためです。最初に、ハンドル追跡座標を同じビュー座標に変換してから、triggerAccessPoint

  • システムの入口で遮られないメインメニューのレイアウトを作成: 観察frameInScreenCoordinates、アクセス ポイント表示のハイライトによってサイズが変更される場合は、タイトル画像またはボタンを移動します。これを実行する価値がある理由は、システムの入り口が常にメイン メニューに留まり、オクルージョンによりプレイヤーが誤ってコア操作に触れたり、コア操作をはっきりと確認したりする可能性があるためです。最初にメイン メニュー要素にレスポンシブな安全マージンを追加します。

関連セッション

コメント

GitHub Issues · utterances