Files
ZooMatch-GP/Assets/ZooMatch/ToolKit/CountDownKit.cs
T

207 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using DG.Tweening;
using FairyGUI;
using UnityEngine.UI;
namespace ZooMatch
{
public enum CountDownType
{
Second,
Minute,
Hour,
Day
}
public class CountDownKit
{
private int countDownTime;
private int leftTime = 0;
private GTextField textGComponent;
private GProgressBar barGComponent;
private Text textComponent;
private CountDownType countDownType = CountDownType.Second;
private Dictionary<int, Action> onTriggerEventDict = new Dictionary<int, Action>();
private Tween timer;
private Action onCompletedEvent;
private long endTime;
private bool isDependenceServerTime = true;
public CountDownKit SetTime(int second)
{
countDownTime = second;
leftTime = countDownTime;
return this;
}
public CountDownKit SetCountDownType(CountDownType countDownType)
{
this.countDownType = countDownType;
return this;
}
public CountDownKit SetText(GTextField gText)
{
textComponent = null;
textGComponent = gText;
return this;
}
public CountDownKit SetBar(GProgressBar gProgressBar)
{
barGComponent = null;
barGComponent = gProgressBar;
return this;
}
public int interval = 1;
public void Start()
{
endTime = (int)(DateTimeManager.Instance.GetServerCurrTimestamp() / 1000) + leftTime;
UpdateView();
timer = DOVirtual.DelayedCall(interval, () =>
{
leftTime -= interval;
if (isDependenceServerTime)
{
var current = DateTimeManager.Instance.GetServerCurrTimestamp() / 1000;
if (endTime <= current)
{
leftTime = 0;
}
}
UpdateView();
if (leftTime <= 0)
{
Stop();
OnCompleted();
}
else
{
OnTrigger();
}
}, true).SetLoops(-1);
}
private void UpdateView()
{
UpdateText();
UpdateBar();
}
public void Pause()
{
if (timer != null)
{
timer.Pause();
}
}
public void Resume()
{
if (timer != null)
{
timer.Play();
}
}
public void Stop()
{
if (timer != null && timer.IsActive())
{
timer?.Kill();
}
}
public void OnDestroy()
{
Stop();
leftTime = 0;
textGComponent = null;
textComponent = null;
onTriggerEventDict = null;
onCompletedEvent = null;
}
public void ConsumeTime(int consumeTime)
{
leftTime -= consumeTime;
UpdateView();
if (leftTime <= 0)
{
Stop();
OnCompleted();
}
else
{
OnTrigger();
}
}
private void OnTrigger()
{
if (onTriggerEventDict.ContainsKey(leftTime))
{
onTriggerEventDict[leftTime]?.Invoke();
}
}
public void ClearTriggerEvent()
{
onTriggerEventDict.Clear();
}
public CountDownKit SetCompletedEvent(Action onCompleted)
{
onCompletedEvent = onCompleted;
return this;
}
private void OnCompleted()
{
onCompletedEvent?.Invoke();
}
private void UpdateText()
{
if (textGComponent != null)
{
textGComponent.text = CommonHelper.TimeFormat(leftTime, countDownType);
}
if (textComponent != null)
{
textComponent.text = CommonHelper.TimeFormat(leftTime, countDownType);
}
}
private void UpdateBar()
{
if (barGComponent != null)
{
if (barGComponent.max == 0)
{
barGComponent.max = countDownTime;
}
barGComponent.TweenValue(leftTime, 1);
}
}
public int GetLeftTime()
{
return leftTime;
}
public CountDownKit SetServerTimeDependence(bool _isDependenceServerTime)
{
isDependenceServerTime = _isDependenceServerTime;
return this;
}
}
}