yyl
昨天 5d3366f2e0f687995eb7ad2107c4379fe7acd4e8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using DG.Tweening;
using Cysharp.Threading.Tasks;
 
public class MarqueeWin : UIBase
{
    // 组件引用
    [SerializeField] RectTransform m_ContainerMarquee;
    [SerializeField] RichText marqueeText;
    [SerializeField] RectTransform marqueeBg;
    [SerializeField] TweenCurve tweenCurve;
    [SerializeField] UIEffect m_Effect;
 
    Vector3 fromPos;
    Vector3 toPos;
    float m_Time;
    float duration;
    int presentCnt = 0;
    int loopCnt = 1;
 
    [SerializeField]
    float speed = 5.0f;
 
    Coroutine cacheCoroutine = null;
 
    // 生命周期
    protected override void Awake()
    {
        base.Awake();
        // 初始化组件引用
        fromPos = marqueeText.rectTransform.localPosition;
    }
 
    protected override void Start()
    {
        base.Start();
        // 初始化数据
    }
 
    protected override void OnPreOpen()
    {
        // 子类可以重写此方法进行额外的预打开操作
        base.OnPreOpen();
 
        m_Time = 0;
        ServerTipDetails.OnTweening = false;
        presentCnt = 0;
        m_ContainerMarquee.SetActive(false);
        if (cacheCoroutine != null)
        {
            StopCoroutine(cacheCoroutine);
            cacheCoroutine = null;
        }
    }
 
    // UI事件
    protected override void OnOpen()
    {
        base.OnOpen();
        // 窗口打开时的逻辑
        m_Effect.Play();
        cacheCoroutine = StartCoroutine(Co_StartTween());
    }
 
    protected override void OnClose()
    {
        base.OnClose();
        // 窗口关闭时的逻辑
    }
 
    IEnumerator Co_StartTween()
    {
        yield return new WaitForSeconds(5f);
        m_ContainerMarquee.SetActive(true);
        BeginMarquee();
    }
 
    void BeginMarquee()
    {
        if (presentCnt == 0)
        {
            var _hint = ServerTipDetails.RequireMarquee();
            if (_hint != null)
            {
                presentCnt = 0;
                marqueeText.SetExtenalData(_hint.extentionData);
                marqueeText.text = _hint.message;
            }
            else
            {
                CloseWindow();
                return;
            }
        }
        presentCnt++;
        marqueeText.rectTransform.localPosition = fromPos;
        toPos = fromPos;
        float width = marqueeText.preferredWidth;
        toPos.x = fromPos.x - marqueeBg.rect.width - width;
        duration = (width + marqueeBg.rect.width) / speed;
        ServerTipDetails.OnTweening = true;
    }
 
    void OnTweenComp()
    {
        m_Time = 0;
        ServerTipDetails.OnTweening = false;
        if (presentCnt >= loopCnt)
        {
            presentCnt = 0;
        }
        BeginMarquee();
    }
 
    protected void LateUpdate()
    {
        if (ServerTipDetails.OnTweening)
        {
            m_Time += Time.deltaTime;
            if (m_Time <= duration)
            {
                float progress = tweenCurve.Evaluate(m_Time / duration);
                marqueeText.rectTransform.localPosition = Vector3.Lerp(fromPos, toPos, progress);
            }
            else
            {
                OnTweenComp();
            }
        }
    }
}