You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:52:41