局域网多人场景切换
Lan Multiplayer Scene Change
我是 Unity 的新手,目前正在尝试制作 LAN 多人 RPG 游戏。
仅供参考,我遵循了官方统一局域网多人游戏指南,一切顺利。
https://unity3d.com/learn/tutorials/topics/multiplayer-networking/introduction-simple-multiplayer-example
到目前为止,我已经让玩家载入并且他们可以移动了。我在下面编写了以下代码(在 void 更新例程下),这样当玩家移动时,它将每 1 秒随机生成一个介于 1 和 50 之间的数字,如果该数字是 25,我们将随机 "encountered an enemy"。当任何玩家遇到敌人时,我做到了,所以网络上的每个人都会去 "battle scene".
if (Input.GetKey("up") || Input.GetKey("down") || Input.GetKey("left") || Input.GetKey("right"))
{
if (Time.time > NextActionTime)
{
NextActionTime = Time.time + Period;
EnemyEncounter = Random.Range(1, 50);
if (EnemyEncounter == 25)
{
NetworkManager.singleton.ServerChangeScene("Scene2");
}
}
}
上面的代码工作正常,但我不确定如何只将某些玩家加载到战斗场景中,而不是加载所有人。
例如:
玩家在Hosting/Finding LAN 游戏前输入名字
玩家 1 = 乔
玩家 2 = Bob
玩家 3 = 比利
玩家 4 = 吉姆
在预设 label/text 上加载其中的文本 "Joe,Billy"。现在,当任何玩家发现遭遇战时,我只想将玩家姓名 "Joe" 和 "Billy" 加载到下一个场景,而其他玩家则不会。
这可能吗?任何形式的帮助将不胜感激。
谢谢大家
我尝试了不同的想法,得到了 2 种不同的方法:
1-正如我在评论中所说,尝试 嵌套 lobbyManagers
2-"Fake"大厅场景
1.Nested大厅
概念:
第一场景,MainLobby,4人进入,进入第二场景
第二场景,MainGame+SecondLobby,第一场景有4个玩家,现在有2个想去第三场景,所以又用SecondLobby去匹配。
- 第三场,SecondGame.
如果我们谈论的是性能,我认为这是最好的方法,但这是一个复杂的原因:
-Unity NetworkLobby实际使用的是单例模式,单例部分需要重新编码
-LobbyManager 是使用 DontDestroyOnLoad 构建的,因此您在下一个场景中向另一个大厅收费。
-我真的不知道你能不能从第三个场景回到第二个场景:S
2.Fake 场景
嗯,欢迎来到"dirty tricks",第二个概念是:
第一场景,MainLobby,4人进入,进入第二场景
第二场景,MainGame,第一场景有4个玩家,现在有2个想去第三场景
- 第三场,SecondGame.
但是我们没有再次"matchmake",而是将场景添加为附加场景,但在不同的坐标上,并将想要战斗的 2 个玩家移动到第三个场景。所以玩家会认为他们在不同的场景中,但实际上他们只是在移动。想到就记住:
-也许你真的不需要使用加法场景,只是在同一个场景的不同坐标上构建。 (https://docs.unity3d.com/ScriptReference/SceneManagement.LoadSceneMode.Additive.html)
-认为他们仍然是同一个场景中的 4 个联网玩家,所以也许你想要 "disable" 一些网络消息,只影响某些 "scenes" 上的某些玩家。 (https://docs.unity3d.com/ScriptReference/Networking.NetworkClient.Send.html)
但是,如果您实现了一些其他方法,请告诉我,它确实提供了有趣的游戏设计内容! :D
我是 Unity 的新手,目前正在尝试制作 LAN 多人 RPG 游戏。
仅供参考,我遵循了官方统一局域网多人游戏指南,一切顺利。 https://unity3d.com/learn/tutorials/topics/multiplayer-networking/introduction-simple-multiplayer-example
到目前为止,我已经让玩家载入并且他们可以移动了。我在下面编写了以下代码(在 void 更新例程下),这样当玩家移动时,它将每 1 秒随机生成一个介于 1 和 50 之间的数字,如果该数字是 25,我们将随机 "encountered an enemy"。当任何玩家遇到敌人时,我做到了,所以网络上的每个人都会去 "battle scene".
if (Input.GetKey("up") || Input.GetKey("down") || Input.GetKey("left") || Input.GetKey("right"))
{
if (Time.time > NextActionTime)
{
NextActionTime = Time.time + Period;
EnemyEncounter = Random.Range(1, 50);
if (EnemyEncounter == 25)
{
NetworkManager.singleton.ServerChangeScene("Scene2");
}
}
}
上面的代码工作正常,但我不确定如何只将某些玩家加载到战斗场景中,而不是加载所有人。
例如:
玩家在Hosting/Finding LAN 游戏前输入名字
玩家 1 = 乔
玩家 2 = Bob
玩家 3 = 比利
玩家 4 = 吉姆
在预设 label/text 上加载其中的文本 "Joe,Billy"。现在,当任何玩家发现遭遇战时,我只想将玩家姓名 "Joe" 和 "Billy" 加载到下一个场景,而其他玩家则不会。
这可能吗?任何形式的帮助将不胜感激。
谢谢大家
我尝试了不同的想法,得到了 2 种不同的方法:
1-正如我在评论中所说,尝试 嵌套 lobbyManagers
2-"Fake"大厅场景
1.Nested大厅
概念:
第一场景,MainLobby,4人进入,进入第二场景
第二场景,MainGame+SecondLobby,第一场景有4个玩家,现在有2个想去第三场景,所以又用SecondLobby去匹配。
- 第三场,SecondGame.
如果我们谈论的是性能,我认为这是最好的方法,但这是一个复杂的原因:
-Unity NetworkLobby实际使用的是单例模式,单例部分需要重新编码
-LobbyManager 是使用 DontDestroyOnLoad 构建的,因此您在下一个场景中向另一个大厅收费。
-我真的不知道你能不能从第三个场景回到第二个场景:S
2.Fake 场景
嗯,欢迎来到"dirty tricks",第二个概念是:
第一场景,MainLobby,4人进入,进入第二场景
第二场景,MainGame,第一场景有4个玩家,现在有2个想去第三场景
- 第三场,SecondGame.
但是我们没有再次"matchmake",而是将场景添加为附加场景,但在不同的坐标上,并将想要战斗的 2 个玩家移动到第三个场景。所以玩家会认为他们在不同的场景中,但实际上他们只是在移动。想到就记住:
-也许你真的不需要使用加法场景,只是在同一个场景的不同坐标上构建。 (https://docs.unity3d.com/ScriptReference/SceneManagement.LoadSceneMode.Additive.html)
-认为他们仍然是同一个场景中的 4 个联网玩家,所以也许你想要 "disable" 一些网络消息,只影响某些 "scenes" 上的某些玩家。 (https://docs.unity3d.com/ScriptReference/Networking.NetworkClient.Send.html)
但是,如果您实现了一些其他方法,请告诉我,它确实提供了有趣的游戏设计内容! :D