【发布时间】:2018-02-16 06:57:26
【问题描述】:
我正在制作/想要制作一个子弹地狱游戏,其中基本上有两个玩家,每个玩家都拥有自己相同的地图副本以获得高分。只要有玩家死亡,游戏就会结束。
我在多人游戏中完成了所有这些工作,但我的方法似乎有点老套,所以我想知道是否有更好的方法来完成这个。
起初我只使用了 unity 的网络管理器,在我的播放器 Start() 函数中,我检查了 if(!isLocal),如果是,我将启用的游戏对象设置为 false。这很好用,但就像我说的那样,感觉有点 hacky。
代码示例:
if (!isLocalPlayer) {
gameObject.SetActive(false);
return;
}
接下来我转到了统一的 LobbyManager。这是事情变得非常棘手的地方。现在在主机上,游戏加载正常,但在客户端上,只创建了一个游戏对象,并且它被设置为禁用,这让我相信它是“敌人”或不是本地玩家对象。
我慢慢发现,造成这种情况的原因是将敌人的游戏对象 active 设置为 false。如果我让它成真,那么两个玩家都会在两个屏幕上生成。我现在的解决方案是不禁用敌方玩家对象,而是禁用其上的每个组件,以免妨碍它。
再一次,这让人感觉很老套,而且可能会导致未来出现问题。这真的是最好的选择,还是我遗漏了一些明显的东西?
代码示例:
if (!isLocalPlayer) {
gameObject.GetComponent<MeshRenderer>().enabled = false;
gameObject.GetComponent<BoxCollider>().enabled = false;
gameObject.GetComponent<CharacterController>().enabled = false;
gameObject.GetComponent<PlayerController>().enabled = false;
gameObject.GetComponent<Rigidbody>().detectCollisions = false;
guns = gameObject.GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer gun in guns) {
gun.enabled = false;
}
}
提前致谢!抱歉,这篇文章太长了,希望它不是一件苦差事。
【问题讨论】:
-
如果地图很小,您可以将其复制到同一场景中,并在第二部分中生成第二个玩家。
-
我已经考虑过这个问题,但我仍然觉得它很老套。另外,它使两个客户端都进行了不必要的渲染。不过,我想这是一个比我目前的解决方案更清洁的解决方案。
标签: c# unity3d multiplayer