SnowballFight:マルチプレイヤー

ARDK機能の使用法を実演し、同じ場所で行われるネットワークマルチプレイヤーセッションを実行します。ここでは最大4人のプレイヤーを同一の座標空間にローカライズし、一緒にプレイします。

概要

プレイヤーはまず、新しいマルチプレイヤーセッションをホストするか、またはホストの提供するセッションコードを使って既存のマルチプレイヤーに参加するかを選択します。 セッションとの接続が完了すると、プレイヤーはビジュアルランドマークのスキャンを行って使用デバイスの位置をローカライズするよう促されます。ローカライズ完了後、セッション内の各プレイヤーの "yeti name”および接続状態を記載したプレイヤーリストが表示されます。

すべてのプレイヤーの準備が整ったらホストがマッチを開始します。

画面上部に45秒のゲームタイマーとプレイヤーの累積スコアが表示されます。スコアは敵ホタルに雪玉を当てるたびに100点加算されます。

制限時間が終了すると、各プレーヤーにスコア一覧が表示され、勝者を確認できます。

使用中のARDK機能:

  • ARNetworkingSceneManager - ネットワークARセッションを管理

  • ARPlaneManager - 各プレイヤーの周囲のARプレーンの検知を管理

  • ARDepthManager - 仮想オブジェクトのオクルージョンに用いる深度オクルージョン効果を提供します。セマンティック セグメンテーションシステムを使用して地面にあるオブジェクトのオクルージョンを抑圧します

  • ARSceneCamera - ARNetworkingSceneManagerの子

追加のヘルパー

  • ARNetworkingHelper - ARDKネットワークセッションの管理に用いるヘルパー利便性機能。ARDKネットワークイベントのラップおよびリレーも行います

  • SnowballFightDebugManager - デモのデバッグ機能を管理

ステート

Miscステート

StateHostOrJoin

ホストするのか既存のSnowballFightセッションに参加するのかをプレイヤーにたずねるGUIを提示します

StateWarning

UIがARの使用に関する警告を表示しています。アプリの実行につき1回だけ、ユーザーが初めてARSessionに入る前に表示されます。

ホストステート - セッションをホスト中のプレイヤー専用

StateHostInstructions

マルチプレイヤーSnowballFightマッチをホストする方法について説明を表示します。このステートでホストがStartボタンを押すとステートが終了し、ARNetworkingHelper.InitAndHostへの呼び出しを用いてARNetworkingManagerが有効化されます。このメソッドはランダムなセッションコードを生成し、ARNetworkingManagerを有効化します。ARNetworkingManagerはUnityのライフサイクルを使用して管理され、セットワークセッションおよびARセッションの作成を制御します。StateConnectingへ移行します。

StateSessionCreated

作成されたセッションコードをホストに見せます。

StateSoloConfirm

他に接続プレイヤーがいない状態でホストがセッションを開始しようとすると、シングルプレイヤーセッションを作成することになると警告します。

参加ステート - 既存セッションに参加するプレイヤー専用

StateJoinSession

セッションコードを入力して既存セッションに参加できるよう、プレイヤーにテキスト入力欄を提示します。このステートでプレイヤーがJoin Gameボタンを押すとステートが終了し、ARNetworkingHelper.InitAndJoinへの呼び出しを用いてARNetworkingManagerが有効化されます。ARNetworkingManagerはUnityのライフサイクルを使用して管理されるため、これによってネットワークセッションおよびARセッションが作成されます。StateConnectingへ移行します。

StateJoinInstructions

既存のSnowballFightセッションに参加およびローカライズする方法の説明を表示します。

ゲーム前ステート

StateConnecting

プレイヤーのデバイスがネットワークセッションに接続する間、UIグラフィックを表示します。

プレイヤーが接続に失敗するとアプリケーションがタイムアウトエラーを表示し、シーンをリスタートさせて再試行できるようにします。

プレイヤーがセッションに接続するには、ホストから参加の承認を得る必要があります。ホストピアの承認はARNetworkingHelper.OnPeerAdded()のホストが送信するピア・ツー・ピアメッセージによって処理されます。これによりホストは、4人のプレイヤーのみがマッチに参加するようにできます。

セッションへの参加を選択したプレイヤーが誤ったコードを入力した場合、そのプレイヤーは自分のセッションのホストになります。この状態が検知されると、そのプレイヤーには「無効なコード」エラーが表示され、シーンをリスタートさせて再試行できるようになります。

接続に成功したプレイヤーはPlayerBehaviour GameObjectをネットワークスポーンし、これがセッションのネットワークステートを管理します。ホストはこのプレイヤーに名前をアサインし、この名前はプレイヤーデータに保存されます。

