From 23d363463cf6f8f512775d73789f020f1d3541cd Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Fri, 6 Mar 2026 16:49:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(scene-mgmt):=20=E6=B7=BB=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=8F=E5=9B=BE=E7=89=87=E5=B1=95=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增全屏/大图展示功能,支持 Yarn 命令控制: - ShowLargeObj: 显示大图并淡入 - HideLargeObj: 隐藏大图并淡出 - HideAll: 同时隐藏大小图 - 实现大小图互斥切换逻辑 - 重构 HideObj 方法支持可选强制隐藏参数 在梦境场景中配置了大图渲染器和游戏对象, 添加相关 Yarn 命令绑定到 Dialog System。 Made-with: Cursor --- Assets/Scenes/梦境.unity | 86 +++++++++++++++++ .../Scripts/Dialog System/BaseYarnCommand.cs | 18 ++++ .../Scripts/SceneManagement/SpriteShowcase.cs | 96 ++++++++++++++++++- 3 files changed, 196 insertions(+), 4 deletions(-) diff --git a/Assets/Scenes/梦境.unity b/Assets/Scenes/梦境.unity index 856c884f8..f6d6fbc35 100644 --- a/Assets/Scenes/梦境.unity +++ b/Assets/Scenes/梦境.unity @@ -482,6 +482,90 @@ MonoBehaviour: mipBias: 0 varianceClampScale: 0.9 contrastAdaptiveSharpening: 0 +--- !u!1 &762853992 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 762853993} + - component: {fileID: 762853994} + m_Layer: 0 + m_Name: "\u68A6\u5883\u5168\u5C4F\u56FE\u7247" + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &762853993 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 762853992} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 861686055} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &762853994 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 762853992} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 844151739 + m_SortingLayer: 1 + m_SortingOrder: 4 + m_Sprite: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 8.930233, y: 5.023256} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 0 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &861686054 GameObject: m_ObjectHideFlags: 0 @@ -516,6 +600,7 @@ Transform: - {fileID: 1424643109} - {fileID: 969796817} - {fileID: 218986883} + - {fileID: 762853993} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &861686057 @@ -532,6 +617,7 @@ MonoBehaviour: m_EditorClassIdentifier: _spriteRenderer: {fileID: 218986884} _backgroundSpriteRenderer: {fileID: 969796818} + _largeSpriteRenderer: {fileID: 762853994} --- !u!1 &969796816 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Dialog System/BaseYarnCommand.cs b/Assets/Scripts/Dialog System/BaseYarnCommand.cs index cd13630ac..66b8ebb29 100644 --- a/Assets/Scripts/Dialog System/BaseYarnCommand.cs +++ b/Assets/Scripts/Dialog System/BaseYarnCommand.cs @@ -122,6 +122,24 @@ namespace AibisDream SpriteShowcase.Instance.FadeOutSync(duration); } + [YarnCommand("show_large_sprite")] + public static IEnumerator ShowLargeSprite(string picName, float duration = 1) + { + yield return SpriteShowcase.Instance.ShowLargeObj(picName, duration); + } + + [YarnCommand("hide_large_sprite")] + public static IEnumerator HideLargeSprite(float duration = 1) + { + yield return SpriteShowcase.Instance.HideLargeObj(duration); + } + + [YarnCommand("hide_all_sprites")] + public static IEnumerator HideAllSprites(float duration = 1) + { + yield return SpriteShowcase.Instance.HideAll(duration); + } + [YarnCommand("show_full_screen")] public static IEnumerator ShowFullScreen(string picName) { diff --git a/Assets/Scripts/SceneManagement/SpriteShowcase.cs b/Assets/Scripts/SceneManagement/SpriteShowcase.cs index 8f1a6e6cf..8a1539884 100644 --- a/Assets/Scripts/SceneManagement/SpriteShowcase.cs +++ b/Assets/Scripts/SceneManagement/SpriteShowcase.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using AibisDream.Kit; using AibisDream.Utility; using DG.Tweening; @@ -10,21 +10,40 @@ namespace AibisDream { [SerializeField] private SpriteRenderer _spriteRenderer; [SerializeField] private SpriteRenderer _backgroundSpriteRenderer; + [SerializeField] private SpriteRenderer _largeSpriteRenderer; + + // 通过 activeSelf 判断当前状态 + private bool IsSmallShowing => _spriteRenderer.gameObject.activeSelf; + private bool IsLargeShowing => _largeSpriteRenderer != null && _largeSpriteRenderer.gameObject.activeSelf; public override void OnSingletonInit() - { + { // 初始状态:隐藏 _spriteRenderer.gameObject.SetActive(false); _spriteRenderer.SetAlpha(0); + + // 大图初始状态:隐藏 + if (_largeSpriteRenderer != null) + { + _largeSpriteRenderer.gameObject.SetActive(false); + _largeSpriteRenderer.SetAlpha(0); + } } /// - /// 显示物体 + /// 显示物体(小图) /// /// 图片名称(相对于 Resources/Art/Obj/ 的路径) + /// 淡入时长 /// 协程 public IEnumerator ShowObj(string picName, float duration = 1) { + // 互斥:如果大图正在显示,先隐藏 + if (IsLargeShowing) + { + yield return HideLargeObj(duration); + } + _spriteRenderer.gameObject.SetActive(true); // 切换图片 @@ -36,14 +55,83 @@ namespace AibisDream } /// - /// 隐藏物体 + /// 显示大图 /// + /// 图片名称(相对于 Resources/Art/Obj/ 的路径) + /// 淡入时长 + /// 协程 + public IEnumerator ShowLargeObj(string picName, float duration = 1) + { + // 互斥:如果小图正在显示,先隐藏 + if (IsSmallShowing) + { + yield return HideObj(duration); + } + + if (_largeSpriteRenderer == null) yield break; + + _largeSpriteRenderer.gameObject.SetActive(true); + + // 切换图片 + var newSprite = Resources.Load($"Art/Obj/{picName}"); + _largeSpriteRenderer.sprite = newSprite; + + // 然后淡入 + yield return _largeSpriteRenderer.DOFade(1, duration).WaitForCompletion(); + } + + /// + /// 隐藏物体(小图) + /// + /// 淡出时长 /// 协程 public IEnumerator HideObj(float duration = 1) { + yield return HideObj(force: false, duration); + } + + /// + /// 隐藏物体(小图) + /// + /// 是否强制隐藏 + /// 淡出时长 + /// 协程 + public IEnumerator HideObj(bool force, float duration = 1) + { + // force=false 时检查状态,未显示则直接返回 + if (!force && !IsSmallShowing) yield break; + yield return _spriteRenderer.DOFade(0, duration).WaitForCompletion(); _spriteRenderer.gameObject.SetActive(false); } + + /// + /// 隐藏大图 + /// + /// 是否强制隐藏 + /// 淡出时长 + /// 协程 + public IEnumerator HideLargeObj(float duration = 1) + { + if (_largeSpriteRenderer == null) yield break; + + yield return _largeSpriteRenderer.DOFade(0, duration).WaitForCompletion(); + _largeSpriteRenderer.gameObject.SetActive(false); + } + + /// + /// 隐藏所有(小图和大图) + /// + /// 淡出时长 + /// 协程 + public IEnumerator HideAll(float duration = 1) + { + if (IsSmallShowing) + yield return HideObj(duration); + + if (IsLargeShowing) + yield return HideLargeObj(duration); + } /// /// 淡入(异步协程版本)