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

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

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

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

Unity3D

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

Unity

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

Q&A

0回答

1451閲覧

[初心者]Unity RPCを使用したtextureの同期でエラーが出てしまう

p-point

総合スコア4

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/09/16 08:15

編集2019/09/16 08:21

前提・実現したいこと

Photon(PUN2)でのTextureの同期でエラーがでてしまう。
お世話になっております。
Unity,C#,PUN2を使用してお絵かきのオンラインアプリをつくっています。
以下のサイトを参考にしてtextureの同期に挑戦してみたのですがエラーがでてしまいました。
試行錯誤してもうまくいかず、困り果てています
ご教授いただければ幸いです。
なにとぞよろしくお願いします。
https://nabla-tech-lab.hatenablog.com/entry/2019/05/15/180000

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

using UnityEngine; using Photon.Pun; using Photon.Realtime; using ExitGames.Client.Photon; using UniRx; namespace TextureSharing { public enum StreamingBytesEventCode { BeginStream = 10, Streaming = 11, } public class TextureSharingComponent : MonoBehaviourPunCallbacks, IOnEventCallback { [SerializeField] int messagePerSecond = 100; // 100 Messages / Second int bytePerMessage = 1000; // 1KBytes / Message Texture2D texture; // ★ Readable texture ★ bool isReceiving; byte[] receiveBuffer; int totalDataSize; int currentReceivedDataSize; int receivedMessageCount; void Start() { texture = (Texture2D)GetComponent<Renderer>().material.mainTexture; texture.GetPixels32(); } public void GetRawTextureDataFromMasterClient() { photonView.RPC("GetRawTextureDataRPC", RpcTarget.MasterClient); Debug.Log("受信しました"); } //************************************************************************** // Client -> MasterClient (These methods are executed by the master client) //************************************************************************** [PunRPC] public void GetRawTextureDataRPC(PhotonMessageInfo info) { byte[] rawTextureData = texture.GetRawTextureData(); int width = texture.width; int height = texture.height; int dataSize = rawTextureData.Length; int viewId = this.photonView.ViewID; Debug.Log("*************************"); Debug.Log(" GetRawTextureDataRPC"); Debug.Log(" RPC sender: " + info.Sender); Debug.Log(" Texture size: " + width + "x" + height + " = " + width * height + "px"); Debug.Log(" RawTextureData: " + rawTextureData.Length + "bytes"); Debug.Log("*************************"); StreamTextureDataToRequestSender(rawTextureData, width, height, dataSize, viewId, info.Sender); } void StreamTextureDataToRequestSender(byte[] rawTextureData, int width, int height, int dataSize, int viewId, Player requestSender) { Debug.Log("***********************************"); Debug.Log(" StreamTextureDataToRequestSender "); Debug.Log("***********************************"); RaiseEventOptions raiseEventOptions = new RaiseEventOptions { CachingOption = EventCaching.DoNotCache, Receivers = ReceiverGroup.All, TargetActors = new int[] { requestSender.ActorNumber }, }; SendOptions sendOptions = new ExitGames.Client.Photon.SendOptions { Reliability = true, }; // Send info int[] textureInfo = new int[4]; textureInfo[0] = viewId; textureInfo[1] = width; textureInfo[2] = height; textureInfo[3] = dataSize; PhotonNetwork.RaiseEvent((byte)StreamingBytesEventCode.BeginStream, textureInfo, raiseEventOptions, sendOptions); // Send raw data // The SlowDown operator is not necessary if you ignore the limit on the number of messages per second of Photon Cloud. rawTextureData.ToObservable() .Buffer(bytePerMessage) // .SlowDown(1.0f/messagePerSecond) .Subscribe(byteSubList => { byte[] sendData = new byte[byteSubList.Count]; byteSubList.CopyTo(sendData, 0); PhotonNetwork.RaiseEvent((byte)StreamingBytesEventCode.Streaming, sendData, raiseEventOptions, sendOptions); }); } //*************************************************************************** // MasterClient -> Client (These methods are executed by the master client) //*************************************************************************** public void OnEvent(ExitGames.Client.Photon.EventData photonEvent) { if (photonEvent.Code == (byte)StreamingBytesEventCode.BeginStream) { int[] data = (int[])photonEvent.Parameters[ParameterCode.Data]; OnReceivedTextureInfo(data); } if (photonEvent.Code == (byte)StreamingBytesEventCode.Streaming) { byte[] data = (byte[])photonEvent.Parameters[ParameterCode.Data]; OnReceivedRawTextureDataStream(data); } } void OnReceivedTextureInfo(int[] data) { int viewId = data[0]; if (viewId != this.photonView.ViewID) { this.isReceiving = false; this.totalDataSize = 0; this.currentReceivedDataSize = 0; this.receivedMessageCount = 0; return; } this.isReceiving = true; this.currentReceivedDataSize = 0; this.receivedMessageCount = 0; int width = data[1]; int height = data[2]; int dataSize = data[3]; this.totalDataSize = dataSize; this.receiveBuffer = new byte[dataSize]; Debug.Log("*************************"); Debug.Log(" OnReceivedTextureInfo"); Debug.Log(" Texture size: " + width + "x" + height + "px"); Debug.Log(" RawTextureDataSize: " + data[2]); Debug.Log("*************************"); } void OnReceivedRawTextureDataStream(byte[] data) { if (this.isReceiving) { data.CopyTo(this.receiveBuffer, this.currentReceivedDataSize); this.currentReceivedDataSize += data.Length; this.receivedMessageCount++; if (this.currentReceivedDataSize >= (this.totalDataSize)) { this.isReceiving = false; this.currentReceivedDataSize = 0; this.receivedMessageCount = 0; OnReceivedRawTextureData(); } } } void OnReceivedRawTextureData() { Debug.Log("********************************"); Debug.Log(" OnReceivedRawTextureData "); Debug.Log("********************************"); texture.LoadRawTextureData(this.receiveBuffer); texture.Apply(); GetComponent<Renderer>().material.mainTexture = texture; } } }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問