前提・実現したいこと
Unityでオンラインマルチプレイ対応のお絵描きアプリ(スマホ版お絵かきの森のようなもの)を作成しています。
PUN2を使って同期処理の実装をしているのですが、描画の部分での同期がうまくいきません。
同期自体はできるのですが、実際に描画した側と、同期をとって描画された側とでかなり描画に差が出てしまいます。
下記の画像のような感じになります。
ちなみに描画自体は、下記のスクリプトをアタッチした「LineRenderer」をコンポーネントとして持つオブジェクト(プレハブ)をPhotonNetwork.Instantiateで生成して行っています。
発生している問題
Update関数での描画処理に対して、IPunObservable.OnPhotonSerializeViewでのポジションの値の送受信が少ない?為か、
同期した側がカクカクで描画されてしまう。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5using Photon.Pun; 6 7public class Paint : MonoBehaviourPunCallbacks, IPunObservable 8{ 9 LineRenderer paint; //描画担当 10 Vector3 mousePosition; //タッチした座標 11 Vector3 position; //タッチした座標を変換した値 12 int count; //頂点の数 13 bool paintOn; //描画するかどうか 14 15 void Start() 16 { 17 paintOn = true; 18 //paintの初期設定 19 paint = GetComponent<LineRenderer>(); 20 paint.startWidth = 0.1f; 21 paint.endWidth = 0.1f; 22 paint.material.color = Color.black; 23 24 mousePosition = Input.mousePosition; //タッチした場所の座標を取得 25 position = Camera.main.ScreenToWorldPoint(mousePosition); //座標の変換 26 if((2.7f > position.x) && (position.x > -2.7f) && (2.2f > position.y) && (position.y > -3.4f)){ //描画範囲内か確認 27 count += 1; 28 paint.positionCount = count; //頂点の数設定 29 paint.SetPosition(count - 1, new Vector3(position.x, position.y, 1f)); //描画処理 30 } 31 } 32 33 34 void Update() 35 { 36 if(paintOn == true){ 37 if(Input.GetMouseButton(0)){ 38 mousePosition = Input.mousePosition; 39 position = Camera.main.ScreenToWorldPoint(mousePosition); 40 if((2.7f > position.x) && (position.x > -2.7f) && (2.2f > position.y) && (position.y > -3.4f)){ 41 count += 1; 42 paint.positionCount = count; 43 paint.SetPosition(count - 1, new Vector3(position.x, position.y, 1f)); 44 } 45 } 46 if(Input.GetMouseButtonUp(0)){ 47 paintOn = false; //指を離したら、このオブジェクトでの描画を終わる 48 } 49 } 50 } 51 52 void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){ 53 if(stream.IsWriting){ 54 if(count > 0){ 55 stream.SendNext(position.x); 56 stream.SendNext(position.y); 57 } 58 } else { 59 //描画した側の座標を受け取って、他クライアント側でも描画する 60 position.x = (float)stream.ReceiveNext(); 61 position.y = (float)stream.ReceiveNext(); 62 paint = GetComponent<LineRenderer>(); 63 Vector3 pos = new Vector3(position.x, position.y, 1f); 64 count += 1; 65 paint.positionCount = count; 66 paint.SetPosition(count - 1, pos); 67 } 68 } 69}
考えた対策案
①数秒ごとに同期させて、完全なリアルタイムではなく、徐々に絵を他のクライアントに見せる。
②同期できるポジションの値をどうにかして増やす。
③カメラを同期させて、描画している部分を映す。(カメラの同期なんてない?)
などを考えてみましたが、正直①~③のどれもどうやっていいのか分かりません。
①~③のどれかは実現できるのか、他に対策があるのか、そもそも描画処理自体を別の方法で行った方が良いのかなど、
何かアドバイスが欲しいです。よろしくお願いします!
補足情報
PCはWindows10を使用しています。
Unityのバージョンは2019.3.13です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/20 20:34
2020/07/23 03:01