From 9a9645dfec2616effae19f4fd71c37028a3813c5 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Fri, 27 Mar 2026 15:42:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20ResourceSystem=20?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E5=8A=A0=E8=BD=BD=E7=B2=BE=E7=81=B5=E4=B8=8E?= =?UTF-8?q?=E5=85=B3=E5=8D=A1=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- .../Scripts/FixSystem/Memory/MemoryProcess.cs | 21 ++++++--- .../AnalysisSystem/AnalysisModeYarnCommand.cs | 28 ++++++------ .../Scripts/MiniGame/Peipei/Eye/EyeSystem.cs | 19 ++++---- .../Scripts/SceneManagement/SpriteShowcase.cs | 43 +++++++++++++------ Assets/Scripts/UI/Panel/PlayToolPanel.cs | 38 ++++++++++++++-- 5 files changed, 107 insertions(+), 42 deletions(-) diff --git a/Assets/Scripts/FixSystem/Memory/MemoryProcess.cs b/Assets/Scripts/FixSystem/Memory/MemoryProcess.cs index 373d6175a..fbb1c87f0 100644 --- a/Assets/Scripts/FixSystem/Memory/MemoryProcess.cs +++ b/Assets/Scripts/FixSystem/Memory/MemoryProcess.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; @@ -11,9 +11,12 @@ using Cinemachine; using UnityEngine.Rendering; using AibisDream.Kit; using UnityEngine.EventSystems; +using UnityEngine.ResourceManagement.AsyncOperations; public class MemoryProcess : MonoBehaviour { + private const string MemorySpritePath = "Sprite/Memory/{0}.png"; + public BubbleSlotGroup bubbleSlotGroup; public GameObject memoryView; public GameObject projector; @@ -327,12 +330,15 @@ public class MemoryProcess : MonoBehaviour { fadeMaterial.SetFloat("_DirectionalDistortionFade", -15); FavoritesManager.Instance.CloseFavorites(); - Sprite memSprite = Resources.Load("Art/Memory/" + memName); + var memoryKey = string.Format(MemorySpritePath, memName); + var memoryHandle = ResourceSystem.LoadAsync(memoryKey); + yield return memoryHandle; + Sprite memSprite = memoryHandle.Status == AsyncOperationStatus.Succeeded ? memoryHandle.Result : null; memoryFinishedspRender.sprite = memSprite; memoryFinishedImageNoColor.sprite = memSprite; if (memSprite == null) { - Debug.LogError("Memory not found: " + memName); + Debug.LogError("Memory not found: " + memoryKey); } // AudioManager.PlayMemoryAudio("mem_" + memName); @@ -390,12 +396,17 @@ public class MemoryProcess : MonoBehaviour yield break; } - Sprite memorySprite = Resources.Load("Art/Memory/" + PunchTape.MemoryIndex); + var searchMemoryKey = string.Format(MemorySpritePath, PunchTape.MemoryIndex); + var searchMemoryHandle = ResourceSystem.LoadAsync(searchMemoryKey); + yield return searchMemoryHandle; + Sprite memorySprite = searchMemoryHandle.Status == AsyncOperationStatus.Succeeded + ? searchMemoryHandle.Result + : null; memoryFinishedspRender.sprite = memorySprite; memoryFinishedImageNoColor.sprite = memorySprite; if (memorySprite == null) { - Debug.LogError("Memory not found: " + PunchTape.MemoryIndex); + Debug.LogError("Memory not found: " + searchMemoryKey); } MemoryProcessVloume.weight = 1; diff --git a/Assets/Scripts/MiniGame/HuoShan/AnalysisSystem/AnalysisModeYarnCommand.cs b/Assets/Scripts/MiniGame/HuoShan/AnalysisSystem/AnalysisModeYarnCommand.cs index a20d72fa2..461bb2fc3 100644 --- a/Assets/Scripts/MiniGame/HuoShan/AnalysisSystem/AnalysisModeYarnCommand.cs +++ b/Assets/Scripts/MiniGame/HuoShan/AnalysisSystem/AnalysisModeYarnCommand.cs @@ -1,5 +1,7 @@ -using System.Collections; +using System.Collections; using AibisDream.FixSystem; +using AibisDream.Framework; +using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine; using Yarn.Unity; @@ -21,25 +23,27 @@ namespace AibisDream.MiniGame.Language /// 关卡配置名称(Resources/AnalysisLevels/ 下的文件名) /// 完成时触发的对话节点(可选,会覆盖配置中的节点) [YarnCommand("start_analysis")] - public static void StartAnalysis(string levelName, string completionNode = "") + public static IEnumerator StartAnalysis(string levelName, string completionNode = "") { if (AnalysisModeManager == null) { Debug.LogError("AnalysisModeManager 未找到!请确保场景中有 AnalysisModeManager 组件。"); - return; + yield break; } - // 从 Resources 加载关卡配置 - AnalysisModeData levelData = Resources.Load($"AnalysisLevels/{levelName}"); - - if (levelData == null) + var handler = ResourceSystem.LoadAsync($"AnalysisLevels/{levelName}"); + yield return handler; + + if (handler.Status == AsyncOperationStatus.Succeeded && handler.Result != null) { - Debug.LogError($"找不到关卡配置: Resources/AnalysisLevels/{levelName}.asset"); - return; + AnalysisModeData levelData = handler.Result; + AnalysisModeManager.OpenView(levelData, completionNode); + } + else + { + Debug.LogError($"找不到关卡配置: {levelName}.asset"); + yield break; } - - // 启动分析模式 - AnalysisModeManager.OpenView(levelData, completionNode); } /// diff --git a/Assets/Scripts/MiniGame/Peipei/Eye/EyeSystem.cs b/Assets/Scripts/MiniGame/Peipei/Eye/EyeSystem.cs index 6c530815f..14d984071 100644 --- a/Assets/Scripts/MiniGame/Peipei/Eye/EyeSystem.cs +++ b/Assets/Scripts/MiniGame/Peipei/Eye/EyeSystem.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -10,12 +10,15 @@ using AibisDream.FixSystem; using Cinemachine; using AibisDream.Framework; using AibisDream.Kit; +using UnityEngine.ResourceManagement.AsyncOperations; using Sequence = DG.Tweening.Sequence; namespace AibisDream { public class EyeSystem : MonoBehaviour { + private const string MemorySpritePath = "Sprite/Memory/{0}.png"; + public BubbleSlotGroup bubbleSlotGroup; [SerializeField] private List targets = new(); // 保存目标列表 public List Targets => targets; // 提供目标列表的公共访问 @@ -307,10 +310,6 @@ namespace AibisDream Debug.LogError("No eyeImage"); yield break; } - - // AudioManager.RandomPlayInteraction("colorcorrect_in"); - // AudioManager.PlayLoopAudio("colorcorrect_loop"); - //AudioManager.Instance.PlaySfx("event:/ActionFB/visualturn"); // _HsvShift 从 0 ~ 360 来回变化 hsvShiftTween = DOTween .To(() => material.GetFloat("_HsvShift"), x => material.SetFloat("_HsvShift", x), 360, 1f) @@ -367,14 +366,16 @@ namespace AibisDream if (memoryName != null) { - Sprite memorySprite = Resources.Load("Art/Memory/" + memoryName); - if (memorySprite == null) + var memoryKey = string.Format(MemorySpritePath, memoryName); + var memoryHandle = ResourceSystem.LoadAsync(memoryKey); + yield return memoryHandle; + if (memoryHandle.Status != AsyncOperationStatus.Succeeded || memoryHandle.Result == null) { - Debug.LogWarning("Memory not found: " + memoryName); + Debug.LogWarning("Memory not found: " + memoryKey); yield break; } - memoryRender.sprite = memorySprite; + memoryRender.sprite = memoryHandle.Result; // 使 memoryRender 可见 memoryRender.gameObject.SetActive(true); diff --git a/Assets/Scripts/SceneManagement/SpriteShowcase.cs b/Assets/Scripts/SceneManagement/SpriteShowcase.cs index 8a1539884..52efdcbec 100644 --- a/Assets/Scripts/SceneManagement/SpriteShowcase.cs +++ b/Assets/Scripts/SceneManagement/SpriteShowcase.cs @@ -1,13 +1,19 @@ -using System.Collections; +using System; +using System.Collections; +using AibisDream.Framework; using AibisDream.Kit; using AibisDream.Utility; using DG.Tweening; using UnityEngine; +using UnityEngine.ResourceManagement.AsyncOperations; namespace AibisDream { public class SpriteShowcase : Singleton { + /// Addressable Key 模板,与 Scene_Dream 中梦境图 Address 一致。 + private const string DreamSpritePath = "Dream/梦境/{0}.png"; + [SerializeField] private SpriteRenderer _spriteRenderer; [SerializeField] private SpriteRenderer _backgroundSpriteRenderer; [SerializeField] private SpriteRenderer _largeSpriteRenderer; @@ -30,10 +36,29 @@ namespace AibisDream } } + private static string NormalizeDreamPicName(string picName) + { + if (string.IsNullOrEmpty(picName)) return picName; + return picName.EndsWith(".png", StringComparison.OrdinalIgnoreCase) + ? picName.Substring(0, picName.Length - 4) + : picName; + } + + private IEnumerator LoadDreamSpriteInto(SpriteRenderer target, string picName) + { + var key = string.Format(DreamSpritePath, NormalizeDreamPicName(picName)); + var handle = ResourceSystem.LoadAsync(key); + yield return handle; + if (handle.Status == AsyncOperationStatus.Succeeded && handle.Result != null) + target.sprite = handle.Result; + else + Debug.LogError($"[SpriteShowcase] Failed to load sprite: {key}"); + } + /// /// 显示物体(小图) /// - /// 图片名称(相对于 Resources/Art/Obj/ 的路径) + /// 图片名(无扩展名,与 Yarn 中一致;Addressable Key 由 拼接) /// 淡入时长 /// 协程 public IEnumerator ShowObj(string picName, float duration = 1) @@ -46,18 +71,15 @@ namespace AibisDream _spriteRenderer.gameObject.SetActive(true); - // 切换图片 - var newSprite = Resources.Load($"Art/Obj/{picName}"); - _spriteRenderer.sprite = newSprite; + yield return LoadDreamSpriteInto(_spriteRenderer, picName); - // 然后淡入 yield return _spriteRenderer.DOFade(1, duration).WaitForCompletion(); } /// /// 显示大图 /// - /// 图片名称(相对于 Resources/Art/Obj/ 的路径) + /// 图片名(无扩展名,与 Yarn 中一致;Addressable Key 由 拼接) /// 淡入时长 /// 协程 public IEnumerator ShowLargeObj(string picName, float duration = 1) @@ -72,11 +94,8 @@ namespace AibisDream _largeSpriteRenderer.gameObject.SetActive(true); - // 切换图片 - var newSprite = Resources.Load($"Art/Obj/{picName}"); - _largeSpriteRenderer.sprite = newSprite; + yield return LoadDreamSpriteInto(_largeSpriteRenderer, picName); - // 然后淡入 yield return _largeSpriteRenderer.DOFade(1, duration).WaitForCompletion(); } @@ -178,4 +197,4 @@ namespace AibisDream StartCoroutine(FadeOutAsync(duration)); } } -} \ No newline at end of file +} diff --git a/Assets/Scripts/UI/Panel/PlayToolPanel.cs b/Assets/Scripts/UI/Panel/PlayToolPanel.cs index 6a0d4818c..d2d32a53d 100644 --- a/Assets/Scripts/UI/Panel/PlayToolPanel.cs +++ b/Assets/Scripts/UI/Panel/PlayToolPanel.cs @@ -1,9 +1,11 @@ -using System.Collections; +using System; +using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using DG.Tweening; using RainbowArt.CleanFlatUI; using UnityEngine; +using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.UI; namespace AibisDream.UI @@ -19,6 +21,9 @@ namespace AibisDream.UI [Header("Obj尺寸参数")] public float objWidth; public float objHeight; + /// Addressable Key 模板,与 Obj 精灵 Address 一致。 + private const string ObjSpritePath = "Sprite/Obj/{0}.png"; + #region 索引 private Image _fadeImage; @@ -52,6 +57,14 @@ namespace AibisDream.UI _timeTurner = transform.GetComponentInChildren(); } + private static string NormalizeObjPicName(string picName) + { + if (string.IsNullOrEmpty(picName)) return picName; + return picName.EndsWith(".png", StringComparison.OrdinalIgnoreCase) + ? picName.Substring(0, picName.Length - 4) + : picName; + } + public IEnumerator FadeInAsync(float duration = 1) { return _fadeImage.FadeInAsync(duration); @@ -80,8 +93,16 @@ namespace AibisDream.UI { _showObjPanel.gameObject.SetActive(true); - // 切换图片 - var newSprite = Resources.Load($"Art/Obj/{picName}"); + var key = string.Format(ObjSpritePath, NormalizeObjPicName(picName)); + var handle = ResourceSystem.LoadAsync(key); + yield return handle; + if (handle.Status != AsyncOperationStatus.Succeeded || handle.Result == null) + { + Debug.LogError($"[PlayToolPanel] Failed to load sprite: {key}"); + yield break; + } + + var newSprite = handle.Result; // 获取图片的长宽比 var imageAspect = (float)newSprite.texture.width / newSprite.texture.height; @@ -110,7 +131,16 @@ namespace AibisDream.UI public IEnumerator ShowFullScreen(string picName) { - _fullScreenImage.sprite = Resources.Load($"Art/Obj/{picName}"); + var key = string.Format(ObjSpritePath, NormalizeObjPicName(picName)); + var handle = ResourceSystem.LoadAsync(key); + yield return handle; + if (handle.Status != AsyncOperationStatus.Succeeded || handle.Result == null) + { + Debug.LogError($"[PlayToolPanel] Failed to load sprite: {key}"); + yield break; + } + + _fullScreenImage.sprite = handle.Result; // 淡入 yield return _fullScreenImage.FadeInAsync(1);