201 lines
7.2 KiB
C#
201 lines
7.2 KiB
C#
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<SpriteShowcase>
|
|
{
|
|
/// <summary>Addressable Key 模板,与 Scene_Dream 中梦境图 Address 一致。</summary>
|
|
private const string DreamSpritePath = "Sprite/梦境/{0}.png";
|
|
|
|
[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);
|
|
}
|
|
}
|
|
|
|
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<Sprite>(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}");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 显示物体(小图)
|
|
/// </summary>
|
|
/// <param name="picName">图片名(无扩展名,与 Yarn 中一致;Addressable Key 由 <see cref="DreamSpritePath"/> 拼接)</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);
|
|
|
|
yield return LoadDreamSpriteInto(_spriteRenderer, picName);
|
|
|
|
yield return _spriteRenderer.DOFade(1, duration).WaitForCompletion();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 显示大图
|
|
/// </summary>
|
|
/// <param name="picName">图片名(无扩展名,与 Yarn 中一致;Addressable Key 由 <see cref="DreamSpritePath"/> 拼接)</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);
|
|
|
|
yield return LoadDreamSpriteInto(_largeSpriteRenderer, picName);
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|