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

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

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

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

Unity3D

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

Unity

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

Q&A

1回答

1890閲覧

photonを用いた対戦ゲームの実装

hikaaaaaaaa

総合スコア19

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/07/13 15:09

編集2020/07/13 16:22

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

ゲーム内容としましては
一つのお題が出てそのお題について早押しで答える対戦ゲームです。
下記のように実装をし、マスタークライアントでのコルーチンを実施し、双方がお題をみた際に
タイマーが動き、その間に早押しで回答をするようにしているのですが、一つ目の関数である、turn1の反映もされないのが現状です。
アドバイスをいただけますと幸いです。

Enemy(まず、こちらの出題の方のスクリプト)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.EventSystems; 6using Photon.Pun; 7using Photon.Realtime; 8using System; 9using System.Diagnostics; 10 11public class EnemyManagerOnline : MonoBehaviourPunCallbacks, EMInterface 12{ 13 14 public bool Oppsiteturnchange = false; 15 16 Coroutine mondaiCoroutine; 17 Coroutine mondaiCoroutine1; 18 Coroutine mondaiCoroutine2; 19 20 private PhotonView photonView; 21 22 public bool turn1 = false; 23 public bool turn2 = false; 24 public bool mondaichange = false; 25 public bool rivalReady1 = false; 26 27 28 29 30 31 void Start() 32 { 33 photonView = GetComponent<PhotonView>(); 34 35 if (PhotonNetwork.IsMasterClient) 36 { 37 mondaiCoroutine = StartCoroutine(Startmondai()); 38 } 39 } 40 41 void Update() 42 { 43 44 if (turn1) 45 { 46 47 if (PhotonNetwork.IsMasterClient) 48 { 49 mondaiCoroutine1 = StartCoroutine(Startmondai1()); 50 } 51 turn1 = false; 52 53 54 } 55 else if (turn2) 56 { 57 58 if (PhotonNetwork.IsMasterClient) 59 { 60 mondaiCoroutine2 = StartCoroutine(Startmondai2()); 61 62 } 63 turn2 = false; 64 65 66 } 67 else if (mondaichange) 68 { 69 70 mondaichange = false; 71 turn1 = true; 72 73 } 74 75 76 } 77 78 79 80 IEnumerator Startmondai() 81 { 82 //メソッドをここにも書いてます。RPGでの同期もothersで完了 83 photonView.RPC("mondaiStart", RpcTarget.IsMasterClient); 84 } 85 86 IEnumerator Startmondai1() 87 { 88 while (PlayerManagerOnline.alive) 89 { 90 //メソッドで問題を設定(RPCメソッドもターゲットをothersで設定し同期) 91 rivalReady1 = false; 92 93 //ここで双方に問題が表示されたかを判断 94  photonView.RPC("Ready", RpcTarget.others); 95  while (PhotonNetwork.IsConnected && !rivalReady1) 96       { 97     yield return new WaitForSeconds(0.1f); 98    continue; 99      } 100 101 } 102 103 } 104 IEnumerator Startmondai2() 105 { 106 107 while (PlayerManagerOnline.alive) 108 { 109 //メソッドを設定(RPCメソッドもターゲットをothersで設定) 110 mondaichange=true 111 } 112 113 } 114 115 [PunRPC] 116 private void mondaiStart() 117 { 118 turn1 = true; 119 } 120 121 122 123 124 [PunRPC] 125 private void Ready() 126 { 127 rivalReady1 = true; 128 photonView.RPC("RivalReady1", RpcTarget.MasterClient); 129 } 130 131 [PunRPC] 132 private void RivalReady1() 133 { 134 rivalReady1 = true; 135 } 136 137 138 139} 140 141

プレイヤー側のスクリプト

C#

1 2 3 4public class PlayerManagerOnline : MonoBehaviourPunCallbacks 5{ 6 7 public bool rivalReady = false; 8 public bool Ready = false 9 private PhotonView photonView; 10 11 12 13 14 15 void Start() 16 { 17 18 photonView = GetComponent<PhotonView>(); 19 } 20 21 22 void Update() 23 { 24 25 //どちらも問題をみたときに回答をさせる 26 if (enemyManager.rivalReady1) 27 { 28 if (PhotonNetwork.IsMasterClient) 29 { 30 31 //マスタークライアントに、ボタン表示のメソッドを書き、RPCメソッドでothersに表示 32         (countはカウントダウンが起こって同期するように設定がしてあります) 33 34 if (count < this.delatime) 35 { 36 37 //時間切れの際に発動 38             enemyManager.rivalReady1 = false; 39 enemyManager.turn2 = true; 40 41 } 42 //リストを先に埋めた方が勝ちになっておりそのメソッドは書いてあります 43 else if (stinglist.Count == enemyManager.stinglistAttack.Count) 44 { 45 enemyManager.rivalReady1 = false 46 enemyManager.turn2 = true; 47 48 49 50 } 51          //リストを先に埋めた方が勝ちになっておりそのメソッドは書いてあります 52 else if (stinglistRival.Count == enemyManager.stinglistAttack.Count) 53 { enemyManager.rivalReady1 = false; 54 enemyManager.turn2 = true; 55 56 } 57 } 58 59 60 61} 62

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

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

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

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

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

guest

回答1

0

コードが読めないのでインデントを直してください。

一つ目の関数である、turn1の反映もされないのが現状です。

これは mondaiStart 関数を RPC 呼び出ししているつもりであるが、呼び出されずその中で行っている処理である turn1 を true にする処理が実行されず、結果として turn1 がずっと false のままである、ということですか?

その EnemyManagerOnline コンポーネントがどういったオブジェクトにアタッチされているのかわかりませんが、最初からシーンにいるオブジェクトにアタッチしているなら、接続処理が始まる前に Start() が呼ばれちゃうので、PhotonNetwork.IsMasterClient が true になることはない、ということになりますね。

それから、問題と直接は関係ありませんが、ここ でコルーチンの中で PhotonView.RPC を呼んではいけない、と言われているのでやめた方がいいでしょう。そんなことをする必要はないと思います。

投稿2020/07/13 15:29

bboydaisuke

総合スコア5308

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

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

hikaaaaaaaa

2020/07/13 16:26

>インデントにつきまして 見辛くすみません。PC上からの投稿をしているのでズレがあるかと思います。 >これは mondaiStart 関数を RPC 呼び出ししているつもりであるが、呼び出されずその中で行っている処理である turn1 を true にする処理が実行されず、結果として turn1 がずっと false のままである、ということですか? こちらその通りです。 また、アドバイスありがとうございます。リンク内を参考にいたします。
bboydaisuke

2020/07/13 16:44

> PC上からの投稿をしているのでズレがあるかと思います。 何で投稿しているかにかかわらず、直しましょう。インデントのズレはNGです。 > リンク内を参考にいたします。 リンク先はこの問題の解決とは関係ありません。
bboydaisuke

2020/07/14 13:12

この部分が答えであることには気づいてもらえたのだろうか... → 「その EnemyManagerOnline コンポーネントがどういったオブジェクトにアタッチされているのかわかりませんが、最初からシーンにいるオブジェクトにアタッチしているなら、接続処理が始まる前に Start() が呼ばれちゃうので、PhotonNetwork.IsMasterClient が true になることはない、ということになりますね。」
hikaaaaaaaa

2020/07/21 14:16

アドバイスありがとうございます。 初心者でこちらの意味があまり理解できていないのですが、どのようにすれば PhotonNetwork.IsMasterClient が true にすることができるのでしょうか。
bboydaisuke

2020/07/21 14:54

> PhotonNetwork.IsMasterClient が true にすることができるのでしょうか。 あなたが書いたコードはサーバーに接続する前に自分が MasterClient かどうかチェックしてませんか?もしそうなら、接続してないんだからその値は常に false ですよ。 接続するまで待ってから自分が MasterClient かどうかチェックするように修正しないといけないんじゃないですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問