目的:很多时候Unity同时加载例如400张图片并显示的时候会卡顿。但是使用了协程和异步加载如下列代码,可以解决卡顿问题:
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class ImageLoader : MonoBehaviour
{
public Button startButton;
public Transform parentTransform; // 用于放置创建的对象的父对象
private string[] imagePaths;
void Start()
{
// 获取 StreamingAssets 文件夹路径
string streamingAssetsPath = Application.streamingAssetsPath;
// 获取所有 PNG 图片的路径
imagePaths = Directory.GetFiles(streamingAssetsPath, "*.png");
// 给按钮添加点击事件监听器
startButton.onClick.AddListener(StartLoadingImages);
}
void StartLoadingImages()
{
// 启动协程来异步加载图片
StartCoroutine(LoadImagesCoroutine());
}
IEnumerator LoadImagesCoroutine()
{
for (int i = 0; i < imagePaths.Length; i++)
{
string imagePath = imagePaths[i];
// 异步加载图片
yield return StartCoroutine(LoadImageAsync(imagePath));
}
}
IEnumerator LoadImageAsync(string path)
{
// 创建一个 UnityWebRequest 来加载图片
using (UnityEngine.Networking.UnityWebRequest uwr = UnityEngine.Networking.UnityWebRequestTexture.GetTexture(path))
{
// 发送请求并等待响应
yield return uwr.SendWebRequest();
if (uwr.result == UnityEngine.Networking.UnityWebRequest.Result.Success)
{
// 获取加载的纹理
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
// 创建一个新的 GameObject
GameObject imageObject = new GameObject("LoadedImage");
imageObject.transform.SetParent(parentTransform, false);
// 添加 RectTransform 组件
RectTransform rectTransform = imageObject.AddComponent<RectTransform>();
rectTransform.sizeDelta = new Vector2(texture.width, texture.height);
// 添加 RawImage 组件
RawImage rawImage = imageObject.AddComponent<RawImage>();
rawImage.texture = texture;
}
else
{
Debug.LogError("Error loading image: " + uwr.error);
}
}
}
}
使用步骤:
在 Unity 里创建一个新的 C# 脚本,将上述代码复制进去并保存。
在场景中添加一个 Button 和一个空的 GameObject 作为父对象(例如命名为 ImageParent)。
把脚本挂载到一个空的 GameObject 上。
在 Inspector 面板中,将 startButton 字段指定为你创建的按钮,将 parentTransform 字段指定为你创建的父对象。
把要加载的 PNG 图片放置在 StreamingAssets 文件夹下。
代码解释:
新增了 parentTransform 公共字段,用于指定创建的图片对象的父对象。
在 LoadImageAsync 方法里,当图片加载成功后,创建一个新的 GameObject,并为其添加 RectTransform 和 RawImage 组件。
把加载的纹理赋值给 RawImage 的 texture 属性,从而在界面上显示图片。