質問: Unity + PUN2(Photon Unity Networking 2)でネットワーク対戦カードゲームを作っています。 わかりやすいように、以下ではハースストーンのミニオンが出てきます。 (ミニオンの箇所はシャドウバースのフォロワーでも大丈夫です!) 実現したいこと ------- 以下の図のようにゲームオブジェクトを同期させることが、実現したいことです。 プレイヤー1とプレイヤー2はそれぞれ対戦する人です。 PUNでは、ルームにプレイヤー1、2が入って対戦を行うイメージです。以下図のような状態で、対戦が進んでいくことを実現できないかなあと思っています。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/f2a9489288920f3a2e0f1ea443f5a3d5.jpeg) プレイヤー1から見れば、プレイヤー2(対戦相手)は画面上側にきます。 逆にプレイヤー2からすれば、対戦相手はプレイヤー1なので、プレイヤー1が上側にきて、もちろんプレイヤー2からプレイヤー1の手札は見えません。(ハースストーン、シャドウバースと同じ) PUNにおける`PhotonNetwork.Instantiate`を使ってオブジェクトの同期をとる場合、そのまま同期してしまうと、上の図ではプレイヤー1が召喚したミニオンは、プレイヤー2のミニオンの場所(図の右側における「プレイヤー2のミニオン」の場所)に同期されてしまいます。本来、プレイヤー1が自分のローカルで召喚したミニオンは、プレイヤー2から見れば、上側に表示されるべきなのです。 これって例えば、`RPC(Remote Procedure Call`を使って実装したりするんでしょうか?? 試したこと/考えたこと ----------- それぞれのプレイヤーに異なるカメラをつけて、それらのカメラの向きを変えることで、座標自体を反転させることを考えました。この方法は、座標は正しく同期されますが、これだと召喚されたミニオンのオブジェクト自体をカメラの向きに合わせて回転させてあげないと逆さまに見えてしまったりします。そこをミニオン生成と同時に修正するのはあんまりスマートじゃないかなあ、、、と思いました。
回答: 主にRPCでの実装になると思います。イメージで言うと、 1. プレイヤー1からサーバーへ:「手札N番を使用した」という情報のみ通信 2. サーバー:「プレイヤー1の手札N番はミニオンAである」と判断(不正防止の為に多分ここでのチェック入ると思われる) 3. サーバーから各プレイヤーへ:「プレイヤー1が手札N番を使用しミニオンAを召喚した」という情報のみ通信 4. 各プレイヤー:「プレイヤー1が手札N番を消費・ミニオンAのオブジェクト生成・ミニオンAが場に出て来る演出」等をローカル側で行う(ネット同期しない) という感じじゃないかなと思います。 もしくは、 `PhotonNetwork.Instantiate`を使いつつ、位置や回転情報は同期しないという方法でもいいかもしれません。 Photon Unity Networkingで動的に同期オブジェクトを生成する方法 - Qiita