0 支持
(140 ポイント)
質問です。

MonobitNetwork.Instantiate するプレファブ内、複数箇所の Transform を同期したい場合はどのように設定すれば良いのでしょうか?

今、あるキャラクタを収納したプレファブがありまして、このルートには、MonobitView、MonobitTransformView、MonobitAnimatorView がコンポーネントとして貼ってあって、このMonobitViewのObserved Component Registration Listに、このMonobitTransformViewとMonobitAnimatorViewコンポーネントを登録することでキャラクタの位置、向き、アニメーションの同期ができています。

このプレファブに、適当に玉か何かのオブジェクト(「X」とします)を要素として追加しました。X は、MonobitNetwork.Instantiateしたクライアント上で、例えばコントローラ操作で動かします。この動かした結果を、同期している他のクライアントにある X に同期したいのです。

X を、ルートにあるMonobitViewのObserved Component Registration Listに追加すれば良いかと思ってやってみたのですが、これでは同期は動かないようです。(MonobitNetwork.Instantiateはうまくいきます)

次に、XにもMonobitViewを追加、これのObserved Component Registration ListにXのTransformを追加してみましたが、MonobitNetwork.Instantiateが動作しなくなりました(特にエラーメッセージなどはなし)。

Xに追加したMonobitViewをルートに移動しても同じく、MonobitNetwork.Instantiateが動作しません。

ご教示いただければ幸いです。よろしくお願いします。

回答 2

+1 支持
(4k ポイント)
編集
多少面倒な作業が入りますが、
http://monobitengine.com/doc/mun/contents/Tutorial/AddSynchronizedComponent.htm
の手順と同じように

1. ルートオブジェクトにある MonobitView を X にドラッグ&ドロップして移動。
2. X に対し MonobitTransformView, MonobitAnimatorView を追加する。
3. X に移動した MonobitView の Observed Component Registration List に X の MonobitTransformView, MonobitAnimatorView を追加する。
4. X にある MonobitView をルートオブジェクトにドラッグ&ドロップして移動。

で、ルートオブジェクトに MonobitView があり、その Observed Component Registration List 内に
・ルートオブジェクトの MonobitTransformView
・ルートオブジェクトの MonobitAnimatorView
・X の MonobitTransformView
・X の MonobitAnimatorView
が含まれている状態にします。

さらにこの上で
http://monobitengine.com/doc/mun/contents/Tutorial/ChangeMonobitTransformView.htm
にある手順で Assets/Monobit Unity Networking/Plugins/MonobitNetwork/MonobitTransformView.cs の Awake メソッドを上記ページ内の内容と同一に書き換えれば動作すると思います。
+1 支持
(1.4k ポイント)
編集

このプレファブに、適当に玉か何かのオブジェクト(「X」とします)を要素として追加しました。X は、MonobitNetwork.Instantiateしたクライアント上で、例えばコントローラ操作で動かします。

であれば、オブジェクト X は ルートとは異なるタイミングで生成され、異なる挙動を行なうものと思われますので、階層を別にして各々 MonobitView + MonobitTransformView で管理したほうが良いと思うのですが、そうしない理由は何かあるのでしょうか?

あえてそうせず、 オブジェクト X を ルート内に階層を組んで動かすのを強制するのであれば、以下のようなスクリプトをルートオブジェクトに組み込み、同オブジェクトの MonobitView の Observed Component List に加えるのが手早いと思います

using UnityEngine;
using System.Collections;
using MonobitEngine;

public class Move : MonobitEngine.MonoBehaviour {

    // オブジェクトの同期コールバックメソッド
    public void OnMonobitSerializeView(MonobitStream stream, MonobitMessageInfo info)
    {
        // オブジェクトXを取得する
        Transform[] children = gameObject.GetComponentsInChildren<Transform>();
        GameObject x_Obj = null;
        foreach (Transform obj in children)
        {
            // "X"という名前のオブジェクトであれば x_Obj に格納
            if(obj.name == "X")
            {
                x_Obj = obj.gameObject;
                break;
            }
        }

        // オブジェクトが取得できなければスルー
        if( x_Obj == null ) { return; }

        // オブジェクトデータの同期処理
        if (stream.isWriting)
        {
            // 送信中の制御
            stream.Enqueue(x_Obj.transform.localPosition); // 位置
            stream.Enqueue(x_Obj.transform.localRotation); // 角度
            stream.Enqueue(x_Obj.transform.localScale); // 倍率
        }
        else
        {
            // 受信中の制御
            x_Obj.transform.localPosition = (Vector3)stream.Dequeue(); // 位置
            x_Obj.transform.localRotation = (Quaternion)stream.Dequeue(); // 角度
            x_Obj.transform.localScale    = (Vector3)stream.Dequeue(); // 倍率
        }
    }
}
 

(140 ポイント)
みなさんありがとうございます。結局、X を独立階層オブジェクトとして解決できました。助かりました!
...