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

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

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

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Unity

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

Q&A

1回答

1758閲覧

photonでの時間の同期について unity

hikaaaaaaaa

総合スコア19

C#

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

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/07/21 14:32

photonを用いた対戦ゲームを作っております。

ゲーム内容としましては
一つのお題が出てそのお題について早押しで答える対戦ゲームです。

早押しでのカウントダウンにて0.1〜0,2程度のタイムラグが生じ、双方の変数の同期がされていない問題が生じております。
こちらアドバイスをいただけますと幸いです。

タイマー(双方のリストが埋まるまでカウントダウン)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.EventSystems; 6using System; 7using UnityEngine.SceneManagement; 8using Photon.Pun; 9using Photon.Realtime; 10using System.Collections.Specialized; 11using System.Diagnostics; 12 13public class TimeScript : MonoBehaviour, Photon.Pun.IPunObservable 14{ 15 [SerializeField] 16 PlayerManagerOnline playerManager; 17 18 [SerializeField] 19 EnemyManagerOnline enemyManager; 20 21 public PhotonView photonview; 22 23 // Start is called before the first frame update 24 void Start() 25 { 26 photonview = GetComponent<PhotonView>(); 27 } 28 29 // Update is called once per frame 30 void Update() 31 { 32 if (enemyManager.FinTurn) 33 { 34       //双方の回答が終わる(どちらのリストがはじめに提示したリストと同数に埋まるまでカウントダウン) 35 if (playerManager.stinglist.Count != enemyManager.stinglistAttack.Count || playerManager.stinglistRival.Count != enemyManager.stinglistAttack.Count) 36 { 37 38 playerManager.Timer.value -= Time.deltaTime; 39 40 41 } 42 } 43 44 } 45 46 47 48 public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) 49 { 50 if (stream.IsWriting) 51 { 52 stream.SendNext(playerManager.Timer.value); 53 stream.SendNext(playerManager.time1); 54 stream.SendNext(playerManager.sum); 55 } 56 else 57 { 58 playerManager.Timer.value = (float)stream.ReceiveNext(); 59 playerManager.time1 = (float)stream.ReceiveNext(); 60 playerManager.sum = (float)stream.ReceiveNext(); 61 62 } 63 } 64 65} 66

プレイヤー(回答のスクリプト)

C#

1void Update() 2 { 3 4 5 if (enemyManager.FinTurn) 6 { 7 8 9 if (Timer.value == 0) 10 { 11 12 enemyManager.FinTurn = false; 13 enemyManager.Oppsiteturn2 = true; 14 15 } 16 17 18 //自分の回答スクリプト 19 20 else if (stinglist.Count == enemyManager.stinglistAttack.Count&&!losing) 21 { 22 23 if (stinglistRival.Count == enemyManager.stinglistAttack.Count) 24 { 25 26 27 28 enemyManager.FinTurn = false; 29 30 31 } 32 33 } 34      //対戦相手のスクリプト 35 else if (stinglistRival.Count == enemyManager.stinglistAttack.Count) 36 { 37 38 39 losing = true; 40 41 if (stinglist.Count == enemyManager.stinglistAttack.Count&&losing) 42 { 43 44 enemyManager.FinTurn = false; 45 losing = false; 46 47 48 } 49 50 } 51 52 53 } 54 55 56 public void OnbuttonKaitou() 57 { 58 59 stinglist.Add("a"); 60 if (stinglist.Count == enemyManager.stinglistAttack.Count) 61 { 62       //自分の画面に回答ボタンを押すまでにかかった時間を表示 63 time1 = Timer.value; 64 sum = Timer.maxValue - time1; 65 TimeMe.text = sum.ToString("f2"); 66 67       //相手の画面に回答ボタンを押すまでにかかった時間を表示 68 photonView.RPC("Time1RPC", RpcTarget.Others); 69 70 71 } 72 73 74 } 75 76 77 [PunRPC] 78 private void Time1RPC() 79 { 80//ここのtime1とTimer.valueとsumに少々の誤差が生じている。 81 82 time1 = Timer.value; 83 sum = Timer.maxValue - time1; 84 TimeRival.text = sum.ToString("f2"); 85 86 } 87

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

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

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

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

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

guest

回答1

0

ネットワークなんだから、相手が何かしたことを知るのは必ず通信が届いた時です。通信速度には差があるので、必ず同着にする、ということは仕組み上できません。

どうやってラグを埋めるかはアイデア次第です。例えば各クライアントのシステム時刻を指定して、その時間からカウントダウンするというのも一案です。
ただしこの実装も、各クライアントのシステム時刻にズレがあればやはりズレます。

投稿2020/07/21 14:58

bboydaisuke

総合スコア5275

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

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

hikaaaaaaaa

2020/07/22 04:43 編集

やはりズレは生じるものなんですね。。 ありがとうございます。 送信側で秒数を管理し、変数を送るのではなく、送信側で表示された文字を送ることはできるのでしょうか。 RPCにtostring()部分だけを表示させると受信側では変数が送られていないため初めに設定された変数が表示されてしまい困っております。
bboydaisuke

2020/07/22 16:23

> RPCにtostring()部分だけを表示させると受信側では変数が送られていないため初めに設定された変数が表示されてしまい困っております。 RPC に表示させるという意味がわかりません。RPC はリモートの(戻り値のない)関数呼び出しの事で、関数呼び出しに何かを表示させる、という表現の意味がわかりません。
hikaaaaaaaa

2020/07/23 01:05

RPCで ( [PunRPC]内)TimeRival.text = sum.ToString("f2");の部分だけをリモート側に表示をさせる という意味です。失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問