Files
aibis-dream/Assets/Scripts/SceneManagement/SpriteShowcase.cs
T
dingyuntian 23d363463c feat(scene-mgmt): 添加全屏图片展示功能
新增全屏/大图展示功能,支持 Yarn 命令控制:
- ShowLargeObj: 显示大图并淡入
- HideLargeObj: 隐藏大图并淡出
- HideAll: 同时隐藏大小图
- 实现大小图互斥切换逻辑
- 重构 HideObj 方法支持可选强制隐藏参数

在梦境场景中配置了大图渲染器和游戏对象,
添加相关 Yarn 命令绑定到 Dialog System。

Made-with: Cursor
2026-03-06 16:49:23 +08:00

181 lines
6.2 KiB
C#

using System.Collections;
using AibisDream.Kit;
using AibisDream.Utility;
using DG.Tweening;
using UnityEngine;
namespace AibisDream
{
public class SpriteShowcase : Singleton<SpriteShowcase>
{
[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);
}
}
/// <summary>
/// 显示物体(小图)
/// </summary>
/// <param name="picName">图片名称(相对于 Resources/Art/Obj/ 的路径)</param>
/// <param name="duration">淡入时长</param>
/// <returns>协程</returns>
public IEnumerator ShowObj(string picName, float duration = 1)
{
// 互斥:如果大图正在显示,先隐藏
if (IsLargeShowing)
{
yield return HideLargeObj(duration);
}
_spriteRenderer.gameObject.SetActive(true);
// 切换图片
var newSprite = Resources.Load<Sprite>($"Art/Obj/{picName}");
_spriteRenderer.sprite = newSprite;
// 然后淡入
yield return _spriteRenderer.DOFade(1, duration).WaitForCompletion();
}
/// <summary>
/// 显示大图
/// </summary>
/// <param name="picName">图片名称(相对于 Resources/Art/Obj/ 的路径)</param>
/// <param name="duration">淡入时长</param>
/// <returns>协程</returns>
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<Sprite>($"Art/Obj/{picName}");
_largeSpriteRenderer.sprite = newSprite;
// 然后淡入
yield return _largeSpriteRenderer.DOFade(1, duration).WaitForCompletion();
}
/// <summary>
/// 隐藏物体(小图)
/// </summary>
/// <param name="duration">淡出时长</param>
/// <returns>协程</returns>
public IEnumerator HideObj(float duration = 1)
{
yield return HideObj(force: false, duration);
}
/// <summary>
/// 隐藏物体(小图)
/// </summary>
/// <param name="force">是否强制隐藏</param>
/// <param name="duration">淡出时长</param>
/// <returns>协程</returns>
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);
}
/// <summary>
/// 隐藏大图
/// </summary>
/// <param name="force">是否强制隐藏</param>
/// <param name="duration">淡出时长</param>
/// <returns>协程</returns>
public IEnumerator HideLargeObj(float duration = 1)
{
if (_largeSpriteRenderer == null) yield break;
yield return _largeSpriteRenderer.DOFade(0, duration).WaitForCompletion();
_largeSpriteRenderer.gameObject.SetActive(false);
}
/// <summary>
/// 隐藏所有(小图和大图)
/// </summary>
/// <param name="duration">淡出时长</param>
/// <returns>协程</returns>
public IEnumerator HideAll(float duration = 1)
{
if (IsSmallShowing)
yield return HideObj(duration);
if (IsLargeShowing)
yield return HideLargeObj(duration);
}
/// <summary>
/// 淡入(异步协程版本)
/// </summary>
/// <param name="duration">淡入时长</param>
/// <returns>协程</returns>
public IEnumerator FadeInAsync(float duration = 1)
{
if (_backgroundSpriteRenderer == null) yield break;
_backgroundSpriteRenderer.gameObject.SetActive(true);
yield return _backgroundSpriteRenderer.DOFade(1, duration).WaitForCompletion();
}
/// <summary>
/// 淡出(异步协程版本)
/// </summary>
/// <param name="duration">淡出时长</param>
/// <returns>协程</returns>
public IEnumerator FadeOutAsync(float duration = 1)
{
if (_backgroundSpriteRenderer == null) yield break;
_backgroundSpriteRenderer.gameObject.SetActive(true);
yield return _backgroundSpriteRenderer.DOFade(0, duration).WaitForCompletion();
_backgroundSpriteRenderer.gameObject.SetActive(false);
}
/// <summary>
/// 淡入(同步版本,启动协程)
/// </summary>
/// <param name="duration">淡入时长</param>
public void FadeInSync(float duration = 1)
{
StartCoroutine(FadeInAsync(duration));
}
/// <summary>
/// 淡出(同步版本,启动协程)
/// </summary>
/// <param name="duration">淡出时长</param>
public void FadeOutSync(float duration = 1)
{
StartCoroutine(FadeOutAsync(duration));
}
}
}