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

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

ただいまの
回答率

88.80%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 247

hikaaaaaaaa

score 19

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

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Photon.Pun;
using Photon.Realtime;
using System;
using System.Diagnostics;

public class EnemyManagerOnline : MonoBehaviourPunCallbacks, EMInterface
{

    public bool Oppsiteturnchange = false;

    Coroutine mondaiCoroutine;
    Coroutine mondaiCoroutine1;
    Coroutine mondaiCoroutine2;

    private PhotonView photonView;

    public bool turn1 = false;
    public bool turn2 = false;
    public bool mondaichange = false;
    public bool rivalReady1 = false;





    void Start()
    {
        photonView = GetComponent<PhotonView>();

        if (PhotonNetwork.IsMasterClient)
        {
            mondaiCoroutine = StartCoroutine(Startmondai());
        }
    }

    void Update()
    {

       if (turn1)
        {

                if (PhotonNetwork.IsMasterClient)
                {
                mondaiCoroutine1 = StartCoroutine(Startmondai1());
                 }
                turn1 = false;


        }
        else if (turn2)
            {

                if (PhotonNetwork.IsMasterClient)
                {
                mondaiCoroutine2 = StartCoroutine(Startmondai2());

                }
                turn2 = false;


        }
        else if (mondaichange)
            {

                mondaichange = false;
                turn1 = true;

            }


    }



    IEnumerator Startmondai()
    {
        //メソッドをここにも書いてます。RPGでの同期もothersで完了
        photonView.RPC("mondaiStart", RpcTarget.IsMasterClient);
    }

    IEnumerator Startmondai1()
    {
            while (PlayerManagerOnline.alive)
            {
               //メソッドで問題を設定(RPCメソッドもターゲットをothersで設定し同期)
               rivalReady1 = false;

              //ここで双方に問題が表示されたかを判断
                photonView.RPC("Ready", RpcTarget.others);
               while (PhotonNetwork.IsConnected && !rivalReady1)
             {
               yield return new WaitForSeconds(0.1f);
               continue;
             }

            }

    }
    IEnumerator Startmondai2()
    {

            while (PlayerManagerOnline.alive)
            {
              //メソッドを設定(RPCメソッドもターゲットをothersで設定)
              mondaichange=true
            }

    }

    [PunRPC]
    private void mondaiStart()
    {
        turn1 = true;
    }




    [PunRPC]
    private void Ready()
    {
        rivalReady1 = true;
        photonView.RPC("RivalReady1", RpcTarget.MasterClient);
    }

    [PunRPC]
    private void RivalReady1()
    {
        rivalReady1 = true;
    }



}


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

public class PlayerManagerOnline : MonoBehaviourPunCallbacks
{

    public bool rivalReady = false;
    public bool Ready = false
    private PhotonView photonView;





    void Start()
    {

        photonView = GetComponent<PhotonView>();
    }


    void Update()
    {

       //どちらも問題をみたときに回答をさせる
        if (enemyManager.rivalReady1)
        {
            if (PhotonNetwork.IsMasterClient)
            {

               //マスタークライアントに、ボタン表示のメソッドを書き、RPCメソッドでothersに表示
         (countはカウントダウンが起こって同期するように設定がしてあります)

                if (count < this.delatime)
                {

                    //時間切れの際に発動
             enemyManager.rivalReady1 = false;
                     enemyManager.turn2 = true;

                }
                //リストを先に埋めた方が勝ちになっておりそのメソッドは書いてあります
                else if (stinglist.Count == enemyManager.stinglistAttack.Count)
                {
                    enemyManager.rivalReady1 = false
                    enemyManager.turn2 = true;



                }
          //リストを先に埋めた方が勝ちになっておりそのメソッドは書いてあります
                else if (stinglistRival.Count == enemyManager.stinglistAttack.Count)
                { enemyManager.rivalReady1 = false;
                  enemyManager.turn2 = true;

                }
            }



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 22:12

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

    キャンセル

  • 2020/07/21 23:16

    アドバイスありがとうございます。

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

    キャンセル

  • 2020/07/21 23:54

    > PhotonNetwork.IsMasterClient が true にすることができるのでしょうか。

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

    キャンセル

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

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る