0 支持
(120 ポイント)
先に入室している同一グループのオブジェクトが、後から入室したユーザーに表示されません。
先に入室したユーザーには後から入室したユーザーは表示され動きも同期されております。
また、同現象は2つ目以降のグループに起こり最初のグループには起きておりません。

具体的には、
グループ=1:
 全員相互表示され特に問題ないです。

グループ=2:
 1人目ユーザー → グループ2の全員表示されます。
 2人目ユーザー → 自分と3人目のみ表示(1人目が表示されない)
 3人目ユーザー → 自分のみ表示(1人目、2人目が表示されない)

それ以降のグループはグループ2と同じ動作です。

現在はMonobitNetwork.Instantiateでグループを指定、
その際にSetSendingEnabled、SetReceivingEnabledで該当グループをtrue指定してます。

後から入室したユーザーが同一グループ全員の同期を取るには他に指定する項目等ありますでしょうか?

回答 1

0 支持
(3.8k ポイント)
ルーム入室処理を行っているスクリプト内にOnJoinedRoom() のコールバック
https://bit.ly/3CEhtam
を組み込み、その中で SetSendingEnabled(), SetReceivingEnabled() を実行すれば同期がとれると思います。
(120 ポイント)
ご回答ありがとうございます。

OnJoinedRoom内でSetSendingEnabled等を試してみましたが状況は変わらずでした。
やはり2つ目のグループから同期がとれなくなる状況になってます。

試しにグループ2から始めてみましたが
グループ2は同期されて、グループ3以降が同期されなくなってます。
グループの数値関係なしに最初のグループのみ同期され、それ以降のグループは後から入った人は先に入った人が表示されないようです。
(3.8k ポイント)
GoogleDriveなどにプロジェクト一式をアップロードして共有していただけますか?
(120 ポイント)
新規に簡単なプロジェクトを作成しました。同様の問題が起こります。
https://drive.google.com/drive/folders/1-EFjM-oyOpyFQJC6UCRRzk-YUZ3Qb3QC?usp=sharing

Assets/Script/SceneHome.csが主処理になります。
一旦3人毎にグループIDが変わるようにしております。

また、これをWebGLビルド化したものが下記になります。
https://aws-sai-unity-sample.s3.ap-northeast-1.amazonaws.com/group_test/index.html
タブを複製して4アクセス以上の場合に同期されなくなります。
(3.8k ポイント)
OnJoinedRoom() 内で想定される最大グループ数まで許可してください。

サンプルで拝見したケースの場合、最大人数=20、groupの最大値=(最大人数-1)/3+1ですので、

    private void OnJoinedRoom()
    {
        ...
        for(int i=0; i<=7; ++i) {
          MonobitNetwork.SetSendingEnabled(i,true);
          MonobitNetwork.SetReceivingEnabled(i,true);
        }
        ...
    }

とすれば良いはずです。
(120 ポイント)
ご確認ありがとうございます。

上記変更した場合、
後から入った人にも前の人は表示されますが、グループ関係なくルームに入室した全員表示されてしまいました。(Instantiateする際のグループは違うものになってます)

期待する動作としては、同じグループのメンバーのみを画面表示させたいため、
----------
group = (MonobitNetwork.room.playerCount - 1) / 3 + 1;
for (var i = 1; i <= 7; i++) {
  MonobitNetwork.SetSendingEnabled(i, group==i);
  MonobitNetwork.SetReceivingEnabled(i, group==i);
}
----------
のような形で自分の所属するグループのみ有効、他のグループは無効も試してみましたが、
やはり2グループ目以降の表示で同期が取れなくなってしまいました。
同じグループのみ同期させたい場合は他に処理が必要でしょうか。
(3.8k ポイント)
なるほど。ようやく主旨が理解できました。

それで、いただいたサンプルを色々弄って調べてみたんですが、MonobitNetwork.Instantiate() の同期は以下の仕様で動いているようです。

〇 入室時に同期するオブジェクトは、ホストが把握しているオブジェクトに限られる。
〇 ホストが受信許可していないグループで誰かがInstantiate()したオブジェクトは、他のルームプレイヤーが入室した際に同期されない。

おおよそ真っ当な挙動とは思えないので、おそらくMUN側のバグだと思います。Instantiate()に関してはグループによる同期に頼らない作り方をするしかないように思えます。
(長いので次に続きます)
(3.8k ポイント)
編集
以下の打開策を講じれば、実質的に望み通りの結果が得られるはずです。

■ 打開策
1. シーンに静的配置している、MonobitViewコンポーネントを持つオブジェクトに任意のスクリプトを用意してアタッチする(ここでは、いただいているサンプルにある SceneHome.cs とする)

