Oculus Avatar SDKの使用

このガイドでは、PUNでOculus Avatar SDKを使用する方法を説明します。 まずは、新しいUnityプロジェクトを使い、次のパッケージをインポートしましょう:

はじめに

インポートが完了したら、既存のコンポーネントを拡張することができます。 まず、'Assets/OvrAvatar/Content/Prefabs' に移行すると、 'LocalAvatar'と 'RemoteAvatar'の2つのプレハブがあります。 次のステップでは、これらの2つのプレハブを使用するか、それらのコピーを作成することができます。

重要:両方のプレハブを 'Resources'フォルダの中に配置する必要があります。
この場合、各プレハブのコピーは'Assets/Resources'にあります。

Avatarの同期

次のステップでは、複数のクライアント間で同期を処理するPhotonView(後で添付します)コンポーネントによって監視されるスクリプトを実装する必要があります。 したがって、新しいスクリプトを作成し、PhotonAvatarViewと名付け、次の3つの参照をコードに追加します:

さらに、実際に他のクライアントに送信する前に、Avatarからのデータを格納するために使用するバイト配列のリストが必要です。

UnityのAwake関数を使うことで、以前のすべての参照とオブジェクトを設定できます。

PhotonViewコンポーネントへの参照を取得した後、私たちはisMine条件を直接使用して、 'Local'と 'Remote Avatar'の間を明確にすることができます。 インスタンス化されたオブジェクトが私たちのものであれば、次のステップでこれを使用してOvrAvatarコンポーネントへの参照を取得し、このデータをネットワーク経由で送信する前にすべてのアバター関連の入力イベントを格納するバイト配列のリストをインスタンス化します。 オブジェクトが別のクライアントに属している場合は、後でOvrAvatarRemoteDriverコンポーネントへの参照を取得します.OvrAvatarRemoteDriverコンポーネントは、後で他のクライアントがジェスチャーを参照できるように入力を模倣するために使用されます。 次に、私たちのジェスチャーを含む記録パケットを開始したり停止したりするために使用する、UnityのOnEnableメソッドとOnDisableメソッドが必要です。

また、新しいパケットが記録されたときに起動されるイベントハンドラも設定します。 次にこのパケットはPUNが対応しているバイト配列にシリアル化されます。 その後、以前に作成されたリストに追加され、ネットワークを介して送信される準備が整います。 下記参照:

シリアライザがあるので、受信したパケットを非直列化るのに役立つデシリアライザが必要です。 次のタスクはこの関数を実装することです。 この例では、DeserializeAndQueuePacketDataと呼びます。

この関数は受信バイト配列を非直列化し、パケットデータを再作成し、パケットデータをOvrAvatarRemoteDriverコンポーネントにキューイングしてジェスチャーを再生します。 この部分の最後のコーディングセクションは、記録されたパケットの交換を追加することです。 この場合、定期的に自動的に呼び出され、結果定期的な更新とスムーズな検索が行われるOnPhotonSerializeViewを使用します。

分かりやすくするために、2つのパートに分けます。 最初のパートは、ゲームオブジェクトの所有者によって実行されるisWriting条件です。これはデータを送信する必要があるかどうかを最初に確認します。 データを送信する必要がある場合、最初に送信される値はパケット数です。 この情報は受信側にとって重要です。 最終的には、記録されシリアル化されたすべてのパケットを送信し、リストに格納されている不要になった以前のパケットデータを消去します。

ただし、isReading条件は、オブジェクトを所有していないリモートクライアントでのみ実行されます。 まず、処理しなければならないパケットの数を確認してから、以前に実装した関数を呼び出して、すべてのパケットデータを段階的に非直列化してキューに入れます。

最後のステップは、両方のプレハブにPhotonViewコンポーネントと実装されたPhotonAvatarViewを添付することです。 必ずPhotonViewの観測されたコンポーネントにPhotonAvatarViewコンポーネントを追加してください。

Avatarのインスタンス化

残念ながら、PhotonNetwork.Instantiateを呼び出すだけではネットワークAvatarをインスタンス化することができません。 なぜなら、2種類のアバターをインスタンス化する必要があるからです。 ひとつは、インスタンス化するプレイヤーのための「LocalAvatar」で、もうひとつは、他の人のための「RemoteAvatar」です。 したがって、手動インスタンス化を使用する必要があります。 この例では、まずAvatarのために「ViewId」を割り当て、他のクライアントに通知ができるよう、キャッシュを有効にしたRaiseEvent関数を使用します。

次に、正しいプレハブがインスタンス化されていることを確認するOnEventコールバックハンドラが必要になります。 そのため、送信者のIDとローカルクライアントのIDを比較します。 ふたつが同じ場合、このクライアントもイベントを発生させ、さらに「LocalAvatar」プレハブをインスタンス化する必要があることがわかります。 IDが同じでない場合、クライアントは 'RemoteAvatar'プレハブをインスタンス化する必要があります。

これは、クライアントがすでにルームに入っているかのちに参加するかどうかに関わらず、各接続クライアントで正しいAvatarをインスタンス化します。 最後に、プレイヤーがゲームを離れたときに、各クライアントでAvatarが破壊されるようにしてください。

テスト

Avatarの同期をテストする2つの方法があります。

最初の方法には少なくとも2つの個別のコンピュータが必要で、それぞれにはOculusデバイス(RiftとTouch Controller)が接続されている必要があります。 Unity Editorからゲームを開始するか、最初にビルドを作成し、後で両方のマシンで実行して、ジェスチャの同期に問題がないことを確認することができます。

別のアプローチは、第2のテストアプリケーションを構築することです。 RemoteAvatarがインスタンス化される地点を見るためのメインカメラを配置して回転させる「空白の」プロジェクトとすることができます(このページの冒頭で言及したプラグインが必要です)。 この場合は、カメラは(0/0/0)を映すべきです。 Photonに接続するときは、必ず同じAppIdとAppVersionを使用してください。 このアプローチの利点は、1つのOculusデバイス(RiftおよびTouch Controller)を備えた1台のコンピュータしか必要ないことです。

 ドキュメントのトップへ戻る