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