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 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().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(); 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; } } }