Unity预加载:减少游戏中首次加载资源时的卡顿

遇到的问题,如标题所示,所以写了如下模块。

模块功能就是初始化时候,加载零散/文件夹的物体,代码如下:

cs 复制代码
 #region 启动预加载模块
 /// <summary> 预加载间隔(分帧防卡顿) </summary>
 private float _loadInterval = 0.03f;
 /// <summary> 加载进度文本 </summary>
 private Text _loadTxt;
 /// <summary> 当前加载进度 </summary>
 private int _currentLoadCount;
 /// <summary> 总需要加载的资源数量 </summary>
 private int _totalLoadCount;

 /// <summary> 启动预加载(入口函数,在Start/Awake中调用) </summary>
 public void StartPreload()
 {
     _loadTxt = transform.Find("loadTxt").GetComponent<Text>();
     _currentLoadCount = 0;

     // 初始化【单个预制体路径】列表
     List<string> preloadPaths = new List<string>();
     preloadPaths.Add($"KKK");
       

     // 初始化【文件夹路径】列表
     List<string> folderPaths = new List<string> {  };
     folderPaths.Add("Prefabs/XXX");

     // 统计总预加载数量
     _totalLoadCount = preloadPaths.Count;
     foreach (var folder in folderPaths)
     {
         var prefabs = Resources.LoadAll<GameObject>(folder);
         _totalLoadCount += prefabs.Length;
     }

     UpdateLoadText();
     // 串行执行:先加载单个路径,完成后再加载文件夹
     StartCoroutine(PreloadAllCoroutine(preloadPaths, folderPaths));
 }

 /// <summary> 统一预加载协程(串行:单个路径 → 文件夹) </summary>
 private IEnumerator PreloadAllCoroutine(List<string> preloadPaths, List<string> folderPaths)
 {
     Debug.Log($"=== 预加载启动 | 总资源数:{_totalLoadCount} ===");

     // 第一步:加载零散预制体路径
     yield return PreloadSinglePaths(preloadPaths);
     // 第二步:加载文件夹内所有预制体
     yield return PreloadFolders(folderPaths);

     // 全部加载完成
     _loadTxt.text = "资源加载完毕";
     Debug.Log("=== 所有资源预加载完成 ===");

     //进入游戏
 }

 /// <summary> 预加载:单个路径列表 </summary>
 private IEnumerator PreloadSinglePaths(List<string> paths)
 {
     foreach (string path in paths)
     {
         // 加载资源
         GameObject prefab = Resources.Load<GameObject>(path);
         // 实例化触发初始化
         GameObject obj = Instantiate(prefab);
         obj.SetActive(false);
         obj.hideFlags = HideFlags.HideAndDontSave;

         yield return null;
         Destroy(obj);

         // 更新进度
         _currentLoadCount++;
         UpdateLoadText();
         Debug.Log($"预加载成功:{path}");

         yield return new WaitForSeconds(_loadInterval);
     }
 }

 /// <summary> 预加载:多个文件夹 </summary>
 private IEnumerator PreloadFolders(List<string> folderPaths)
 {
     foreach (string folderPath in folderPaths)
     {
         // 加载文件夹下所有预制体
         GameObject[] prefabs = Resources.LoadAll<GameObject>(folderPath);
         foreach (GameObject prefab in prefabs)
         {
             bool loadSuccess = false;
             GameObject tempObj = null;

             // 实例化
             try
             {
                 tempObj = Instantiate(prefab);
                 tempObj.SetActive(false);
                 tempObj.hideFlags = HideFlags.HideAndDontSave;
                 loadSuccess = true;
             }
             catch (System.Exception e)
             {
                 Debug.LogError($"预加载失败 [{prefab.name}]:{e.Message}");
             }

             // 初始化+销毁
             if (loadSuccess)
             {
                 yield return null;
                 Destroy(tempObj);
                 Debug.Log($"预加载成功:{prefab.name}");
             }

             // 更新进度
             _currentLoadCount++;
             UpdateLoadText();
             yield return new WaitForSeconds(_loadInterval);
         }
     }
 }

 /// <summary> 更新加载进度文本 </summary>
 private void UpdateLoadText()
 {
     _loadTxt.text = $"资源加载进度  {_currentLoadCount}/{_totalLoadCount}";
 }
 #endregion

文件夹部分可以根据需求自行处理。

加载效果如下:

相关推荐
猎嘤一号8 小时前
【2026 最新】Windows 11 右键菜单还原为 Windows 10 经典样式:一条命令、原理、回退与新版说明
windows·python
qq_369224339 小时前
ddraw.dll丢失是什么原因引起的?老游戏运行报错,多种可行修复手段汇总分享
windows·游戏·dll·dll修复·dll丢失·dll错误
BR_D9 小时前
Windows 下 nvm 安装与完整使用教程
windows·nodejs·nvm
xiaohe060110 小时前
🎮 豆包完胜 DeepSeek ?!零玩家竞技场,AI Agent 专属对弈!
游戏·llm·agent
还是大剑师兰特11 小时前
Maven‑3.9.16 Windows 下载+安装+环境变量完整教程
java·windows·maven
️学习的小王12 小时前
Windows Claude Code 接入 Playwright‑MCP,调用本机Edge浏览器(避坑完整教程)
前端·windows·edge
微三云生态系统架构师-彭丹13 小时前
任务卷轴积分系统架构设计:从任务状态机到合规风控的完整实现
unity·系统架构·游戏引擎
吴声子夜歌14 小时前
Guava——基本工具(一)
windows·guava
坐吃山猪14 小时前
JDK 8 到 JDK 21 新特性知识要点
java·开发语言·windows
XR技术研习社14 小时前
从 PICO 文档看未来短期内的 Unity 版本选择
unity·游戏引擎·xr·vr