Unity场景已加载后如何实现迷宫生成进度条
实现迷宫生成进度条的方案
核心问题是你当前的LabyrinthCreateAllCells是同步执行的,整个单元格创建过程会一次性跑完,协程里的yield return null要等所有单元格创建完才会执行,导致中间没法更新进度。解决思路是把单元格创建拆成分帧执行,让协程每帧都能回到主线程更新UI。
步骤1:重构迷宫生成的协程逻辑
首先在你的迷宫类里添加一个公开的进度变量(或者用事件通知,更高效),然后把单元格创建的循环拆成分步执行:
public class Labyrinth : MonoBehaviour { public float CreationProgress { get; private set; } // 公开的进度变量(范围0~1) // 也可以用事件避免UI每帧查询,性能更优: // public event Action<float> OnProgressUpdated; private int rows; private int cols; public IEnumerator CreateLabyrinth() { int totalCells = rows * cols; int createdCells = 0; CreationProgress = 0f; // 分步创建所有单元格 for (int x = 0; x < cols; x++) { for (int y = 0; y < rows; y++) { // 替换成你原来创建单个单元格的逻辑 CreateSingleCell(x, y); createdCells++; // 更新进度 CreationProgress = (float)createdCells / totalCells; // 如果用事件,触发UI更新通知: // OnProgressUpdated?.Invoke(CreationProgress); // 每创建10个单元格暂停一帧,让UI更新(可根据性能调整这个数值) if (createdCells % 10 == 0) { yield return null; } } } // 所有单元格创建完成后执行迷宫构建 BuildLabyrinth(); } // 单个单元格的创建逻辑 private void CreateSingleCell(int x, int y) { // 你的单元格初始化/实例化代码 } private void BuildLabyrinth() { // 原有的迷宫构建逻辑 } }
如果你的LabyrinthCreateAllCells是单独的方法,把它改成协程即可:
public IEnumerator LabyrinthCreateAllCells() { int totalCells = rows * cols; int createdCells = 0; CreationProgress = 0f; // 原有的单元格创建循环 for (...) { // 创建单元格逻辑 createdCells++; CreationProgress = (float)createdCells / totalCells; // OnProgressUpdated?.Invoke(CreationProgress); if (createdCells % 10 == 0) { yield return null; } } } // 同步修改CreateLabyrinth: public IEnumerator CreateLabyrinth() { yield return LabyrinthCreateAllCells(); BuildLabyrinth(); }
步骤2:UI进度条更新
在你的UI脚本里,选择两种方式之一更新进度条:
方式1:每帧查询进度(简单直接)
用Unity的Slider组件作为进度条,在Update里实时读取进度:
public class ProgressBarUI : MonoBehaviour { public Slider progressBar; public Labyrinth labyrinth; void Update() { if (labyrinth != null) { progressBar.fillAmount = labyrinth.CreationProgress; } } }
方式2:监听事件(性能更优)
不用每帧查询,通过事件回调更新:
public class ProgressBarUI : MonoBehaviour { public Slider progressBar; public Labyrinth labyrinth; void OnEnable() { if (labyrinth != null) { labyrinth.OnProgressUpdated += UpdateProgress; } } void OnDisable() { if (labyrinth != null) { labyrinth.OnProgressUpdated -= UpdateProgress; } } void UpdateProgress(float progress) { progressBar.fillAmount = progress; } }
注意事项
- 调整每帧创建的单元格数量(代码里的
10):如果数值太大,进度条会跳变;太小则生成耗时更长,根据你的项目性能情况调整。 - 进度条的
Slider组件要设置最小值为0,最大值为1,这样fillAmount可以直接对应进度比例。
内容的提问来源于stack exchange,提问作者repinSlun
相关产品推荐
相关产品推荐

