Files
ichni_Official/Assets/Scripts/UI/Elements/MessageBox.cs
SoulliesOfficial 7b7d069b84 StorySystem
2026-07-07 01:28:27 -04:00

158 lines
4.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using Sirenix.OdinInspector;
using SLSUtilities.WwiseAssistance;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Ichni.Menu.UI
{
public partial class MessageBox : SerializedMonoBehaviour
{
public CanvasGroup canvasGroup;
[Tooltip("当该消息框结束所有消息并彻底淡出消失时触发。")]
public UnityEvent onAllMessagesClosed = new UnityEvent();
public int infoIndex;
public List<MessageBoxInfo> infos;
public Sprite defaultIcon;
public Image iconImage;
public TMP_Text titleText;
public TMP_Text contentText;
public Button receiveButton;
public Tweener fadeTweener;
private void Start()
{
receiveButton.onClick.AddListener(()=>PlayNextMessage(true));
receiveButton.GetComponent<RectTransform>().sizeDelta = new Vector2(Screen.width, Screen.height);
}
public void SetUp()
{
if (infos.Count == 0)
{
return;
}
infoIndex = 0;
PlayNextMessage();
FadeIn();
}
public void SetUpIcon(Sprite icon)
{
iconImage.sprite = icon;
}
public void AddInfo(string title, string content, UnityAction action = null, Sprite icon = null)
{
MessageBoxInfo info = new MessageBoxInfo(icon, title, content, action);
infos.Add(info);
}
public void PlayNextMessage(bool playAudio = false)
{
if (playAudio)
{
AudioManager.Post(AK.EVENTS.CONFIRM);
}
if (infoIndex >= infos.Count)
{
FadeOut();
return;
}
infos[infoIndex].action?.Invoke();
if (titleText != null) titleText.text = infos[infoIndex].title;
if (contentText != null) contentText.text = infos[infoIndex].content;
this.iconImage.sprite = infos[infoIndex].icon != null ? infos[infoIndex].icon : defaultIcon;
infoIndex++;
}
public void Clear()
{
infos = new List<MessageBoxInfo>();
infoIndex = 0;
iconImage.sprite = defaultIcon;
titleText.text = string.Empty;
contentText.text = string.Empty;
}
}
public partial class MessageBox
{
// 废弃对 I2.Loc 参数化功能的支持
// public void SetParameter(string paramName, string paramValue, bool localize = false)
// {
// }
}
public partial class MessageBox
{
public void FadeIn(float duration = 0.5f, bool ignoreTimeScale = false)
{
canvasGroup.gameObject.SetActive(true);
fadeTweener = canvasGroup.DOFade(1f, duration).OnComplete(() =>
{
canvasGroup.interactable = true;
canvasGroup.blocksRaycasts = true;
});
if (ignoreTimeScale)
{
fadeTweener.SetUpdate(true);
}
fadeTweener.Play();
}
public void FadeOut(float duration = 0.5f, bool ignoreTimeScale = false)
{
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
fadeTweener = canvasGroup.DOFade(0f, duration).OnComplete(() =>
{
canvasGroup.gameObject.SetActive(false);
onAllMessagesClosed?.Invoke();
});
if (ignoreTimeScale)
{
fadeTweener.SetUpdate(true);
}
fadeTweener.Play();
}
}
public struct MessageBoxInfo
{
public Sprite icon;
public string title;
public string content;
public UnityAction action;
public MessageBoxInfo(Sprite icon, string title, string content, UnityAction action)
{
this.icon = icon;
this.title = title;
this.content = content;
this.action = action;
}
}
}