异步加载PPT
This commit is contained in:
parent
ce1ba2a5c3
commit
7cc0785ff8
|
|
@ -1,3 +1,4 @@
|
|||
/UserSettings/EditorUserSettings.asset
|
||||
/UniTask.Addressables.csproj
|
||||
/UniTask.csproj
|
||||
/UniTask.DOTween.csproj
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue