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

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

加载效果如下:

相关推荐
金銀銅鐵4 天前
[Python] 模 n 乘法的逆元计算器
python·数学·游戏
金銀銅鐵5 天前
借助 Pygame 探索最大公约数的规律
python·数学·游戏
nujnewnehc9 天前
不会 py, 用 ai 写了个游戏辅助的感受
人工智能·游戏
jump_jump10 天前
为了重玩金庸群侠传,我研究了一下 Ruffle 怎么复活 Flash
游戏·rust·github
XIAOHEZIcode11 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
Aloys_Code12 天前
逆向一个被遗忘的DVD游戏格式:从DES加密到Rust模拟器
游戏·模拟器·retroarch·复古游戏·native32·sunplus·赤刃·钢铁风暴
金銀銅鐵12 天前
用 Python 实现 Take-Away 游戏
python·游戏
金銀銅鐵13 天前
用 Pygame 实现 15 puzzle
python·数学·游戏
qq_3692243315 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误
阿米亚波15 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm