Engine続行するにはJavascriptを有効化してください。Realtimeインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。PUNインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。Quantumマルチプレイヤーゲーム開発の革新に参加しよう!MOBA、ブローラー、RTS、戦闘ゲーム、スポーツゲームを迅速な予測ネットワーキングエンジンで開発できます。Chat同時接続数をスケールできるクロスプラットフォームのチャットシステムをあなたのアプリに簡単に統合できます。Voice大規模かつインターナショナルな最先端のライブボイスチャット。すべてのマルチプレイヤーエンジンと併用可能。Classic(PUN1とも呼ばれます)はPUNのはじめの主要バージョンです。現在は、リファクタリングおよび機能拡張されたPUN2に切り替わっています。新しいプロジェクトはPUN2をご利用いただき、また可能であれば既存のプロジェクトについてもPUN1からPUN2へ移行していただくよう強く推奨しています。Cloassicは今後数か月メンテナンスされます。重要なバグの修正や新しいUnityバージョンのサポートは行いますが、新機能の追加はPUN2のみとなります。Calls(RPC)への対応です。リモートプロシージャコールリモートプロシージャコールはその名の通り、リモートクライアント(同じルーム内)上のメソッドの呼び出しです。メソッドにリモートの呼び出しを有効にするには、[PunRPC]属性を適用する必要があります。5.1ではRPC属性は旧式となり、削除される予定です。そのため、PUNではv1.56から始まるPunRPCという別の属性を使用しています。Call」の他のすべての用途には影響はありません。RPCとしてマークされた関数を呼び出すには、PhotonViewが必要です。Photon.PunBehaviourの場合、this.photonView.RPC()が使用できます。このため、ターゲットメソッドを直接呼び出すのではなく、PhotonView上のRPC()を呼び出し、呼び出すメソッドの名前を提供してください。TopターゲットとパラメータPhotonViewは、RPCのための「ターゲット」のようなものです。すべてのクライアントは、その特定のPhotonViewを持つネットワーク化されたGameObjectにのみメソッドを実行します。特定のオブジェクトを打ち「ApplyDamage」RPCを呼び出すと、受信クライアントは同じオブジェクトにダメージを適用します!複数のパラメータを追加することができます(PUNでシリアル化可能であるかぎり)。その場合、メソッドとコールは同じパラメータを持つ必要があります。受信クライアントが一致するメソッドを見つけることができない場合は、エラーがログされます。このルールには例外があります。RPCメソッドの最後のパラメータは、各呼び出しのコンテキストを提供するPhotonMessageInfoタイプに設定できます。呼び出し内にPhotonMessageInfoは設定しません。info.timestamp));}送信者がPhotonMessageInfo内にあり、「ターゲッティング」がPhotonViewを介する場合、余分なパラメータを指定せずに誰かを打つ実装をおこなうことができます。誰が打たれたか、また何を打ったかを把握できます。Topターゲット、バッファリング、順番RPCを実行するクライアントを定義することができます。これをおこなうには、PhotonTargetsの値を使用します。クライアントがRPCを呼べるようにします。Othersのみの場合もあります。PhotonTargetsには、Bufferedで終わるいくつかの値が含まれます。サーバーは新たなプレイヤーが参加するとこれらのRPCを記憶し、以前に発生した場合でもそのRPCを取得します。バッファーが長くなると参加時間が長くなるため、これは注意深く使用してください。PhotonTargetsには'ViaServer'で終わる値があります。通常、送信クライアントがRPCを実行しなければならない場合には、サーバーを介してRPCを送信せずに即時に行います。ローカルでメソッドを呼び出す場合は遅れがないので、これはイベントの順序に影響を与えます!ViaServerは、「All」ショートカットを無効にします。RPCを順番におこなう必要がある場合に、これは特に興味深いです。サーバーを経由して送信されたRPCはすべての受信クライアントによって、同じ順序で実行されます。これは、サーバー上への先着順です。例:レースゲームでは「finished」RPCをAllViaServerとして送信することができます。最初に「終了した」RPCの呼び出しで誰が勝ったか確認できます。以下の「終了した」呼び出しで、ランク上のプレイヤーを確認できます。TopRPC名のショートカット文字列は、ネットワークを介して送信するのに最も効果的なものではないので、PUNはショートカットを使用してそれらを短縮します。PUNはエディターでRPCを検出し、リストをコンパイルします。各メソッドの名前は、そのリストを経由してIDを取得し、名前でRPCを呼び出すとPUNはIDのみを送信します。このショートカットによって、ゲームの異なるビルドはRPCに同じIDを使用しない可能性があります。これが問題になる場合には、ショートカットを無効にすることができます。同じビルドのクライアントがマッチングされる場合、これは問題ではありません。RPCのリストはPhotonServerSettingsを経由して保存および管理されます。プロジェクトの異なるビルド間でRPCコールに問題が生じる場合は、このリストを確認して下さい。HashCodeボタンは、プロジェクトフォルダ間の比較が容易なハッシュコードを計算します。Listボタンをクリックして手動でリストを更新することができます。TopRPCのタイミングと負荷レベルRPCは、特定のPhotonViewで呼び出され、受信クライアント上で一致するものを常にターゲットとします。リモートクライアントが一致するPhotonViewをまだ読み込み又は作成していない場合には、RPCは失われます!このため、クライアントが新しいシーンを読み込むことが、RPC欠落の典型的な原因となります。この状況は、1つのクライアントが新しいGameObjectを含むシーンをすでに読み込んでいて、他のクライアントがこのGameObjectを理解できない場合(同じシーンを読み込むまで)に発生します。この状況はPUNで対処できます。trueを設定して、ルームのマスタークライアントでPhotonNetwork.LoadLevel()を使用します。して、ルーム/ゲーム内ですべてのクライアントが読み込む必要があるレベルを、1つのクライアントが定義します。RPCの欠落を防ぐため、クライアントは受信メッセージの実行を停止できます(これが、LoadLevelが実行する内容です)。falseを設定してください。メッセージキューを無効化すると、キューアンロックするまでメッセージの受信と送信が遅延されます。このため、続行の準備ができたらキューをアンロックすることは非常に重要です。TopRaiseEventいくつかのケースでは、RPCが必要でないかも知れません。PhotonViewと何らかのメソッドを呼び出す必要があります。PhotonNetwork.RaiseEventではネットワーク化オブジェクトに関係なく、独自のイベントを作って送信することができます。イベントは固有の識別子を使用して記載されます。Photonでは、このイベントコードはバイト値で記載され、最大256個の異なるイベントが許容されます。これらの一部はPhotonですでに使用されているため、これらすべてをカスタムイベントに使用できるわけではありません。組み込みイベントをすべて除外しても、最大200個のカスタムイベントコードを使用することが可能です[0..199]。以下の例では、多くの単位に対して特定の位置に移動するよう伝えるイベントが記述されています。raiseEventOptions);このイベントでなにをおこなっているのか、詳細を確認してみましょう。この例では、イベントを発生させる前に直接イベントコードを定義しています。複数のカスタムイベントが有る場合には、使用済みクラスでそのカスタムイベントを定義することを推奨します。raiseEventOptions);PUNがシリアル化できるならば、コンテンツはどんなものでも可能です。この例では、様々な型が含まれているためオブジェクトの配列を使用しています。最後のパラメータはRaiseEventOptionsを記述します。このオプションを使用すると、たとえばこのイベントをサーバー上でキャッシュする必要があるか、どのクライアントがこのイベントを受信すべきか、またどのインタレストグループにこのイベントを転送すべきかを選択できます。これらのオプションを自分で定義するかわりに、デフォルトのRaiseEventOptionsを適用するnullを使用することも可能です。送信者にもこのイベントを受信してほしいため、受信者にReceiverGroup.Allを設定します。RaiseEventOptionsの詳細は、このページの最下部で説明します。コールバックハンドラーを実装および登録する必要があります。something}このハンドラーを適切に登録するには、UnityのOnEnable関数とOnDisable関数を使用できます。これによって、コールバックハンドラーを適切に追加および削除している点を確認でき、この特定のハンドラーにまつわる問題は発生しません。}}まず受信したイベントコードが、さきに設定したイベントコードと合致するかを確認します。合致する場合には、以前送信した形式にイベントのコンテンツをキャストします。この例ではオブジェクトの配列です。その後、その配列からターゲット位置を取得します。これは、このコンテンツに追加した最初のオブジェクトです。この配列にはバイト値のみが残されている点を把握しているため、forループを使用して残りのデータを処理できます。この配列では、各バイト値に対して固有の識別子を取得します。この識別子を使用してUnitListから特定の単位を取得し、新たなターゲット位置を適用します。内部的には、PUNはほぼすべての通信にRaiseEventを使用しています。EventオプションRaiseEventOptionsパラメータを使用して、どのクライアントがイベントを取得するのか、バッファリングするのかなどを定義します。受信者グループ「受信者グループ」も、誰がイベントを受信するかの定義に使用できます。このオプションはRaiseEventOptionsによって利用可能です。すべてのアクティブなアクターが同じルームに参加します。送信者を含む、すべてのアクティブなアクターが同じルームに参加します。ルーム内で現在指定されたマスタークライアントです。Topキャッシングのオプションもっとも興味深いオプションは、イベントのキャッシュとバッファリングです。PUNはインスタンス化のためにそれを使用し、新しい(参加する)プレイヤーがルームに入る前に起こったイベントを取得する場合に便利です。AddToRoomCache、AddToRoomCacheGlobalとRemoveFromRoomCacheです。これらのオプションは、イベント内でハッシュテーブルを送信した場合に最適に作動します。EventCaching.AddToRoomCacheでRaiseEventを呼ぶと、イベントはサーバーのキャッシュに入れられます。後に参加するプレイヤーはすべて、イベントも取得します。新しいプレイヤーは、キャッシュされたイベントをサーバー上に到着した順に取得します。プレイヤーが退出すると、キャッシュされたイベントは自動的にキャッシュから削除されます。特定のイベントでこれを回避するには、EventCaching.AddToRoomCacheGlobalでRaiseEventを呼び出します。これによって「ルームのイベントキャッシュ」にイベントが置かれます。キャッシュに多くのイベントを入れる場合、新しいプレイヤーがルームに入るときに大量のメッセージを取得します。イベントの数が多いと時間を要する場合があるので、EventCaching.RemoveFromRoomCacheを使用して関連性がなくなったものをクリーンアップする必要があります。RemoveFromRoomCacheを使用すると、RaiseEventのEventCodeがフィルターとして使用されます。イベントを設定する代わりに、イベントのすべてのインスタンスを削除することが可能です。厳密に管理をおこなうには、イベントのコンテンツをフィルタリングに使用します。これをおこなうには、ハッシュテーブルをコンテンツタイプとして使用する必要があります。特定のイベントを識別するキー/値のセットを設定すれば、そのキー/値のセットをフィルターのコンテンツに記載するだけでRemoveFromRoomCacheを使用してイベントを発生させることができます。このようにして、個別のイベントやあるオブジェクトに属するイベントまたはターンなどを特定できます。イベントキャッシュについては、こちらで詳細を確認してください。