using UnityEngine; using MonsterLove.StateMachine; using DG.Tweening; public enum MessageStates { Init, Add, Show, Del } public class MessageElement : MonoBehaviour { [SerializeField] TMPro.TextMeshProUGUI messageText; public RectTransform RectTransform { get { return transform as RectTransform; } } public string Message { get; private set; } private float remaining; private MessagePanel panel; StateMachine fsm; public void Init(MessagePanel panel, string message, float duration) { this.panel = panel; Message = message; remaining = duration; if (remaining < 0) { remaining = float.MaxValue; } if (fsm is null) { fsm = StateMachine.Initialize(this); } fsm.ChangeState(MessageStates.Init); } private void Init_Enter() { // 这里初始化,包括位置和消息信息 messageText.text = Message; messageText.rectTransform.anchoredPosition = new Vector2(messageText.rectTransform.rect.width, 0); fsm.ChangeState(MessageStates.Add); } private void Add_Enter() { // 这里播动画 messageText.rectTransform.DOAnchorPosX(0, 0.2f); fsm.ChangeState(MessageStates.Show); } private void Show_Update() { remaining -= Time.deltaTime; if (remaining <= 0) { remaining = float.MaxValue; fsm.ChangeState(MessageStates.Del); } } private void Del_Enter() { // 理论上这里也需要做个动画,先不管了 panel.DelMessage(this); } }