Unity(C#)销毁所有平台后加载下一关的计数问题求助
问题分析与解决方法
问题根源
你把DestroyedPlatforms放在bullet脚本里是错误的——每颗子弹都是独立的游戏对象,这个变量只属于当前子弹实例。销毁平台时只有当前子弹的DestroyedPlatforms加1,而你在Inspector里看到的是某一颗子弹的数值,其他子弹的这个变量还是0,完全没法统一统计所有平台的销毁总数。
解决方案
1. 创建全局关卡管理脚本(GameManager)
新建一个C#脚本GameManager,用单例模式实现全局访问,专门用来统计平台销毁数量和处理关卡逻辑:
using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { // 全局唯一的单例实例 public static GameManager Instance; public int totalPlatforms; // 当前关卡的总平台数,可手动在Inspector设置 public int destroyedPlatforms; // 已销毁的平台数 private void Awake() { // 确保单例唯一 if (Instance == null) { Instance = this; } else { Destroy(gameObject); return; } // 自动获取当前场景所有带platform标签的物体数量(替代手动设置) totalPlatforms = GameObject.FindGameObjectsWithTag("platform").Length; } // 供外部调用的计数方法 public void AddDestroyedPlatform() { destroyedPlatforms++; CheckLoadNextLevel(); } // 检查是否满足下一关条件 private void CheckLoadNextLevel() { if (destroyedPlatforms >= totalPlatforms) { // 加载下一关,需确保所有关卡已添加到Build Settings int currentSceneIndex = SceneManager.GetActiveScene().buildIndex; SceneManager.LoadScene(currentSceneIndex + 1); // 重置计数,避免影响下一关 destroyedPlatforms = 0; } } }
把这个脚本挂载到一个空物体(比如命名为GameManager)上,放到你的关卡场景中。
2. 修改bullet脚本
移除自身的DestroyedPlatforms变量,触发碰撞时调用GameManager的计数方法:
using UnityEngine; public class bullet : MonoBehaviour { public float speed = 5f; public Rigidbody2D rb; void Start() { rb.velocity = transform.up * speed; } void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("platform")) { Destroy(other.gameObject); // 调用全局管理器的计数方法 GameManager.Instance.AddDestroyedPlatform(); // 销毁当前子弹,避免继续飞行 Destroy(gameObject); } } }
额外注意事项
- 确保所有平台都正确设置了
platform标签,否则无法被检测到。 - 如果场景中有动态生成的平台,需要在生成时手动调用
GameManager.Instance.totalPlatforms++来更新总数。 - 记得在Unity的Build Settings中把所有关卡场景添加进去,否则加载下一关会报错。
内容的提问来源于stack exchange,提问作者jlaw
相关产品推荐
相关产品推荐