2. 1.でアタッチしたスクリプト(SceneHome.cs)に対し、以下のメソッドを追加する
------------
    // 他のプレイヤーに対し、自身がMonobitNetwork.Instantiate() するオブジェクトがどのグループに属しているのかを送信する処理
    public void SendGroupID(int viewID)
    {
        monobitView.RPC("ReceiveGroupID", MonobitEngine.MonobitTargets.Others, group, viewID);
    }

    // 他のプレイヤーが MonobitNetwork.Instantiate() するオブジェクトが
    // どのグループに属しているのか、作成者に問い合わせる処理
    public void SendRequestGroupID(MonobitEngine.MonobitPlayer sender, int viewID)
    {
        monobitView.RPC("ReceiveRequestGroupID", sender, MonobitNetwork.player, viewID);
    }

    // 上記の SendRequestGroupID() でリクエストされたプレイヤーが生成した
    // MonobitNetwork.Instantiate() するオブジェクトがどのグループに属しているのかを
    // 返信する処理
    [MunRPC]
    public void ReceiveRequestGroupID(MonobitEngine.MonobitPlayer sender, int viewID)
    {
        monobitView.RPC("ReceiveGroupID", sender, group, viewID);
    }

    // 上記の SendGroupID() および ReceiveRequestGroupID() の結果を受けて、
    // MonobitNetwork.Instantiate() されたオブジェクトが
    // 自分と同一グループに存在しているのか判別する処理
    [MunRPC]
    public void ReceiveGroupID(int group, int viewID)
    {
        // 自分が設定した受信許可リストから、同一グループにあるのかどうかを判別
        List<int> allowGroup = new List<int>(MonobitNetwork.AllowReceivingGroup);
        if (allowGroup.Contains(group))
        {
            // 同一シーンに存在するのであれば、オブジェクトをアクティブに
            GameObject obj = MonobitEngine.MonobitView.Find(viewID).gameObject;
            obj.SetActive(true);
        }
    }
------------

3. 上記とは別に、同期するオブジェクトのプレハブに任意のスクリプトを用意してアタッチする。ここでは Foo.cs とする。

4. アタッチしたスクリプト(Foo.cs) にて、以下の処理を組み込む
-----------------------------------
public class Foo : MonobitEngine.MonoBehaviour
{
    // MonobitNetwork.Instantiate() によってオブジェクトが生成されたとき、
    // このメソッドがコールバックで呼び出される。
    public void OnMonobitInstantiate(MonobitEngine.MonobitMessageInfo info)
    {
        SceneHome sceneHome = GameObject.Find("GameManager").GetComponent<SceneHome>();

        if (info.sender.ID != MonobitNetwork.player.ID)
        {
            // オブジェクトを作成したプレイヤーが自分でない場合、
            // いったんこのオブジェクトを非アクティブにしたうえで、
            // 作成者にオブジェクトのグループIDを問い合わせる
            //
            // 問い合わせて結果を受信した後、もし同一グループであれば
            // SceneHome.ReceiveGroupID() によってオブジェクトがアクティブにされる。
            sceneHome.SendRequestGroupID(info.sender, monobitView.viewID);
            gameObject.SetActive(false);
        }
        else
        {
            // 自分が作成したオブジェクトであれば、
            // このオブジェクトが所属するグループをルーム内の全員に通知する。
            // 通知を受けた側は SceneHome.ReceiveGroupID() によって、
            // 同一シーンであればアクティブにされる。
            sceneHome.SendGroupID(monobitView.viewID);
        }
    }
}
-----------------------------------

5. 上記を組み込んだうえで、MonobitNetwork.Instantiate() の呼び出しについて、group パラメータを「0」に設定したうえで呼び出す。
(3.8k ポイント)
いただいたサンプルについて、上記の内容を施したもの(Assetsディレクトリ以下のみ)をアップロードしました。以下のアドレスで共有します。
https://drive.google.com/file/d/19wX-HOmjHBUNyLWtK_aXSdNAXlESSMRy/view?usp=share_link
ダウンロードして、WinMerge等のdiffツールで変更内容を確認してください。
(120 ポイント)
打開策ありがとうございます。期待する挙動となりました。

元々の動作はやはりNUMのバグっぽいですかね。
現状としてはこれで問題ないのですが、同接ユーザー数が増えた場合などはオブジェクト数や通信負荷は多くなりそうですね。

グループ機能自体は私の使い方がおかしいだけで正式な使い方がありそうな気がしてます。
今後そのあたり含めて色々と調査してみます。
ありがとうございました。
...