diff --git a/.gitignore b/.gitignore index ba79769..6007d03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/UserSettings/EditorUserSettings.asset /UniTask.Addressables.csproj /UniTask.csproj /UniTask.DOTween.csproj diff --git a/Assets/Scripts/HQB/PPTManager.cs b/Assets/Scripts/HQB/PPTManager.cs index 0fc57fd..ca22f8e 100644 --- a/Assets/Scripts/HQB/PPTManager.cs +++ b/Assets/Scripts/HQB/PPTManager.cs @@ -15,9 +15,11 @@ using UnityEngine.UI; /// /// PPT管理类 /// -public class PPTManager : BaseManager +public class PPTManager : MonoBehaviour { + public static PPTManager Instance; + /// /// /// @@ -40,7 +42,7 @@ public class PPTManager : BaseManager protected PPTManager() { - + Instance = this; } public string[] PPTName() @@ -151,6 +153,63 @@ public class PPTManager : BaseManager } // 逐个加载每个PPT文件 + // + // 添加异步加载接口 + public IEnumerator LoadPPTAsync(string pptName, Action> 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> callback) + { + List texture2Ds = new List(); + 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 OnSinglePageLoaded; + /// /// 分割ppt路径名称 /// diff --git a/Assets/Scripts/Project/UI/UI_Panel/UI_PPTForPracticePanel.cs b/Assets/Scripts/Project/UI/UI_Panel/UI_PPTForPracticePanel.cs index 997e936..3733b94 100644 --- a/Assets/Scripts/Project/UI/UI_Panel/UI_PPTForPracticePanel.cs +++ b/Assets/Scripts/Project/UI/UI_Panel/UI_PPTForPracticePanel.cs @@ -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().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) @@ -120,7 +128,7 @@ public class UI_PPTForPracticePanel : BasePanel }); }); Debug.Log("ʵѵ"); - + break; } @@ -134,15 +142,31 @@ public class UI_PPTForPracticePanel : BasePanel default: if (isOn) { - List 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> callback) + { + // PPTManager첽ط + yield return PPTManager.Instance.LoadPPTAsync(pptName, callback); + } + + private void DisplayPPT(List 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 image = Instantiate(rawImage, content); + image.texture = texture; + image.rectTransform.sizeDelta = new Vector2(1608, 940); + //foreach (Transform child in content) + //{ + // DestroyImmediate(child.gameObject); + //} + } }