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

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

加载效果如下:

相关推荐
tealcwu5 小时前
【Unity高级】Unity URP:构建同时支持 2D 与 3D 场景的项目完全指南
3d·unity·游戏引擎
中二骚年10 小时前
Windows 安全中心 / 防火墙故障,calc和Microsoft Store,终端(管理员)无法正常打开。 原因 + 修复方案
windows·安全·microsoft
淡海水10 小时前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
万联WANFLOW11 小时前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
AlanAshley12 小时前
Windows 中导致延迟的软硬件及协议比重
windows
yuezhilangniao12 小时前
win10中文 以及 PowerShell 开发日常
windows·powershell
小小数媒成员12 小时前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
暴走约伯14 小时前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
小小数媒成员15 小时前
Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解
unity·游戏引擎
tealcwu15 小时前
【Unity基础】Unity输入与Time.deltaTime的使用原则
unity·游戏引擎