中級チュートリアル: Pong、マルチプレイヤーARゲームの作成
ARDKの機能を使って作成されたARマルチプレイヤー版『Pong』のUnityプロジェクト例です。
このチュートリアルでは、プロジェクトを正しく機能させるためのUnity上での各ステップやC#スクリプトの使用法をご確認いただけます。この使用例では低レベルメッセージを使ってプレイヤー間のデータ送信を行っています。このプロジェクトの別バージョンでは、プレイヤー同期用のメッセージ送受信プロセスを能率化する高レベルAPIオブジェクト(HLAPI)のセットアップおよび使用例が示されています (こちら) 。
はじめに
使用可能なヘルパー
このシーンではいくつかのヘルパーとプレハブを使用し、ボイラープレートの挙動を素早く提供します。
ARNetworkingSceneManagerの使用
ARNetworkingSceneManager は ARSession と ARWorldTrackingConfiguration を生成し、Unityシーンのカメラが ARSession
のカメラテクスチャをレンダリングするよう設定するためのプレハブです。このシーンではARNetworkingManagerの**Manage Using Unity Lifecycle** オプションが有効になっていますが、コンポーネント自体は無効化されています。このコンポーネントが有効化されると、ARNetworkingオブジェクト、サポート用の ARSession
、MultipeerNetworkingオブジェクトが作成され、ネットワークセッションに加わります。
Manage Using Unity Lifecycle はARSessionManagerとNetworkSessionManagerの両方で無効化されていますが、これは ARNetworkingManager
のライフサイクルがそれらをコントロールするからです。
NetworkStatusIndicatorの使用
NetworkStatusIndicator プレハブは、シンプルな画像で MultipeerNetworking
オブジェクトの現在のネットワーク状態を視覚化します。その時の状態に応じてサークルアイコンの色が変化します(白 = 初期化前、黄色 = 初期化済み、マゼンタ = ホストとして接続中、青 = ピアとして接続中、赤 = エラー)。
SessionIDFieldの使用
SessionIDField プレハブは基本的なUnity InputField
をラップし、プログラムによって SessionID
を取得し、最後に使用した SessionID
を保存するためのAPIを提供します。さらに、提供された SessionID
に対して MultipeerTextFieldSessionIDProvider
が現在のUnityシーンの名前を追加し、異なるシーン(ネットワーク要件やプロトコルが異なる可能性あり)が誤って同一セッションに加わらないようにします。
FeaturePreloadManagerの使用
FeaturePreloadManager(GameManagers GameObject内)はシーンのロード時に必要なリソースのダウンロードを自動で開始します。このコンポーネントがない場合、リソースのダウンロードはそれらを必要とする ARSession
が初めて実行された時に自動でダウンロードされます。そのため、プリロードは初回実行時の初期化時間を短縮するのに有用です。それ以降の実行時には、キャッシュ内にリソースが見つかるため影響はありません。
ゲームマネージャー
ゲームに関連するコンポーネントを一ヶ所に保存しておくためのコンテナ GameObject
。 GameController
は『Pong』のゲームプレイロジックを管理する新しいスクリプトです。
プレハブの作成
ARDKExamples/Pong/Prefabs
内にはこの使用例のために作成されたプレイングフィールド、ボール、プレイヤーアバターのプレハブがあります。 GameController
スクリプトには、ランタイム時の必要に応じてインスタンス化を行うために、これらのプレハブへの参考情報が含まれています。
トリガーコライダー
プレハブは主に、メッシュレンダー、コライダー、素材といった基本的なコンポーネントを含んでいます。ゲームロジックの補助用に追加または構成されているコンポーネントの中で特に重要なものは次のとおりです:
Ball プレハブにはトリガーコライダーを補助する
RigidBody
コンポーネントやBallBehaviour
コンポーネント(後述)が含まれます。
TableTop プレハブの**Goals** オブジェクトには
IsTrigger
が有効化されたBoxCollider
コンポーネントが含まれます。
この組み合わせにより、ボールとゴールが接触するとUnityイベント OnTriggerEntered(Collider other)
が BallBehaviour
スクリプトに呼び出されます。Goals にはタグ(「RedGoal」と「BlueGoal」)があり、イベントのコライダー引数からクエリを行ってどちらのゴールが決まったのかを判断できます。
private void OnTriggerEnter(Collider other) { // Some removed game logic here... switch (other.gameObject.tag) { case "RedGoal": Controller.GoalScored("red"); break; case "BlueGoal": Controller.GoalScored("blue"); break; } }
プレイヤーアバター(ラケット)はコライダーではありません。プレイヤーの当たり判定はプログラムで計算されますが、似たようなトリガーシステムでも機能します。
UIの作成
次のステップはセッションコード入力用のUIと、現在の接続状況およびゲームオプションを決定するツールの作成です。ゲームシーンにキャンバスを追加し、そこにセッション開始用のボタン、セッションIDを取得するための入力欄、接続状態を示す白いサークル、スコア用のテキスト欄、ゲーム開始用のボタンを追加します。
すべてのUI要素へのリファレンスはスクリプトに渡され、要素の有効化/無効化をプログラムで行い、スコアテキストおよび接続インジケーターの色を変えられるようにします。
Join ボタンはクリック時に ARNetworkingManager
コンポーネントを有効化するように設定されています。一方、StartGame は GameController.StartGame()
を起動します。