0 支持
(160 ポイント)
現在、カードを使ったボードゲームを作成しており、全員で共有する山札を作成したいと考えています(各プレイヤーが1つの山札からカードを引いてくる)。

山札はカードID(int型)の配列で表現しているのですが、この配列を全プレイヤーが常に共有している状態を作りたいです。例えばA、B、Cの3人でプレイしている時、Aが山札から1枚引く(山札配列の0番目の要素を削除する)と、BとCの方でも山札の要素数が減るといった感じです。BやCが引いた場合でも同様にしたいです。

Hostが山札配列のデータを持っていて、RPCやOnMonobitSerializeViewを活用して作成することは可能だと思うのですが、それ以外に、全員が常に共有できるデータの作成方法があれば教えていただきたいです。

回答 1

+1 支持
(3.9k ポイント)

ゲームスタート時とドロー時にRPCを送信すれば良いと思います。

List<int> carddeck; // 山札データ


    if( ゲームスタートする? ) {
        if( MonobitNetwork.isHost ) {
           (carddeck のリスト生成, シャッフルなどの初期化の実行)
           monobitView.RPC("OnGameStart", MonobitTargets.All, carddeck.ToArray());
        }
    }
    if( 山札からカードをドローした? ) {
        int drawcard = carddeck.First();
        monobitView.RPC("OnDrawDeck", MonobitTargets.All, null);
    }

[MunRPC]
void OnGameStart(int[] deck)
{
    // ホスト以外のプレイヤーと初期の山札の状態を共有
    if( !MonobitNetwork.isHost) {
        carddeck = new List<int>(deck);
    }
}

[MunRPC]
void OnDrawDeck()
{
    // 全員の山札から一枚抜き取る
    if(carddeck.Count > 0) {
        carddeck.RemoveAt(0);
    }
}

全員が常にデータを共有しあう方法として上記の方法以外に OnMonobitSerializeView を使う方法やRoomCustomParameter を使う方法などありますが、いずれも一定間隔で送受信しあうトラフィックを考えると良い方法とは言えません。

(160 ポイント)
分かりました。
ご丁寧に回答していただき、誠にありがとうございます。
頂いた方法で作成してみたいと思います。
...