🍧

Photon Fusion 始めました

に公開
3

Discussion

N4N4

以前教えていただいた通り、この記述を参考にして

「ネットワークオブジェクトはRunner.Spawn()で生成しても良いですが、あらかじめシーン上に配置したネットワークオブジェクトは、ホストがシーンを読み込んだ際にシーンオブジェクト(Network Scene Object)として自動的に生成されるため、シーンに一つ(または決まった数)しかないネットワークオブジェクトを生成したい時に便利です。」

で、やりたいこと(複数プレイヤー間での、ネットワークプロパティとしての同一変数の共有)をしようとしています。

しかし、このページの「PlayPhaseManager」の実装ほぼそのままで
・シーン上にカラのゲームオブジェクト(TestObject)を作成し
・TestObjectに、以下のNetworkBehaviorを記述したスクリプトを追加し
public class Test : NetworkBehaviour
{
[Networked]
NetworkString<_16> NetString { get; set; }

・TestObjectにNetwork Objectも追加

したのですが、上記TestスクリプトのFixedUpdateNetwork()(と、Spawned()も…これは必要ありませんが)が実行されている形跡がありません。

なにかまだ、足りない手順があるのでしょうか?

なお、「共有モードのチュートリアル」を参考にして、上記public class Testに
[SerializeField]
private NetworkRunner networkRunnerPrefab;←記事にあるnetworkRunnnerPrefabをアタッチ
private NetworkRunner networkRunner;

private async void Start()
{
    networkRunner = Instantiate(networkRunnerPrefab);
    var result = await networkRunner.StartGame(new StartGameArgs
    {
        GameMode = GameMode.Shared,
        SceneManager = networkRunner.GetComponent<NetworkSceneManagerDefault>()
    });

    if (result.Ok)
    {
        Debug.Log("成功!");
    }
    else
    {
        Debug.Log("失敗!");
    }
}

も追加してみましたが、やはり結果変わらず(SpawnedもFixedUpdateNetworkも呼ばれない)でした。

o8queo8que

シーンオブジェクトを生成するには、NetworkRunner.StartGameの引数にSceneを指定する必要があります。
この記事の「NetworkRunnerの使用例」のコードも参考してみてください。

N4N4

ありがとうございます。
ついに、やりたかったこと(テキストの共有)が実現しました。

ほとんどの方には釈迦に説法と思いますが、私と似たようなレベルの人が読んだ時のために、やったことの要点をまとめます。

・StartGameの引数にSceneを追加
var result = await networkRunner.StartGame(new StartGameArgs
{
GameMode = GameMode.Shared,
Scene = SceneManager.GetActiveScene().buildIndex,
SceneManager = networkRunner.GetComponent<NetworkSceneManagerDefault>()
});
(これでFixedUpdateNetworkが実行されるようになる)

・Testクラスに以下の変数とRPCを定義
/個々のプレイヤーが入力した文字を、FixedUpdateNetwork実行まで保管
個々のプレイヤーがそれぞれ保持する
/
static String temp:

// 2プレイヤー間の共有文字列
[Networked]
NetworkString<_16> NetString { get; set; }

// StateAuthorityを持たない側のプレイヤー側(起動タイミングが遅かった側と思われる)が、StateAuthority側に、自分のtempの中身を送信する
[Rpc(sources: RpcSources.All, targets: RpcTargets.StateAuthority)]
public void RPC_SetTemp(String inputTemp)
{
temp = inputTemp;
}

・FixedUpdateNetworkで、tempが空文字でない(=NetStringに書き込みたい内容がある)ときは、
StateAuthority有無で処理を分岐

public override void FixedUpdateNetwork()
{
    if (temp != "")
    {
        if (Object.HasStateAuthority)
        {
            this.NetString += " " + temp;//直接NetStringに書き足す
        }
        else
        {
            RPC_SetTemp(temp);//StateAuthority側のtempを更新し、自分のtemp(書きたい内容)をNetStringに書き足してもらう
        }
        temp = "";

}
}
※厳密には、2プレイヤー同時に文字入力してtempを更新した時の処理とかに、穴がありそうなコードですが。