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);
+ }
///
/// 淡入(异步协程版本)