Engine続行するにはJavascriptを有効化してください。Realtimeインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。PUNインディーかプロのディベロッパーかを問わず、誰でもリアルタイムマルチプレイヤーゲームを開発してグローバルに配信可能です。Quantumマルチプレイヤーゲーム開発の革新に参加しよう!MOBA、ブローラー、RTS、戦闘ゲーム、スポーツゲームを迅速な予測ネットワーキングエンジンで開発できます。Chat同時接続数をスケールできるクロスプラットフォームのチャットシステムをあなたのアプリに簡単に統合できます。Voice大規模かつインターナショナルな最先端のライブボイスチャット。すべてのマルチプレイヤーエンジンと併用可能。(RPC)への対応です。(同じルームにいる)リモートクライアントに対してのメソッドの呼び出しです。メソッドにリモートの呼び出しを有効にするには[PunRPC]属性を適用する必要があります。b));}PunRPCとマークされた関数を呼び出すには、PhotonViewコンポーネントが必要です。呼び出しの例は以下の通りです。jup.");上級者向けのヒント:スクリプトがMonoBehaviourPunである場合、this.photonView.RPC()を使用できます。ターゲットメソッドを直接呼び出すのではなく、PhotonViewコンポーネントでRPC()を呼び出し、呼び出すメソッドの名称を提供してください。TopメソッドシグネチャPhotonViewはRPCのための「ターゲット」のようなものです。全クライアントは特定のPhotonViewをもつネットワーク化したGameObjectにのみメソッドを実行します。RPCを呼び出すと、受信するクライアントはダメージを同じオブジェクトに適用します!複数のパラメータ(PUNでシリアル化可能である限り)を追加できます。その場合、メソッドと呼び出しには同じパラメーターが必要です。受信クライアントが一致するメソッドを見つけられない場合、エラーを記録します。この規則には1つの例外があります。PhotonMessageInfo型にすることができます。これにより、各呼び出しのコンテキストが提供されます。PhotonMessageInfoを設定しません。photonView.RPC()呼び出しは、infoパラメーターなしの場合と同じです。info.Senderは、RPCを呼び出したプレーヤーです。info.SentServerTime);}送信者がPhotonMessageInfo内にいて、PhotonViewを介して「ターゲッティング」する場合、余分なパラメータを追加することなく誰かを撃つ実装ができます。誰が撃って、何に当たったのか把握できます。設計上,RPCメソッドを持つスクリプトは,親でも子でもなくPhotonViewとまったく同じGameObjectに,接続する必要があります。RPCメソッドを静的にすることはできません。void以外の戻り値を持つRPCメソッドを呼び出すことはできますが、戻り値は使用されません。voidを使用してください。PunRPC属性を追加することを忘れないでください。PunRPC属性を持つオーバーライドされていない継承されたメソッドを使用できます。PhotonMessageInfoの最後のパラメーターを持つものと持たないもの。RPCメソッドごとに一意の名前を使用します。PhotonMessageInfoを持つものと持たないもの。いずれかのオプションを選択します。RPCメソッドで任意のパラメータを使用することは推奨されていません。必要である場合は、RPC呼び出し間の任意のものをふくむすべてのパラメータをパスします。これを行わないと、受信クライアントが着信中のRPCを見つけて処理することができません。オブジェクト配列をRPCメソッドのパラメータとして送信しない場合は、まずオブジェクト型にキャストする必要があります。ターゲット、バッファリング、順番RPCを実行するクライアントを指定できます。そのためには、RpcTargetの値を使用します。一般的なのはAllのクライアントがRPCを呼ぶようにすることです。Othersのみの場合もあります。Bufferedで終わる値があります。サーバーはこれらのRPCを記憶し、新しいプレイヤーの参加時には、そのプレイヤーは参加以前に起こっていたでことであってもRPCを取得します。この使用に際しては注意を払ってください。バッファリングするリストが長くなると、参加までの時間も長くなってしまいます。ViaServerで終わる値もあります。送信するクライアントがRPCを実行しなければならない場合、通常はサーバーを通したRPC送信なしで即座に実行されます。これは、イベントの順番に影響を及ぼします。ローカルでメソッドを呼び出した場合ラグが発生しないからです。ViaServerは「All」ショートカットを無効にします。RPCが順番におこなわれるべき場合などには特に興味深い点です。サーバーを通して送信されたRPCは、全ての受信するクライアントで同じ順番に実行されます。これはサーバーに到着した順番ということになります。あるレースゲームで、「finished」というRPCをAllViaServerとして送信することができます。始めの「finished」RPC呼び出しが勝者を通知します。次の「finished」呼び出しで、ランキングにいるメンバーを確認できます。RPC名のショートカットネットワーク間での送信をするのに文字列は適したものではないので、PUNでは文字列を短くする裏技を使っています。PUNはエディタ内のRPCを検出してリストをコンパイルします。それぞれのメソッドの名前は、そのリストを経由してIDを取得し、RPCを名前で呼び出すと、PUNはただIDだけを送信します。このショートカットにより、ゲームの異なるビルドはRPCに同じIDを使用しないことがあります。これが問題になる場合は、ショートカットを無効にしてください。同じビルドのクライアントが一致する場合は、問題にはなりません。RPCのリストはPhotonServerSettingsを介して保管され、管理されます。RPC呼び出しがプロジェクトの異なるビルドでうまくいかなければ、このリストを確認してください。ボタンがハッシュコードを計算します。これはプロジェクトフォルダ間の比較をするのに便利です。ボタンをクリックして手動で更新をかけることもできます。TopRPCのタイミングと負荷レベルRPCは、特定のPhotonViewで呼び出され、受信クライアント上で一致するものを常にターゲットとします。リモートクライアントが一致するPhotonViewをまだ読み込み又は作成していない場合には、RPCは失われます!このため、クライアントが新しいシーンを読み込むことが、RPC欠落の典型的な原因となります。この状況は、1つのクライアントが新しいGameObjectを含むシーンをすでに読み込んでいて、他のクライアントがこのGameObjectを理解できない場合(同じシーンを読み込むまで)に発生します。この状況はPUNで対処できます。trueを設定して、ルームのマスタークライアントでPhotonNetwork.LoadLevel()を使用します。して、ルーム/ゲーム内ですべてのクライアントが読み込む必要があるレベルを、1つのクライアントが定義します。RPCの欠落を防ぐため、クライアントは受信メッセージの実行を停止できます(これが、LoadLevelが実行する内容です)。falseを設定してください。メッセージキューを無効化すると、キューアンロックするまでメッセージの受信と送信が遅延されます。このため、続行の準備ができたらキューをアンロックすることは非常に重要です。TopRaiseEventRPCが必要にならないケースもあります。そのようなケースでは、PhotonViewとメソッドをいくつか呼び出すことが要求されます。PhotonNetwork.RaiseEventを使用すると、自分のイベントを作成して、ネットワーク化オブジェクトに関係なく送信することができます。イベントは一意の識別子であるイベントコードを使って表されます。Photonではこのイベントコードはバイト値で記載され、最大256個のイベントまで許容されます。それらの中にはPhoton自身が使用しているものもあるので、カスタムイベントに使えるものは全てではありません。備わっているイベントを全て除いても、[0~199]の200個のカスタムイベントコードの使用が可能です。高度なイベントキャッシュ操作を使用する場合は、イベントコード0を避ける必要があります(イベントコードに基づいてキャッシュされたイベントを削除する場合、フィルター内のワイルドカードです)。以下の例では多くの単位に対して特定の位置に移動するよう伝えるイベントが記述されています。sendOptions);何をしようとしているのか、よく見てみましょう。このケースでは、イベントを発生させる前にイベントコードを直接定義しています。カスタムイベントが複数ある場合、以下のように既に使用したクラス内で定義することをお勧めします。sendOptions);コンテンツは、PUNがシリアライズ化できるものなら何でも大丈夫です。この例では様々な型が含まれているため、オブジェクトの配列を使用しています。3番目のパラメータはRaiseEventOptionsを記述しています。これらのオプションを使用することで、例えばこのイベントがサーバー上でキャッシュされるべきかどうか、このイベントをどのクライアントに受信させるか、また、このイベントをどのインタレストグループに転送させるかを選べるようになります。これらのオプションを自分で定義するかわりに、デフォルトのRaiseEventOptionsを適用するnullの使用もできます。送信者にもイベントを受信するようにしたいので受信者をReceiverGroup.Allに設定します。RaiseEventOptionsについては、このページの下部で詳しく説明しています。最後のパラメータはSendOptionsを記述しています。このオプションを使用すると、このイベントがreliableかunreliableか、またメッセージを暗号化するべきかなどを選択できます。今回の例ではイベントがsent-reliableかどうかを確認します。TopIOnEventCallbackコールバックカスタムイベントの受信には、2つの選択肢があります。1つ目はIOnEventCallbackインターフェースを実装することです。実装の際にはOnEventコールバックハンドラーを追加する必要があります。このハンドラーの関数は以下のような見た目です。何かを行う}このハンドラーを適切に登録するために、UnityのOnEnableとOnDisable機能を使用できます。することで、コールバックハンドラーを適切に追加・削除でき、このハンドラーに関する問題が起こらなくなります。OnEvent関数は以下のようになります。}}まず始めに、受信したイベントコードが設定しておいたコードを一致しているかを確認します。一致していればイベントのコンテンツを既に送信済のフォーマット、つまりこの例ではオブジェクトの配列にキャストします。そのあとでその配列から、コンテンツに追加していた最初のオブジェクトである、ターゲットの位置を取得します。この配列にはバイト値のみが残されている点を把握しているため、forループを使用して残りのデータを処理できます。この識別子を使用してUnitList(基本的にはリストやディクショナリなどのユニットを含む構造体)から特定の単位を取得し、新たなターゲット位置を適用します。TopLoadBalancingClient.EventReceivedカスタムイベントを受信する2つ目のオプションは、イベントが受信されたら呼び出されるメソッドを登録することです。適切にこれを行うには、1つ目のオプションと同じくUnityのOnEnableとOnDisable機能を使用します。IOnEventCallbackセクションの時に説明したことと同じなのでここでは割愛します。内部的に、PUNはほぼ全てのコミュニケーションに対してRaiseEventも使用します。EventオプションRaiseEventOptionsパラメータを使用すると、どのクライアントがイベントを取得するか、バッファリングされるかなどについて定義できます。受信者グループ「受信者グループ」はイベントを誰が受信するのか定義する1つの方法です。このオプションはRaiseEventOptionsを介して使用可能です。定義されたグループが以下の通り3つあります。Topインタレストグループ「インタレストグループ」とは、誰がイベントを受信するかを定義委するもう一つの方法です。グローバルグループ「0」を使用して全てのクライアントにイベントを発生させられます。0ではない特定のグループを使って、指定するグループにイベントを発生させることもできます。特定のグループに送信されたイベントを受信するには、クライアントは前もってこのグループにサブスクライブしていなければなりません。インタレストグループについての詳細はこちらでご確認ください。「ターゲットアクター」はイベントの受信者を定義する3つ目の方法です。この方法を使用すると、1人もしくはそれ以上のクライアントを、固有のアクターナンバーで選択して、彼らに対してイベントを発生させられます。Topキャッシングオプション最も興味深いオプションは、おそらくイベントキャッシュオプションです。PUNは、次の2つの場所でイベントキャッシュを使用します。*呼び出しはキャッシュされます。Bufferedで送信されたすべてのRPCはキャッシュされます。この場合、PUNは同じ意味で「バッファリングされた」表現を使用します。cached-events)をご覧ください。Top送信オプションSendOptionsパラメータを使うと、イベントがリライアブルで送信されるか、暗号化されて送信されるかを定義できます。信頼性Reliabilityオプションはイベントが送信されるときにリライアブルかアンリライアブルかを表します。Top暗号化Encryptオプションを使うと、イベントを送信前に暗号化するかどうか定義できます。デフォルトでは、イベントは暗号化されません。ヒント:暗号化は使用の前に、構築しなければなりません。