🍧Photon Fusion 始めました2022/07/31に公開2025/07/163件UnityPhotonfusiontechDiscussionN42023/10/11以前教えていただいた通り、この記述を参考にして 「ネットワークオブジェクトは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も呼ばれない)でした。 o8que2023/10/11シーンオブジェクトを生成するには、NetworkRunner.StartGameの引数にSceneを指定する必要があります。 この記事の「NetworkRunnerの使用例」のコードも参考してみてください。 N42023/10/12ありがとうございます。 ついに、やりたかったこと(テキストの共有)が実現しました。 ほとんどの方には釈迦に説法と思いますが、私と似たようなレベルの人が読んだ時のために、やったことの要点をまとめます。 ・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を更新した時の処理とかに、穴がありそうなコードですが。 返信を追加
N42023/10/11以前教えていただいた通り、この記述を参考にして 「ネットワークオブジェクトは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も呼ばれない)でした。 o8que2023/10/11シーンオブジェクトを生成するには、NetworkRunner.StartGameの引数にSceneを指定する必要があります。 この記事の「NetworkRunnerの使用例」のコードも参考してみてください。 N42023/10/12ありがとうございます。 ついに、やりたかったこと(テキストの共有)が実現しました。 ほとんどの方には釈迦に説法と思いますが、私と似たようなレベルの人が読んだ時のために、やったことの要点をまとめます。 ・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を更新した時の処理とかに、穴がありそうなコードですが。 返信を追加
o8que2023/10/11シーンオブジェクトを生成するには、NetworkRunner.StartGameの引数にSceneを指定する必要があります。 この記事の「NetworkRunnerの使用例」のコードも参考してみてください。
N42023/10/12ありがとうございます。 ついに、やりたかったこと(テキストの共有)が実現しました。 ほとんどの方には釈迦に説法と思いますが、私と似たようなレベルの人が読んだ時のために、やったことの要点をまとめます。 ・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を更新した時の処理とかに、穴がありそうなコードですが。
Discussion
以前教えていただいた通り、この記述を参考にして
「ネットワークオブジェクトは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;
も追加してみましたが、やはり結果変わらず(SpawnedもFixedUpdateNetworkも呼ばれない)でした。
シーンオブジェクトを生成するには、
NetworkRunner.StartGameの引数にSceneを指定する必要があります。この記事の「NetworkRunnerの使用例」のコードも参考してみてください。
ありがとうございます。
ついに、やりたかったこと(テキストの共有)が実現しました。
ほとんどの方には釈迦に説法と思いますが、私と似たようなレベルの人が読んだ時のために、やったことの要点をまとめます。
・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有無で処理を分岐
}
}
※厳密には、2プレイヤー同時に文字入力してtempを更新した時の処理とかに、穴がありそうなコードですが。