using System.Collections; using AibisDream.Kit; using AibisDream.Utility; using DG.Tweening; using UnityEngine; namespace AibisDream { public class SpriteShowcase : Singleton { [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); // 切换图片 var newSprite = Resources.Load($"Art/Obj/{picName}"); _spriteRenderer.sprite = newSprite; // 然后淡入 yield return _spriteRenderer.DOFade(1, duration).WaitForCompletion(); } /// /// 显示大图 /// /// 图片名称(相对于 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); } /// /// 淡入(异步协程版本) /// /// 淡入时长 /// 协程 public IEnumerator FadeInAsync(float duration = 1) { if (_backgroundSpriteRenderer == null) yield break; _backgroundSpriteRenderer.gameObject.SetActive(true); yield return _backgroundSpriteRenderer.DOFade(1, duration).WaitForCompletion(); } /// /// 淡出(异步协程版本) /// /// 淡出时长 /// 协程 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); } /// /// 淡入(同步版本,启动协程) /// /// 淡入时长 public void FadeInSync(float duration = 1) { StartCoroutine(FadeInAsync(duration)); } /// /// 淡出(同步版本,启动协程) /// /// 淡出时长 public void FadeOutSync(float duration = 1) { StartCoroutine(FadeOutAsync(duration)); } } }