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

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

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

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

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

2992閲覧

[Unity Photon]オブジェクトを複製するとID重複のエラーが出るが、エラー回避方法が分からない。

araragi_dev

総合スコア60

Photon Cloud

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

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/11/16 14:31

■背景とやりたいこと
Unityで Photonを使いオンラインゲームを作ろうとしています。
UI上のボタンを押すと、オブジェクトを生成する機能を実装しようとしています。

■困っていること
オブジェクトの生成にむけて、
すでにフィールドにあるオブジェクト(Item_Cube)を複製しようと考えていたのですが、複製するとIDの重複というエラーが出てしまい、その解消方法が分からずにいます。
※オブジェクトはPhotonの同期をするために、photon viewなどのスクリプトがあたっています。

複製の際にPhotonViewIDを新しく割り当てることができれば回避できそうですが、具体的なやり方がわからない状況です。

お手数おかけいたしますが、解消方法教えていただけないでしょうか?
よろしくおねがいします。

■エラー文言
PhotonView ID duplicate found: 28. New: View 28 on Item_Cube(Clone) (scene) old: View 28 on Item_Cube (scene). Maybe one wasn't destroyed on scene load?! Check for 'DontDestroyOnLoad'. Destroying old entry, adding new.

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

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

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

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

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

YOshim

2021/11/17 02:08

どのようなスクリプトで複製を試みていますか。コードを提示頂ければ回答しやすいです。
araragi_dev

2021/11/17 12:47 編集

>>YOshimさん コメントありがとうございます。以下のコードで生成しております。 GameObject original = GameObject.Find("Item_Cube"); //オリジナルをコピー GameObject copied = Object.Instantiate(original) as GameObject; //複製 copied.transform.position = transform.position + transform.forward * 3; //複製を前方へ放出 いつもご回答頂き本当にありがとうございます。感謝しております。
aiueoao

2021/11/19 13:39

>>すでにフィールドにあるオブジェクト(Item_Cube)を複製 とありますがPrefabからの複製ではダメでしょうか? GameObject.Find()で探す必要がありますか?
araragi_dev

2021/11/21 15:29

aiueoaoさん コメントありがとうございます。 試したところ、プレハブで複製することでエラー表示なく生成するところまでできました。 しかし複製時にPhotonViewの設定までうまく出来ていないようで、同期がうまく行っておりません。 只今確認したところ、PhotonViewスクリプトのID・IsMine・Controllerのパラメータがうまく設定できていないのが原因かもしれません。ここの設定方法を現在調査中です。 ※公式情報が少しわかりにくく、Photonの仕様が把握しきれておりません。様々な記事を探りながら引き続き仕様確認中です。
guest

回答2

0

PrefabオブジェクトをInstantiate()で生成した場合は,ViewIDをPhotonNetwork.AllocateViewID()に割り当て、そのViewIDをRoom内の他Userに送信する必要があります.

以下はRaiseで他Userに送信&生成している例です.

c#

1using UnityEngine; 2using ExitGames.Client.Photon; 3using Photon.Pun; 4using Photon.Realtime; 5public class Test : MonoBehaviourPun 6{ 7 public const byte CreateObject = 1; 8 //複製するオブジェクト. 9 [SerializeField] 10 private GameObject PlayerPrefab; 11 12 private void OnEnable() 13 { 14 //Raiseの受信イベント設定. 15 PhotonNetwork.NetworkingClient.EventReceived += OnEvent; 16 } 17 private void OnDisable() 18 { 19 PhotonNetwork.NetworkingClient.EventReceived -= OnEvent; 20 } 21 22 public void SpawnPlayer() 23 { 24 GameObject copied = Instantiate(PlayerPrefab); 25 PhotonView photonView = copied.GetComponent<PhotonView>(); 26 27 if (PhotonNetwork.AllocateViewID(photonView)) 28 { 29 RaiseEventOptions raiseEventOptions = new RaiseEventOptions 30 { 31 Receivers = ReceiverGroup.Others, 32 CachingOption = EventCaching.AddToRoomCache 33 }; 34 35 SendOptions sendOptions = new SendOptions 36 { 37 Reliability = true 38 }; 39 Debug.Log("私のViewIDは "+photonView.ViewID+" です"); 40 //送信 41 PhotonNetwork.RaiseEvent(CreateObject, photonView.ViewID, raiseEventOptions, sendOptions); 42 } 43 else 44 { 45 Debug.LogError("Failed to allocate a ViewId."); 46 Destroy(copied); 47 } 48 } 49 50 //受信 51 public void OnEvent(EventData photonEvent) 52 { 53 if (photonEvent.Code == CreateObject) 54 { 55 GameObject copied = Instantiate(PlayerPrefab);  56 PhotonView photonView = copied.GetComponent<PhotonView>(); 57 photonView.ViewID = (int)photonEvent.CustomData; 58 Debug.Log("私のViewIDは " + photonView.ViewID + " です"); 59 } 60 } 61} 62

参考:https://doc.photonengine.com/ja-jp/pun/current/gameplay/instantiation

投稿2021/11/23 00:39

aiueoao

総合スコア146

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

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

araragi_dev

2021/12/19 06:49

ご回答ありがとうございました。
guest

0

自己解決

Instantiateではなく、PhotonNetwork.Instantiateとすることで、PhotonIDも自動連番で付与され、無事に生成と同期が出来ました。
皆様ご支援ありがとうございました。

・ソースコード
using Photon.Pun;
using Photon.Realtime;
(中略)
PhotonNetwork.Instantiate("生成アイテム名",生成位置,Quaternion.identity);

投稿2021/12/19 06:47

araragi_dev

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問