0 支持
(120 ポイント)
編集
現在VRとWindowsで通信を行うオンラインゲームを作成しています。
最初はRPC通信できていたのですが、急にできなくなりました。

Scene遷移を行い各オブジェクトの初期化を行っている最中です。

Debug.Logで送信の手前まで処理は行われており、受信メソッドでは処理が行われていないのを確認済みです。コンソールにエラー、警告は出ておりません。

(TargetをAllにしてホストも確認してみたのですが、ホストの方にも生成されていなかったです)

下記のものが抜粋したコードなります。

public class GameManager : MonobitEngine.MonoBehaviour

{

    public PlayerManager playerManager;
    private void Start()

    {

        playerManager.Spawn("Red");

    }

}

public class PlayerManager : MonobitEngine.MonoBehaviour

{

    public Vector3 spawnPos;
    public void Spawn(string color)

    {

        Debug.Log("Spawn 前"); ← ココ呼ばれている

        monobitView.RPC("ReceiveSpawn",

            MonobitTargets.OthersBuffered,

            color);

        Debug.Log("Spanw 後"); ← ココ呼ばれている

    }

    [MunRPC]

    void ReceiveSpawn( string color )

    {

        Debug.Log("[RPC] Spawn"); ← ココ呼ばれてない

        MonobitEngine.MonobitNetwork.Instantiate(

        MonobitEngine.Definitions.InstantiateType.RESOURCES,

        color,

        spawnPos,

        Quaternion.identity,

        0,

        null,

        true,

        true,

        false

        );

    }

}

回答 1

0 支持
(3.6k ポイント)

最初はRPC通信できていたのですが、急にできなくなりました。

同一プロジェクトで開発中にそういう事態に陥ったのであれば、「monobitView.RPC() のパラメータに指定している変数の型および数」が「[MunRPC]として定義しているメソッドに指定している変数の型および数」が一致していない可能性が考えられますが、一致していますか?

もし一致しているのであれば、ほかの原因として「パラメータにシリアライズ不可能な型が指定されている」ケースも考えられるので、上記の質問内で「 ... 」で伏せられている内容を明確にしてください。

(120 ポイント)
回答ありがとうございます。
すべて一致していました。Castも行っていません。
(3.6k ポイント)
再度言及しますが、現在設定しているパラメータを明示していただけますか?
(120 ポイント)
現在設定しているものを明示しました。
(3.6k ポイント)
編集
パラメータはstringだけなので問題ないですね。
そうなると想定されるケースとして
・現在設定されている MonobitView の ID が不正である
・クライアントがルームに入室できていない
・クライアントと同一ルームに入室できていない
ということが現状考えられますので、PlayerManager.Spawn メソッドを以下のように記述し、コンソールログにどういった結果が出るか教えてください。

    public void Spawn(string color)
    {
        // 以下3行の出力結果を教えてください
        Debug.Log("MonobitView ID = " + monobitView.viewID);
        Debug.Log("Is joined Room = " + MonobitNetwork.inRoom);
        Debug.Log("Count player in my room = " + MonobitNetwork.room.playerCount);

        Debug.Log("Spawn 前");

        monobitView.RPC("ReceiveSpawn",
            MonobitTargets.OthersBuffered,
            color);

        Debug.Log("Spanw 後");
    }
(120 ポイント)
端末1
MonobitView ID = 1
is joined Room = True
Count player in my room = 2

端末2
MonobitView ID = 2
is joined Room = True
Count player in my room = 2

でした。
(3.6k ポイント)
端末1と端末2で、MonobitView IDが一致していないですね。一致していない限り、このオブジェクトは相互に送受信しあうことはありません。
IDが1000番未満ということは静的に配置されているオブジェクトなので、シーンに依存して配置されていると思いますが、このPlayerManagerクラスを持つオブジェクトの初期設定はどうなっているでしょうか?

1. 仮にこのオブジェクトをシーンにあらかじめ紐づけている場合、 MonobitView ID が 1~999 の数値以外で設定されていると思いますので、1~999 の固有IDを割り当ててください。

2. 仮にこのオブジェクトをシーンにあらかじめ紐づけていて、かつ、 MonobitView ID が 1~999 の数値で設定されている場合、同一シーン内の別のオブジェクトに同じ番号が割り当てられている可能性が高いです。MonobitView ID がユニークであるか、すべてのオブジェクトを確認してください。

3. 仮にこのオブジェクトを  UnityEngine.Object.Instantiate() で生成しているなど、「MonobitNetwork.Instantiate() で生成していない場合」には、ViewIDが不一致であるため、このオブジェクトを通じて送受信されるデータは「別々のオブジェクトに対する同期」としか扱われません。
ルーム入室したうえで
https://www.monobitengine.com/doc/mun/contents/FeatureClient/Instantiate.htm#MonobitEngine.MonobitNetwork.Instantiate%20%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89(3)
こちらにある拡張型の MonobitNetwork.Instantiate() を使い、isDontDestroyOnLoad および isDontDestroyOnRoom に true を設定して生成するようにしてください。
(120 ポイント)
申し訳ありません。記述ミスでした。
両端末ともIDは一致しています。自動で設定していたのですが、
試しに手動で1~999の範囲内で設定してみました。
手動で設定し、コンソールにログを出しても同様に一致していましたが、通信されませんでした。
(3.6k ポイント)
・monobitView.viewID, MonobitNetwork.inRoom,  MonobitNetwork.room.playerCount の3つについて現状のログを改めて示してください

・差し支えなければ現状のUnityプロジェクト一式をGoogleDriveなどに共有していただけませんでしょうか?
(120 ポイント)
https://upload.hdedrive.com/ui/solize.com/dl/SB1667809763-664a73cb-4597-4cc4-a308-6cff5b7637b9

上記リンクにプロジェクトをアップしております。
ダウンロード期限を今日より3日間に設定しています。確認よろしくお願いします。
(3.6k ポイント)
プロジェクトの中身を拝見しましたが、いわゆる「秘伝のタレ」相当の、かなり酷い代物です。このままプロジェクト開発されても頓挫すると思いますので、データは整理してください。少なくとも以下の点は修正が必須です

1.
GameManager.playerManager の示すデータが滅茶苦茶です。先の質問にて改めて質問しましたが、現行プロジェクト時点で
        Debug.Log("MonobitView ID = " + monobitView.viewID);
のコードを埋め込み出力させた場合、両方の端末で、"MonobitView ID = 0"と表示されるはずです(そもそもMonobitViewIDが不正です)

Componentから逆参照すると、この示す値が「Assets/Resources/PlayerManager.prefab」を指していますが、それは本来であれば間違いであり、「Game.unity のシーンオブジェクト PlayerManager」を指す必要があるのではありませんか?

2.
最初の質問にある GameManager, PlayerManager のクラス定義が、現時点のプロジェクト内のコードと異なります。いずれのクラスも「MonobitEngine.MonoBehaviour を基底クラスとする」ように変更を加えてください。(あるいは、RPCの送受信制御のみを特定のクラスにまとめるようにしてください)

以上の少なくとも2点を修正すれば、ひとまずRPCは送受信できるようにはなりますが、コードが煩雑を極めていますので、設計レベルからコードを整理された方がよろしいかと思います。
...