以下の打開策を講じれば、実質的に望み通りの結果が得られるはずです。
■ 打開策
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」に設定したうえで呼び出す。