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

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

ただいまの
回答率

88.59%

unityのPUNを使用して変数の同期を行いたい

受付中

回答 0

投稿 編集

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

kanata_02

score 25

現在UnityでPUNを利用して対戦型カードゲームを製作しております。

両プレイヤーがターンエンドボタンを押したらゲームのモードを変える、という処理を実装したいと思っています。
Player1、Player2それぞれがボタンを押した時_isPush、_isPush2をTrueにし、両方がTrueになったらモードが変わる、という風に記述しているのですが、どうやらPlayer1側では変数の送信のみ、Player2側では変数の受信のみしか行えないということがわかりPlayer2側でしかモードが変わりませんでした。
こちらはどのようにしたらPlayer1側でもモードの変更を同期できるようになりますでしょうか。

現在オーナーの切り替えをしてPlayer2側でも送信を行えないか試しているのですが、
if (photonView.ownershipTransfer != OwnershipOption.Request)
{
Debug.LogError("OwnershipTransferをRequestに変更してください。");
}
を通ってしまい、難航している状態です。
何かアドバイスいただけますと幸いです。
※下記スクリプトのTurnEnd()、OnPhotonSerializeView()、RequestOwner()の部分です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : Photon.MonoBehaviour {

    private PhotonView photonView;

    public HandList handList;
    [SerializeField] private string m_resourcePath = "Card";
    [SerializeField] Transform[] spawnPoints;

    bool _isPush = false;
    bool _isPush2 = false;

    public ClassList classList;

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

    //カードの生成
    public void SpawnObject(int playerNum, int handNum)
    {
        for (int i = 0; i < handNum; i++)
        {
            GameObject card = PhotonNetwork.Instantiate(m_resourcePath, spawnPoints[playerNum].transform.position, spawnPoints[playerNum].rotation, 0);
            handList.ListAdd(card, playerNum);
            CardSetting cardSetting = card.GetComponent<CardSetting>();
            int _cardNum = (int)Random.Range(0f, 5f); //カードの種類だけランダム生成
            cardSetting.cardIndex = _cardNum;
            cardSetting.ToggleFace(0);
        }
    }

    public void TurnEnd( ) {
        if( PhotonNetwork.player.ID == 1 ) {
            _isPush = true;
            Debug.Log("1クリックした" );
        } else {
            _isPush2 = true;
            Debug.Log( "2クリックした" );
        }

        if( _isPush && _isPush2 ) {
            Debug.Log("ターンチェンジ" );
            classList.modeManager.mode_type++;
        }

        RequestOwner();
    }

    void OnPhotonSerializeView( PhotonStream stream, PhotonMessageInfo info ) {
        if ( stream.isWriting ) {
            //データの送信
            stream.SendNext( _isPush );
            stream.SendNext( _isPush2 );
            Debug.Log("送信");
        } else {
            //データの受信
            this._isPush = ( bool )stream.ReceiveNext( );
            this._isPush2 = ( bool )stream.ReceiveNext( );
            Debug.Log("受信");
        }
    }

    private void RequestOwner()
    {
        if (photonView.ownerId != PhotonNetwork.player.ID)
        {
            if (photonView.ownershipTransfer != OwnershipOption.Request)
            {
                Debug.LogError("OwnershipTransferをRequestに変更してください。");
            }
            else
            {
                photonView.RequestOwnership();
            }
        }
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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