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

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

加载效果如下:

相关推荐
mxwin1 天前
Unity URP 中的法线生成完全指南
unity·游戏引擎
游乐码1 天前
Unity基础(十五)LineRender画线功能
unity·游戏引擎
小贺儿开发1 天前
Unity3D 图片循环查看器
unity·工具·图片·列表·循环·ugui·互动
sun0077001 天前
SniffMaster(读取苹果的ats文件) 和 wireshark
windows
漫友也是程序猿1 天前
ddraw.dll异常排查:旧游戏图形接口、兼容性模式和DirectX组件检查
程序人生·游戏·电脑
caimouse1 天前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
PHP隔壁老王邻居1 天前
windows菜单搜索栏无法显示历史记录或者无法使用修复方法
windows
道一231 天前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
半条-咸鱼1 天前
【INACCESSIBLE_BOOT_DEVICE】安装 Config Tool 后 Windows 蓝屏,最终通过 VMware 虚拟机解决
windows·stm32·vmware·芯片
人工小情绪1 天前
Windows 安装 Codex 桌面版,并用 CC Switch 管理配置
人工智能·windows·codex·cc switch