异步加载PPT

This commit is contained in:
huqibin 2025-05-26 16:25:29 +08:00
parent ce1ba2a5c3
commit 7cc0785ff8
3 changed files with 110 additions and 16 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/UserSettings/EditorUserSettings.asset
/UniTask.Addressables.csproj
/UniTask.csproj
/UniTask.DOTween.csproj

View File

@ -15,9 +15,11 @@ using UnityEngine.UI;
/// <summary>
/// PPT管理类
/// </summary>
public class PPTManager : BaseManager<PPTManager>
public class PPTManager : MonoBehaviour
{
public static PPTManager Instance;
/// <summary>
///
/// </summary>
@ -40,7 +42,7 @@ public class PPTManager : BaseManager<PPTManager>
protected PPTManager()
{
Instance = this;
}
public string[] PPTName()
@ -151,6 +153,63 @@ public class PPTManager : BaseManager<PPTManager>
}
// 逐个加载每个PPT文件
//
// 添加异步加载接口
public IEnumerator LoadPPTAsync(string pptName, Action<List<Texture2D>> callback)
{
string pptPath = GetPPTPathByName(pptName);
if (!texturesDic.ContainsKey(pptName))
{
// 异步加载所有PPT页面
yield return StartCoroutine(LoadAllPPTFilesAsync(pptPath, textures => {
texturesDic.Add(pptName, textures);
callback?.Invoke(textures);
}));
}
else
{
callback?.Invoke(texturesDic[pptName]);
}
}
// 实现逐页异步加载
public IEnumerator LoadAllPPTFilesAsync(string folderPath, Action<List<Texture2D>> callback)
{
List<Texture2D> texture2Ds = new List<Texture2D>();
Presentation presentation = new Presentation(folderPath);
for (int i = 0; i < presentation.Slides.Count; i++)
{
ISlide slide = presentation.Slides[i];
var bitmap = slide.GetThumbnail(1f, 1f);
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Jpeg);
byte[] buff = ms.ToArray();
Texture2D texture2D = new Texture2D(bitmap.Width, bitmap.Height);
texture2D.LoadImage(buff);
texture2Ds.Add(texture2D);
// 每加载完一页就触发单页回调
OnSinglePageLoaded?.Invoke(texture2D);
// 每加载完一页就yield一次避免长时间阻塞
yield return null;
}
// 释放bitmap资源
bitmap.Dispose();
}
callback?.Invoke(texture2Ds);
}
// 添加单页加载事件
public event Action<Texture2D> OnSinglePageLoaded;
/// <summary>
/// 分割ppt路径名称
/// </summary>

View File

@ -29,16 +29,16 @@ public class UI_PPTForPracticePanel : BasePanel
canvasGroup.alpha = 1f;
pptFolderName = Application.streamingAssetsPath + "/PPT";
GameManager.PPTManager.PPTFiles(pptFolderName);
PPTManager.Instance.PPTFiles(pptFolderName);
string[] ppts = GameManager.PPTManager.PPTName();
string[] ppts = PPTManager.Instance.PPTName();
// 1. 提取文件名并解析数字前缀
var sortedItems = ppts
.Select(path => new
{
Path = path,
Name = GameManager.PPTManager.PathName(path),
Order = GameManager.PPTManager.ExtractLeadingNumber(GameManager.PPTManager.PathName(path)) // ÌáÈ¡Êý×Ö
Name = PPTManager.Instance.PathName(path),
Order = PPTManager.Instance.ExtractLeadingNumber(PPTManager.Instance.PathName(path)) // 提取数字
})
.OrderBy(item => item.Order) // 按数字排序
.ToList();
@ -57,23 +57,31 @@ public class UI_PPTForPracticePanel : BasePanel
Debug.LogError("PPT路径数组未初始化或为空");
return;
}
}
public override void ShowMe()
void Start()
{
// 监听单页加载完成事件
PPTManager.Instance.OnSinglePageLoaded += texture => {
// 立即显示当前加载的页面
DisplaySinglePage(texture);
};
}
public override void ShowMe()
{
base.ShowMe();
string pptBtnName = Left_content.GetChild(0).GetComponent<UI_TipsForPracticePanelPPTNameItem>().PPTName_Tog.gameObject.name;
OnClick(pptBtnName);
//await ToolManager.CanvasFadeIn(canvasGroup, 0.5f);
}
public override void HideMe()
public override void HideMe()
{
base.HideMe();
//await ToolManager.CanvasFadeOut(canvasGroup, 0.5f);
}
protected override void OnClick(string btnName)
protected override void OnClick(string btnName)
{
Debug.Log(btnName);
switch (btnName)
@ -134,15 +142,31 @@ public class UI_PPTForPracticePanel : BasePanel
default:
if (isOn)
{
List<Texture2D> textures = GameManager.PPTManager.LoadPPTItems(togglePath);
if (textures != null)
foreach (Transform child in content)//清理之前的图片
{
DisplayPPT(textures);
DestroyImmediate(child.gameObject);
}
// 启动协程异步加载PPT
StartCoroutine(LoadPPTAsync(togglePath, textures =>
{
if (textures != null)
{
DisplayPPT(textures);
}
}));
}
break;
}
}
// 添加异步加载方法
private IEnumerator LoadPPTAsync(string pptName, Action<List<Texture2D>> callback)
{
// 调用PPTManager的异步加载方法
yield return PPTManager.Instance.LoadPPTAsync(pptName, callback);
}
private void DisplayPPT(List<Texture2D> textures)
{
foreach (Transform child in content)
@ -159,5 +183,15 @@ public class UI_PPTForPracticePanel : BasePanel
}
}
private void DisplaySinglePage(Texture2D texture)
{
RawImage rawImage = pptImagePrefab.GetComponent<RawImage>();
RawImage image = Instantiate(rawImage, content);
image.texture = texture;
image.rectTransform.sizeDelta = new Vector2(1608, 940);
//foreach (Transform child in content)
//{
// DestroyImmediate(child.gameObject);
//}
}
}