我正在Unity中创建一个竞技场风格的战斗游戏,我遇到了重生球员的问题。这是它现在的工作方式。
当一名玩家被杀时,它被放入一个被重生的被杀死的玩家列表中,并且它的玩家对象被摧毁。然后游戏循环通过杀死的玩家列表并选择随机可用的生成点然后在那里重新生成玩家。可用的生成点是任何生成点,不是由玩家在其生成区域内触发的。
当2名玩家同时死亡,或者至少非常接近同一时间并且随机选择的生成点最终相同时,问题就出现了,因为它没有足够的时间来处理触发。当发生这种情况时,所有的统一崩溃,我必须完全重启。
我认为为了解决这个问题,我需要让Unity不要同时产生它们,但我认为这可以通过循环遍历列表来解决。我该如何实际产生2个同时更安全地死亡的玩家呢?
答案 0 :(得分:0)
这是经典队列示例,在多线程应用程序中也会发生同样的事情。你可以在这做两件事:
在第一种方法中,您可以在播放器脚本之外创建一个脚本,例如在它自己的竞技场中,并在那里创建一个方法来选择下一个产卵点。这可以是序数而不是随机的,每个玩家在死亡时都会要求脚本为其选择下一个产卵点,并且在一个点上没有冲突。
在第二种方法中,每个玩家将拥有它自己的产卵点,例如与竞技场中定义的产卵点的偏移。例如,玩家1将产生零偏移并在产卵点产生,然后玩家2将产生偏移1,这将产生产卵点1个单位。
如果球员数量有限,我更喜欢第一种方法。如果你有很多玩家,那么队列可能会很麻烦。
希望有所帮助:)
答案 1 :(得分:0)
我发现了我的问题,并且我能够随机生成积分。这个问题显然与2名同时死亡的玩家有关,而这与玩家在生成点时死亡的情况有很大关系。当发生这种情况时,它不会运行OnTriggerLeave()方法,因此即使没有任何东西也不会被视为可用的spawnpoint。
我通过让每个spawnpoint保存一个触发它的所有游戏对象的列表来修复它,这些游戏对象会随着玩家进入并退出该空间而改变。然后,当玩家被杀死时,它将检查每个产生点的列表以查看它是否包含玩家的游戏对象。如果它找到匹配,那么我取消触发spawnpoint并显示为可用。
我要做的更好的方法是检查列表以查看spawnpoint列表中是否有任何游戏对象,并且只有在没有时才可用。因为当前的方式并不能解释其他对象也会引发这一点。