中級チュートリアル: Pong、マルチプレイヤーARゲームの作成

ARDKの機能を使って作成されたARマルチプレイヤー版『Pong』のUnityプロジェクト例です。

このチュートリアルでは、プロジェクトを正しく機能させるためのUnity上での各ステップやC#スクリプトの使用法をご確認いただけます。この使用例では低レベルメッセージを使ってプレイヤー間のデータ送信を行っています。このプロジェクトの別バージョンでは、プレイヤー同期用のメッセージ送受信プロセスを能率化する高レベルAPIオブジェクト(HLAPI)のセットアップおよび使用例が示されています (こちら)

はじめに

使用可能なヘルパー

このシーンではいくつかのヘルパーとプレハブを使用し、ボイラープレートの挙動を素早く提供します。

ARNetworkingSceneManagerの使用

ARNetworkingSceneManagerARSessionARWorldTrackingConfiguration を生成し、Unityシーンのカメラが ARSession のカメラテクスチャをレンダリングするよう設定するためのプレハブです。このシーンではARNetworkingManagerの**Manage Using Unity Lifecycle** オプションが有効になっていますが、コンポーネント自体は無効化されています。このコンポーネントが有効化されると、ARNetworkingオブジェクト、サポート用の ARSession 、MultipeerNetworkingオブジェクトが作成され、ネットワークセッションに加わります。

Manage Using Unity Lifecycle はARSessionManagerとNetworkSessionManagerの両方で無効化されていますが、これは ARNetworkingManager のライフサイクルがそれらをコントロールするからです。

../../../_images/ARNetworkingScene_Manager.png

NetworkStatusIndicatorの使用

NetworkStatusIndicator プレハブは、シンプルな画像で MultipeerNetworking オブジェクトの現在のネットワーク状態を視覚化します。その時の状態に応じてサークルアイコンの色が変化します(白 = 初期化前、黄色 = 初期化済み、マゼンタ = ホストとして接続中、青 = ピアとして接続中、赤 = エラー)。

SessionIDFieldの使用

SessionIDField プレハブは基本的なUnity InputField をラップし、プログラムによって SessionID を取得し、最後に使用した SessionID を保存するためのAPIを提供します。さらに、提供された SessionID に対して MultipeerTextFieldSessionIDProvider が現在のUnityシーンの名前を追加し、異なるシーン(ネットワーク要件やプロトコルが異なる可能性あり)が誤って同一セッションに加わらないようにします。

FeaturePreloadManagerの使用

FeaturePreloadManager(GameManagers GameObject内)はシーンのロード時に必要なリソースのダウンロードを自動で開始します。このコンポーネントがない場合、リソースのダウンロードはそれらを必要とする ARSession が初めて実行された時に自動でダウンロードされます。そのため、プリロードは初回実行時の初期化時間を短縮するのに有用です。それ以降の実行時には、キャッシュ内にリソースが見つかるため影響はありません。

ゲームマネージャー

ゲームに関連するコンポーネントを一ヶ所に保存しておくためのコンテナ GameObjectGameController は『Pong』のゲームプレイロジックを管理する新しいスクリプトです。

プレハブの作成

ARDKExamples/Pong/Prefabs 内にはこの使用例のために作成されたプレイングフィールド、ボール、プレイヤーアバターのプレハブがあります。 GameController スクリプトには、ランタイム時の必要に応じてインスタンス化を行うために、これらのプレハブへの参考情報が含まれています。

トリガーコライダー

プレハブは主に、メッシュレンダー、コライダー、素材といった基本的なコンポーネントを含んでいます。ゲームロジックの補助用に追加または構成されているコンポーネントの中で特に重要なものは次のとおりです:

  • Ball プレハブにはトリガーコライダーを補助する RigidBody コンポーネントや BallBehaviour コンポーネント(後述)が含まれます。

../../../_images/BallPrefab.png
  • TableTop プレハブの**Goals** オブジェクトには IsTrigger が有効化された BoxCollider コンポーネントが含まれます。

../../../_images/GoalPrefab.png

この組み合わせにより、ボールとゴールが接触すると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を取得するための入力欄、接続状態を示す白いサークル、スコア用のテキスト欄、ゲーム開始用のボタンを追加します。

../../../_images/canvas.png

すべてのUI要素へのリファレンスはスクリプトに渡され、要素の有効化/無効化をプログラムで行い、スコアテキストおよび接続インジケーターの色を変えられるようにします。

Join ボタンはクリック時に ARNetworkingManager コンポーネントを有効化するように設定されています。一方、StartGameGameController.StartGame() を起動します。

../../../_images/startgame.png

続き: ARDKとゲームロジックの使用

こちらもご覧ください