8 using System.Collections.Generic;
14 public delegate
float CustomAnimationDelay(
int dataIndex);
15 public delegate
float CustomAnimationDuration(
int dataIndex);
28 [SerializeField]
private bool m_Enable =
true;
29 [SerializeField]
private Easing m_Easting;
30 [SerializeField]
private int m_Threshold = 2000;
31 [SerializeField]
private float m_FadeInDuration = 1000;
32 [SerializeField]
private float m_FadeInDelay = 0;
33 [SerializeField]
private float m_FadeOutDuration = 1000f;
34 [SerializeField]
private float m_FadeOutDelay = 0;
35 [SerializeField]
private bool m_DataChangeEnable =
true;
36 [SerializeField]
private float m_DataChangeDuration = 500;
37 [SerializeField]
private float m_ActualDuration;
38 [SerializeField]
private bool m_AlongWithLinePath;
60 public bool enable {
get {
return m_Enable; }
set { m_Enable = value; } }
70 public float fadeInDuration {
get {
return m_FadeInDuration; }
set { m_FadeInDuration = value < 0 ? 0 : value; } }
75 public float fadeOutDuration {
get {
return m_FadeOutDuration; }
set { m_FadeOutDuration = value < 0 ? 0 : value; } }
85 public int threshold {
get {
return m_Threshold; }
set { m_Threshold = value; } }
90 public float fadeInDelay {
get {
return m_FadeInDelay; }
set { m_FadeInDelay = value < 0 ? 0 : value; } }
94 public float fadeOutDelay {
get {
return m_FadeOutDelay; }
set { m_FadeInDelay = value < 0 ? 0 : value; } }
98 public bool dataChangeEnable {
get {
return m_DataChangeEnable; }
set { m_DataChangeEnable = value; } }
103 public float dataChangeDuration {
get {
return m_DataChangeDuration; }
set { m_DataChangeDuration = value < 0 ? 0 : value; } }
107 public bool alongWithLinePath {
get {
return m_AlongWithLinePath; }
set { m_AlongWithLinePath = value; } }
116 private Dictionary<int, float> m_DataCurrProgress =
new Dictionary<int, float>();
117 private Dictionary<int, float> m_DataDestProgress =
new Dictionary<int, float>();
118 private bool m_FadeIn =
false;
119 private bool m_IsEnd =
true;
120 private bool m_IsPause =
false;
121 private bool m_FadeOut =
false;
122 private bool m_FadeOuted =
false;
123 private bool m_IsInit =
false;
125 private float startTime {
get;
set; }
126 private int m_CurrDataProgress {
get;
set; }
127 private int m_DestDataProgress {
get;
set; }
128 [SerializeField]
private float m_CurrDetailProgress;
129 [SerializeField]
private float m_DestDetailProgress;
130 private float m_CurrSymbolProgress;
131 private Vector3 m_LinePathLastPos;
132 private float m_LinePathCurrTotalDist = 0f;
136 if (m_FadeOut)
return;
142 if (m_FadeIn)
return;
143 startTime = Time.time;
149 m_CurrDataProgress = 1;
150 m_DestDataProgress = 1;
151 m_CurrDetailProgress = 0;
152 m_DestDetailProgress = 1;
153 m_CurrSymbolProgress = 0;
154 m_DataCurrProgress.Clear();
155 m_DataDestProgress.Clear();
158 public void Restart()
164 public void FadeOut()
172 startTime = Time.time;
177 m_CurrDataProgress = 0;
178 m_DestDataProgress = 0;
179 m_CurrDetailProgress = 0;
180 m_DestDetailProgress = 1;
181 m_CurrSymbolProgress = 0;
182 m_DataCurrProgress.Clear();
183 m_DataDestProgress.Clear();
206 m_CurrDataProgress = m_DestDataProgress + (m_FadeOut ? -1 : 1);
236 m_DataCurrProgress.Clear();
239 public void InitProgress(
int data,
float curr,
float dest)
241 if (m_IsInit || m_IsEnd)
return;
242 if (curr > dest)
return;
244 m_DestDataProgress = data;
248 m_CurrDetailProgress = dest;
249 m_DestDetailProgress = curr;
253 m_CurrDetailProgress = curr;
254 m_DestDetailProgress = dest;
258 public void SetDataFinish(
int dataIndex)
261 m_CurrDataProgress = dataIndex + (m_FadeOut ? -1 : 1);
264 private void SetDataCurrProgress(
int index,
float state)
266 m_DataCurrProgress[index] = state;
269 private float GetDataCurrProgress(
int index,
float initValue,
float destValue, out
bool isBarEnd)
276 var c1 = !m_DataCurrProgress.ContainsKey(index);
277 var c2 = !m_DataDestProgress.ContainsKey(index);
280 if (c1) m_DataCurrProgress.Add(index, initValue);
281 if (c2) m_DataDestProgress.Add(index, destValue);
286 isBarEnd = m_DataCurrProgress[index] == m_DataDestProgress[index];
288 return m_DataCurrProgress[index];
291 public bool IsFinish()
294 if (!Application.isPlaying)
return true;
296 return !m_Enable || m_IsEnd || (m_CurrDataProgress > m_DestDataProgress && m_CurrDetailProgress > m_DestDetailProgress);
299 public bool IsInFadeOut()
304 public bool IsInDelay()
310 public float GetDataDelay(
int dataIndex)
317 public bool IsInDataDelay(
int dataIndex)
319 return Time.time - startTime < GetDataDelay(dataIndex) / 1000f;
322 public bool IsAllOutDelay(
int dataCount)
324 var nowTime = Time.time - startTime;
325 for (
int i = 0; i < dataCount; i++)
327 if (nowTime < GetDataDelay(i) / 1000)
return false;
332 public bool IsAllDataFinishProgress(
int dataCount)
334 for (
int i = 0; i < dataCount; i++)
336 if (m_DataDestProgress.ContainsKey(i) && m_DataCurrProgress.ContainsKey(i))
338 if (m_DataCurrProgress[i] != m_DataDestProgress[i])
return false;
348 public bool CheckDetailBreak(
float detail)
350 return !IsFinish() && detail > m_CurrDetailProgress;
353 public void SetLinePathStartPos(Vector3 pos)
355 if (m_AlongWithLinePath)
357 m_LinePathLastPos = pos;
358 m_LinePathCurrTotalDist = 0;
362 public bool CheckDetailBreak(Vector3 pos,
bool isYAxis)
364 if (IsFinish())
return false;
365 if (m_AlongWithLinePath)
367 m_LinePathCurrTotalDist += Vector3.Distance(pos, m_LinePathLastPos);
368 m_LinePathLastPos = pos;
369 return CheckDetailBreak(m_LinePathCurrTotalDist);
373 if (isYAxis)
return pos.y > m_CurrDetailProgress;
374 else return pos.x > m_CurrDetailProgress;
378 public bool NeedAnimation(
int dataIndex)
380 if (!m_Enable || m_IsEnd)
return true;
381 if (IsInDelay())
return false;
382 if (m_FadeOut)
return dataIndex > 0;
383 else return dataIndex <= m_CurrDataProgress;
386 internal void CheckProgress(
double total)
388 if (IsFinish())
return;
389 if (!m_IsInit || m_IsPause || m_IsEnd)
return;
390 if (IsInDelay())
return;
391 m_ActualDuration = (int)((Time.time - startTime) * 1000) -
fadeInDelay;
392 var duration = GetCurrAnimationDuration();
393 var delta = (float)(total / duration * Time.deltaTime);
396 m_CurrDetailProgress -= delta;
397 if (m_CurrDetailProgress <= m_DestDetailProgress)
399 m_CurrDetailProgress = m_DestDetailProgress;
405 m_CurrDetailProgress += delta;
406 if (m_CurrDetailProgress >= m_DestDetailProgress)
408 m_CurrDetailProgress = m_DestDetailProgress;
414 internal float GetCurrAnimationDuration(
int dataIndex = -1)
421 if (m_FadeOut)
return m_FadeOutDuration > 0 ? m_FadeOutDuration / 1000 : 1f;
422 else return m_FadeInDuration > 0 ? m_FadeInDuration / 1000 : 1f;
425 internal float CheckBarProgress(
int dataIndex,
float barHig,
int dataCount, out
bool isBarEnd)
428 var initHig = m_FadeOut ? barHig : 0;
429 var destHig = m_FadeOut ? 0 : barHig;
430 var currHig = GetDataCurrProgress(dataIndex, initHig, destHig, out isBarEnd);
431 if (isBarEnd || IsFinish())
433 return m_FadeOuted ? 0 : barHig;
435 else if (IsInDelay() || IsInDataDelay(dataIndex))
437 return m_FadeOut ? barHig : 0;
445 var duration = GetCurrAnimationDuration(dataIndex);
446 var delta = barHig / duration * Time.deltaTime;
447 currHig = currHig + (m_FadeOut ? -delta : delta);
450 if ((initHig > 0 && currHig <= 0) || (initHig < 0 && currHig >= 0))
456 else if (Mathf.Abs(currHig) >= Mathf.Abs(barHig))
461 SetDataCurrProgress(dataIndex, currHig);
466 public void AllBarEnd()
471 internal void CheckSymbol(
float dest)
473 if (!
enable || m_IsEnd || m_IsPause || !m_IsInit)
return;
474 if (IsInDelay())
return;
475 var duration = GetCurrAnimationDuration();
476 var delta = dest / duration * Time.deltaTime;
479 m_CurrSymbolProgress -= delta;
480 if (m_CurrSymbolProgress < 0) m_CurrSymbolProgress = 0;
484 m_CurrSymbolProgress += delta;
485 if (m_CurrSymbolProgress > dest) m_CurrSymbolProgress = dest;
489 public float GetSysmbolSize(
float dest)
492 if (!Application.isPlaying)
return dest;
495 if (m_IsEnd)
return m_FadeOut ? 0 : dest;
496 return m_CurrSymbolProgress;
499 public float GetCurrDetail()
501 return m_CurrDetailProgress;
504 public float GetCurrRate()
507 if (!Application.isPlaying)
return 1;
509 if (!
enable || m_IsEnd)
return 1;
510 return m_CurrDetailProgress;
513 public int GetCurrIndex()
516 if (!Application.isPlaying)
return -1;
518 if (!
enable || m_IsEnd)
return -1;
519 return (
int)m_CurrDetailProgress;
522 public float GetCurrData()
524 return m_CurrDataProgress;
527 public float GetUpdateAnimationDuration()
529 if (m_Enable && m_DataChangeEnable && IsFinish())
return m_DataChangeDuration;
533 public bool HasFadeOut()
535 return enable && m_FadeOuted && m_IsEnd;