遇到的问题,如标题所示,所以写了如下模块。
模块功能就是初始化时候,加载零散/文件夹的物体,代码如下:
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
文件夹部分可以根据需求自行处理。
加载效果如下: