异步加载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.Addressables.csproj
/UniTask.csproj /UniTask.csproj
/UniTask.DOTween.csproj /UniTask.DOTween.csproj

View File

@ -15,9 +15,11 @@ using UnityEngine.UI;
/// <summary> /// <summary>
/// PPT管理类 /// PPT管理类
/// </summary> /// </summary>
public class PPTManager : BaseManager<PPTManager> public class PPTManager : MonoBehaviour
{ {
public static PPTManager Instance;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -40,7 +42,7 @@ public class PPTManager : BaseManager<PPTManager>
protected PPTManager() protected PPTManager()
{ {
Instance = this;
} }
public string[] PPTName() public string[] PPTName()
@ -151,6 +153,63 @@ public class PPTManager : BaseManager<PPTManager>
} }
// 逐个加载每个PPT文件 // 逐个加载每个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> /// <summary>
/// 分割ppt路径名称 /// 分割ppt路径名称
/// </summary> /// </summary>

View File

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