StateLocalizing

このステートは各デバイスを共有座標システムへとローカライズするプロセスを実行し、アニメーション付きの説明が入ります。プレイヤーがホストの場合、セッションをローカライズするためのビジュアルランドマーク(共有の物理アンカー)を探します。参加者の場合、ホストがローカライズに使用したのと同じビジュアルランドマークと視点を用いて捜索とローカライズを行わなければなりません。

ローカライズプロセスの間、ARFeaturePointヘルパーを用いて特徴点の粒子が表示されます。これには特徴の大きなエリアにプレイヤーを導いてローカライズを補助する意味があります。

StateLocalizationComplete

「ローカライズ成功」の短いメッセージを表示するUI

StateWaiting

StateSessionCreatedまたはStateLocalizationCompleteの後で、ホストと参加者の両方がこのステートを使用します。現在のプレイヤー(ホストおよび参加者)のダイナミックリストを含むGUIを表示します。各プレイヤーの隣には、ローカライズが完了してゲームを開始できる常態になっているかどうかのインジケーターがあります。プレイヤーがホストで、さらにプレイヤーリストの唯一のプレイヤーである場合、次のステートはStateSoloConfirmになります。それ以外の場合はStateCountdownになります。

StateCountdown

マッチ開始前にアニメーション付きの3秒間のカウントダウンを表示します。SnowballToss とSnowballFightを含む複数のシーンで使用されています。

ゲームステート

StateFight

SnowballFightの主要ゲームステート。プレイヤーが敵ホタルや他のプレイヤーに雪玉を投げます。

このステートは敵のスポーンロジックを開始させます。プレイヤーの現在地および判明しているARPlanesに基づき、適切な敵のスポーン地点を選択および提案するメソッドが各PlayerBehaviourによって定期的に実行されます。この値はそのプレイヤーのPlayerDataのローカルインスタンスに設定され、セッション全体で共有されます。ホストは提案されたスポーン地点を使用し、EnemyManagerを用いて敵を配置します。

このステートはプレイヤーのNetworkedSnowballMakerも起動し、3Dの雪玉を保持/投げるためのUIボタンを表示させます。雪玉はネットワークスポーンを使用して作成されるため、すべてのピア間で共有されます。あるローカルプレイヤーが雪玉を投げると、SnowballBehaviourから送られたメッセージを用いてSnowballBehaviorが投擲データのシリアライズと送信を行い、SnowballBehaviour.OnTossDataValueChanged()を用いて各プレイヤーのデバイス上で雪玉のすべての物理演算をローカルに実行できるようにします。

敵の衝突検知ロジックはローカルに処理されます。敵の被弾を検知したインスタンスは、そのEnemyBehaviourのisAliveメンバーをfalseに設定します。この値の変化はすべてのピアに伝えられ、それぞれが敵の撃退演出をローカルに実行できるようにします。

ローカルプレイヤーが敵に攻撃を当てると、PlayerBehaviour.OnSnowballHitEnemy()を用いて自分のスコアを増加させます。プレイヤーのスコアはネットワーク化され、すべてのプレイヤーがデータにアクセスできるようになります。

ステートはgameTimeAndScoreGUIのタイマーが切れるまで待機します。

StateGameOver

UIに降順のプレイヤースコア一覧、リスタートの選択肢、またはマップへ戻る選択肢が表示されます。リスタートする場合、アプリケーションはStateWaitingに戻り、既存のARNetworkingセッションを使い続けます。

エディター専用のモックサポート

ARDKアプリケーションをエディターで開発する際、デバイスへのビルドが常に求められることを避けるため、Unityエディター内で機能するARアセットのモックバージョンを使用すると便利です。各シーンのモックオブジェクトはシーンのMockScene GameObjectにアタッチされます。このオブジェクトにはMockSceneConfigurationコンポーネントがあり、Unityエディター外ではこれによってそのオブジェクトは破壊されます。

このシーンのMockSceneオブジェクトに含まれるもの:

  • ネットワークARセッションを完全にモック化するためのARDK VirtualStudioインテグレーション。Unityエディターでの実行時、ローカルプレイヤーは必ずセッションのホストになります。

  • 接続するモックセッションをリッスンし、ARVoyageMockPlayConfigurationで指定されたとおりにモックピアを作成するARMockPeerHelper。各ARMockPeerはPlayerBehaviourのスポーンを処理し、キーボードコマンドをリッスンして他のプレイヤーがいるマルチプレイヤーマッチの簡単なシミュレーションを実行します。

  • ARPlanesを用いたプレイ空間のシミュレートを行うMultiplayerArena

  • プレイヤーをセッション内でローカライズできるようにするMockMap