質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1179閲覧

PUN2で2Dのネットワークオブジェクトは生成できますか?

MSyoda

総合スコア3

Photon Cloud

Photon Cloudは、オンラインゲーム開発向けネットワークエンジン。リアルタイムマルチプレイ通信のプラットフォームであるPhotonの一つです。ネットワーク通信によるオンラインゲームを開発・運営するために必要なツールがサーバー環境に構築されています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/02/18 14:02

Unity初心者ですが、2Dカードゲームを作ろうとしています。
ある程度UIを使って形にしたので、PUN2を用いてオンライン対戦を実装しようとしましたが、初っ端でつまずいてしまいました。

ネットワークオブジェクトを生成する際に、3Dオブジェクトの生成は下記のコードを参考に作成はできるのですが、UIで作った2Dのネットワークオブジェクトを生成しようとするとCanvasがないため表示されません。(当たり前だと思いますが、、)

C#

1// ランダムな座標に自身のアバター(ネットワークオブジェクト)を生成する 2var position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f)); 3PhotonNetwork.Instantiate("Avatar", position, Quaternion.identity);

そこでCanvasオブジェクトを用意して、生成したネットワークオブジェクトの親をそのCanvasオブジェクトにしてみました。実行すると目論見通りできているのですが、Buildしてみても2つの表示はされません(それぞれのネットワークオブジェクトのみが表示)。
そもそも2Dのネットワークオブジェクトの生成は可能なのでしょうか?
また、普通のオブジェクトを、生成したネットワークオブジェクトの親に設定すると、同期できないのでしょうか?
PUN2の理解が足りてないと思いますが、ご教示お願いいたします。

自分のHierarchy
イメージ説明
OnlineManagerのスクリプト

C#

1public class SampleScene : MonoBehaviourPunCallbacks 2{ 3 [SerializeField] Transform canvasObj; 4 private void Start() { 5 Debug.Log("スタート"); 6 // プレイヤー自身の名前を"Player"に設定する 7 PhotonNetwork.NickName = "Player"; 8 // PhotonServerSettingsの設定内容を使ってマスターサーバーへ接続する 9 PhotonNetwork.ConnectUsingSettings(); 10 } 11 12 // マスターサーバーへの接続が成功した時に呼ばれるコールバック 13 public override void OnConnectedToMaster() { 14 // "Room"という名前のルームに参加する(ルームが存在しなければ作成して参加する) 15 PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default); 16 } 17 18 // ゲームサーバーへの接続が成功した時に呼ばれるコールバック 19 public override void OnJoinedRoom() { 20 Debug.Log("Room入室"); 21 // ランダムな座標に自身のアバター(ネットワークオブジェクト)を生成する 22 var position = new Vector3(Random.Range(-300, 300), Random.Range(-300, 300)); 23 var playerPanel = PhotonNetwork.Instantiate("PlayerPanel", position, Quaternion.identity); 24 playerPanel.transform.SetParent(canvasObj); 25 } 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やりたい事は「Photon で UI の同期をしたい」ということだと理解しました。できます。ただ、2D という表現は Unity 2D つまり Sprite 等の同期をしたいという意味と混同してしまう可能性があるため、UI つまり Canvas と RectTransform でできた GameObject 群のことを指している、ということを改めて明確にしておきます。

Photon View 及び Photon Transform View では設定や挙動から推測できるように Position, Rotation, Scale のみ同期できます。つまり Hierarchy 上で示される GameObject の親子関係は同期できません。

従って、GameObject の親子関係の変更は各コンピュータでそれぞれ実行する必要があります。例えば、RPC (PunRPC) を使ってリモートコンピュータの命令を呼んで、リモートで親子関係を操作します。

場合によっては設計を工夫して RPC など使わずにそれができるケースもあるでしょうし、リモートコンピュータでの命令の実行に RPC ではなく Photon Event を使ってもよいでしょうが、まずは RPC でやってみるのが簡単だと思います。

参考

実行例
イメージ説明

投稿2022/02/19 02:55

bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MSyoda

2022/02/19 15:11

ご回答ありがとうございます。 RPCを使用することで、親子関係の変更を各コンピュータに設定するということですね。 RPCを調べて試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問