ピアツーピアネットワーク(廃止)
更新日時: 2023/09/14
Peer-to-Peer Networking Deprecated
2023年4月をもってピアツーピアネットワークは廃止され、統合可能なプラットフォームAPIのリストに含まれなくなっています。詳しくは、こちらのブログ投稿をご覧ください。
アプリにP2Pネットワーキングを実装する代替手段として、Photonなどのサードパーティソリューションをご利用いただけます。PhotonなどのサードパーティソリューションをプラットフォームAPIに統合する方法の例は、こちらでご確認ください。 ピアツーピア(P2P)ネットワークにより、アプリはユーザー間で直接接続を確立しデータを送信できます。
P2Pネットワークにはいくつかの用途があります。一般的な実装には、P2Pを使用したユーザー間でのチャットメッセージの交換、低レイテンシでのゲームプレイデータの更新、リアルタイムでのアバターの位置の更新などが含まれます。MetaのP2Pサービスはユーザーとユーザーを直接接続してデータを交換します。
Meta HorizonプラットフォームP2Pでデータを送信する場合、ユースケースとアプリのニーズに応じて2つの送信ポリシーから選択できます。
- 信頼性の高い接続では、データが1回、メッセージが送信された順序で配信されます。ネットワーク層は、各メッセージがピアによって確認されるまで再試行します。発信メッセージは、ピアへの接続が確立されるまでバッファに入れられます。信頼できるメッセージは、P2Pを使用して、1回かつユーザーが送信した順序で配信する必要があるものの、必ずしも即時に送信する必要のない、テキストチャットメッセージを送信する場合に便利です。
- 信頼性の低い接続は、ベストエフォートでデータを送信しますが、一定の順序または時間内での配信を保証することはできません。接続状態が確立される前に送信されたメッセージはすべて廃棄されます。信頼性の低いメッセージは、P2Pを使用してゲームデータをリアルタイムで更新している場合や、データを迅速に送信することの方が確実に1回かつ順番に配信することよりも重視される場合に便利です。信頼性の低い接続を介して送信されるメッセージは1200バイト以下に制限する必要があります。
ネットワークアドレス変換(NAT)の背後にあるクライアントデバイスへの接続時に、検出された外部アドレスから接続を確立できなかった場合、P2PデータはMetaのインフラストラクチャ内にあるリレーサーバー経由でルーティングされる可能性があります。リレーサーバー経由で渡されるVoIPデータは、受信者への転送に必要な範囲を超えて検査されることはなく、保持されることもありません。
This is a Platform SDK feature requiring Data Use Checkup
この機能や他のPlatform SDK機能を利用するには、データの使用状況の確認(DUC)を完了する必要があります。DUCは、開発者ポリシーを遵守していることを確認するためのものです。チームの管理者は、ユーザーデータの利用がプラットフォームガイドラインに沿っていることを証明する必要があります。アプリレビューチームがDUCを審査して承認するまで、プラットフォームの機能はテストユーザーのみが利用できます。クライアントアプリからの呼び出しに、以下のメソッドを使うことができます。
ovr_Net_Connect()
このメソッドは、指定されたユーザーにovrMessage_NetworkingPeerConnectRequestを送信します。接続が確立するとovrMessage_NetworkingPeerConnectionStateChange通知が返されるので、この通知を待機する必要があります。
ovr_Net_Accept()
このメソッドは、ovrMessage_NetworkingPeerConnectRequestメッセージを受信してから呼び出す必要があります。
ovr_Net_AcceptForCurrentRoom()
現在のルームのメンバーからの接続試行を承認します。ルームの作成と結合については、「
ルーム」のページを参照してください。ユーザーが現在ルームにいない場合は、falseが返されます。
ovr_Net_IsConnected()
現在のユーザーが別の特定のユーザーに接続しているかどうかを確認し、trueまたはfalseを返します。
ovr_Net_Ping()
ユーザーにpingを実行して、ネットワーク接続の品質を判断します。
ovr_Net_SendPacket()
指定したユーザーに一連のバイトを送信します。パケットの長さ、パケットの中身(バイト数)、パケットに適用するポリシー(接続の信頼性が高い、信頼性が低い、不明のいずれか)も指定します。指定する長さは、割り当てられたバイト長以下にする必要があります。信頼性の高い接続の場合、パケットに許可される最大バイト数は65535バイトで、これには説明情報(ヘッダー)とユーザーデータが含まれます。信頼性が低いまたは不明な接続の場合、推奨される最大サイズは1200バイトです。まだ接続していない場合は、userIDへの新しい接続が(非同期で)確立されます。
ovr_Net_SendPacketToCurrentRoom()
現在ログインしているユーザーを除く、ルームのすべてのメンバーにパケットを送信します。パケットの長さ、パケットのバイト数、パケットに適用するポリシー(接続の信頼性が高い、信頼性が低い、不明のいずれか)を指定します。信頼性の高い接続の場合、パケットで許可される最大バイト数は65535バイトで、これには説明情報(ヘッダー)とユーザーデータが含まれます。信頼性が低いまたは不明な接続の場合、推奨される最大サイズは1200バイトです。ルーム/マッチメイク機能のいずれかを呼び出して、ルームを作成または結合する必要があります。ユーザーが現在ルームにいない場合、この関数はfalseを返します。
ovr_Net_ReadPacket()
次の着信データパケットを読み取ります。リターンハンドルは、ネットワークから読み取られた何らかのデータを表すオブジェクトを指します。これは、ovrMessage_ReadPacketメッセージタイプを返します。送信者IDを取得するにはovr_Packet_GetSenderID()を、パケットのサイズを取得するにはovr_Packet_GetSizeを、パケットのコンテンツを取得するにはovr_Packet_GetBytesを使います。
ovr_Packet_Free()
メッセージを読み取ったら、パケットをリリースして、パケットが使用しているメモリーを解放します。
ovr_Net_Close()
セッションが完了したら、接続を閉じます。
ovr_Net_CloseForCurrentRoom()
現在のルーム内の全員との接続を閉じます。ルームを出る前にこのメソッドを呼び出します。
メッセージを待機する
ピアツーピアネットワークの統合には、ネットワークプロセスの一部として送信される通知の処理が含まれます。その通知とは、接続リクエストや状態が変更されたことを示す通知です。Platform SDKでの通知の役割について詳しくは、「
リクエストとメッセージ」のページを参照してください。
特にP2Pの場合は、待機していて次の通知を処理できる状態である必要があります。
ovrMessage_Notification_Networking_ConnectionStateChangeovrMessage_Notification_Networking_PeerConnectRequestovrMessage_Notification_Networking_PingResult
一般に、ユーザーAとユーザーBの2人のユーザー間のP2P接続は次のようになります。
- 2人のユーザー間の接続を開始します。
ovr_Net_Connect()を呼び出してユーザー同士を明示的に接続すると、すべてのパケットを確実に受信できます。このステップを省略して、最初のパケットを受信した時点でサービスが暗黙的に接続するようにすることもできます。接続およびovrPeerState_Connectedへの状態変更が確立する前に受信した信頼性の低いメッセージは、廃棄されている可能性があります。 - ユーザーAは、ユーザーBのユーザーIDを使って
ovr_Net_Connect()を呼び出して、接続要求を送信します。 ユーザーBはovr_Net_Accept()を呼び出して、ネットワークセッションを承認して開始します。
- どちらのユーザーも、ステータスがovrPeerState_Connectedに変わったことを示すovrMessage_NetworkingPeerConnectionStateChangeの通知を受け取ります。これで、ユーザーAは
ovr_Net_SendPacket()を呼び出して、メッセージまたはデータを送信できます。ovr_Net_SendPacket()を呼び出す際には、前述したポリシー(信頼性の高いまたは信頼性の低い)のどちらかを定義します。詳しくは、ovrSendPolicyを参照してください。 - ユーザーBのアプリは、
ovr_Net_ReadPacket()とovr_Packet_GetBytes()を使ってメッセージを解析します。このアプリは、ovr_Packet_Free()を使って、両方のクライアント上のメッセージで使用されているメモリーを解放します。 - (任意)
ovr_Net_Close()を呼び出して、接続を破棄します。SDKは接続プールを管理し、未使用の接続を破棄します。
以下の例は、P2Pを使ってリアルタイムでほかのユーザーのアバターの位置と動きを送信するUnityアプリであるVRVoiceChat
サンプルアプリから取得しています。