From e1f20e07963af4f85d21779ca251ae5441697c4b Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Wed, 12 Oct 2022 08:35:23 +0800 Subject: [PATCH] [feature][animation] add `UnscaledTime` for animation #223 --- CHANGELOG.md | 1 + Editor/ChildComponents/AnimationDrawer.cs | 6 ++++- Runtime/Component/Animation/AnimationStyle.cs | 12 ++++++--- Runtime/Component/DataZoom/DataZoomHandler.cs | 8 ++++-- Runtime/Internal/Utilities/DataHelper.cs | 14 +++++----- Runtime/Serie/Bar/BarHandler.cs | 2 +- Runtime/Serie/Bar/SimplifiedBarHandler.cs | 2 +- .../Serie/Candlestick/CandlestickHandler.cs | 11 ++++---- .../SimplifiedCandlestickHandler.cs | 9 ++++--- Runtime/Serie/Heatmap/HeatmapHandler.cs | 3 ++- Runtime/Serie/Line/LineHandler.GridCoord.cs | 3 ++- Runtime/Serie/Line/SimplifiedLineHandler.cs | 3 ++- Runtime/Serie/Pie/PieHandler.cs | 3 ++- Runtime/Serie/Radar/RadarHandler.cs | 6 +++-- Runtime/Serie/Ring/RingHandler.cs | 3 ++- Runtime/Serie/Scatter/BaseScatterHandler.cs | 8 +++--- Runtime/Serie/Scatter/EffectScatterHandler.cs | 3 ++- Runtime/Serie/Serie.cs | 13 ++++++---- Runtime/Serie/SerieData.cs | 26 +++++++++---------- Runtime/Serie/SerieHandler.cs | 5 ++-- Runtime/Serie/SeriesHelper.cs | 3 ++- 21 files changed, 88 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db4ac594..60965ecb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ ## master +* (2022.10.12) 增加`Animation`的`UnscaledTime`支持设置动画是否受TimeScale的影响 (#223) * (2022.10.10) 调整文档格式 * (2022.10.10) 增加`Line`的`SmoothLimit`可控制平滑曲线不同效果 * (2022.10.05) 修复`Serie`隐藏时`Tooltip`还显示信息的问题 diff --git a/Editor/ChildComponents/AnimationDrawer.cs b/Editor/ChildComponents/AnimationDrawer.cs index 8d7a59c9..0594b9b5 100644 --- a/Editor/ChildComponents/AnimationDrawer.cs +++ b/Editor/ChildComponents/AnimationDrawer.cs @@ -21,7 +21,11 @@ namespace XCharts.Editor PropertyField(prop, "m_FadeOutDelay"); PropertyField(prop, "m_DataChangeEnable"); PropertyField(prop, "m_DataChangeDuration"); - PropertyField(prop, "m_ActualDuration"); + PropertyField(prop, "m_UnscaledTime"); + // using(new EditorGUI.DisabledGroupScope(true)) + // { + // PropertyField(prop, "m_ActualDuration"); + // } --EditorGUI.indentLevel; } } diff --git a/Runtime/Component/Animation/AnimationStyle.cs b/Runtime/Component/Animation/AnimationStyle.cs index 2e9e6a58..367f880c 100644 --- a/Runtime/Component/Animation/AnimationStyle.cs +++ b/Runtime/Component/Animation/AnimationStyle.cs @@ -61,6 +61,7 @@ namespace XCharts.Runtime [SerializeField] private bool m_DataChangeEnable = true; [SerializeField] private float m_DataChangeDuration = 500; [SerializeField] private float m_ActualDuration; + [SerializeField][Since("v3.4.0")] private bool m_UnscaledTime; /// /// 自定义渐入动画延时函数。返回ms值。 /// @@ -133,6 +134,11 @@ namespace XCharts.Runtime /// public float dataChangeDuration { get { return m_DataChangeDuration; } set { m_DataChangeDuration = value < 0 ? 0 : value; } } /// + /// Animation updates independently of Time.timeScale. + /// |动画是否受TimeScaled的影响。默认为 false 受TimeScaled的影响。 + /// + public bool unscaledTime { get { return m_UnscaledTime; } set { m_UnscaledTime = value; } } + /// /// 渐入动画完成回调 /// public Action fadeInFinishCallback { get; set; } @@ -464,7 +470,7 @@ namespace XCharts.Runtime m_ActualDuration = (int) ((Time.time - startTime) * 1000) - fadeInDelay; var duration = GetCurrAnimationDuration(); - var delta = (float) (total / duration * Time.deltaTime); + var delta = (float) (total / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime)); if (m_FadeOut) { m_CurrDetailProgress -= delta; @@ -522,7 +528,7 @@ namespace XCharts.Runtime else { var duration = GetCurrAnimationDuration(dataIndex); - var delta = (destProgress - startProgress) / duration * Time.deltaTime; + var delta = (destProgress - startProgress) / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime); currHig = currHig + (m_FadeOut ? -delta : delta); if (m_FadeOut) { @@ -555,7 +561,7 @@ namespace XCharts.Runtime return; var duration = GetCurrAnimationDuration(); - var delta = dest / duration * Time.deltaTime; + var delta = dest / duration * (m_UnscaledTime ? Time.unscaledDeltaTime : Time.deltaTime); if (m_FadeOut) { m_CurrSymbolProgress -= delta; diff --git a/Runtime/Component/DataZoom/DataZoomHandler.cs b/Runtime/Component/DataZoom/DataZoomHandler.cs index be6854ad..8f57bc9b 100644 --- a/Runtime/Component/DataZoom/DataZoomHandler.cs +++ b/Runtime/Component/DataZoom/DataZoomHandler.cs @@ -478,11 +478,13 @@ namespace XCharts.Runtime var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); var dataChanging = false; + var animationDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; for (int i = 0; i < maxCount; i += rate) { double value = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, - serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis); + animationDuration, ref dataChanging, axis, unscaledTime); float pX = dataZoom.context.x + i * scaleWid; float dataHig = (float) ((maxValue - minValue) == 0 ? 0 : (value - minValue) / (maxValue - minValue) * dataZoom.context.height); @@ -567,11 +569,13 @@ namespace XCharts.Runtime var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage : DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); var dataChanging = false; + var animationDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; for (int i = 0; i < maxCount; i += rate) { double value = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i, - serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis); + animationDuration, ref dataChanging, axis, unscaledTime); float pY = dataZoom.context.y + i * scaleWid; float dataHig = (maxValue - minValue) == 0 ? 0 : (float) ((value - minValue) / (maxValue - minValue) * dataZoom.context.width); diff --git a/Runtime/Internal/Utilities/DataHelper.cs b/Runtime/Internal/Utilities/DataHelper.cs index ee555adc..fa180842 100644 --- a/Runtime/Internal/Utilities/DataHelper.cs +++ b/Runtime/Internal/Utilities/DataHelper.cs @@ -23,7 +23,7 @@ namespace XCharts.Runtime public static double SampleValue(ref List showData, SampleType sampleType, int rate, int minCount, int maxCount, double totalAverage, int index, float dataChangeDuration, - ref bool dataChanging, Axis axis) + ref bool dataChanging, Axis axis, bool unscaledTime) { var inverse = axis.inverse; var minValue = axis.context.minValue; @@ -33,7 +33,7 @@ namespace XCharts.Runtime if (showData[index].IsDataChanged()) dataChanging = true; - return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); } switch (sampleType) { @@ -44,7 +44,7 @@ namespace XCharts.Runtime for (int i = index; i > index - rate; i--) { count++; - total += showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + total += showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); if (showData[i].IsDataChanged()) dataChanging = true; } @@ -57,7 +57,7 @@ namespace XCharts.Runtime double max = double.MinValue; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); if (value > max) max = value; @@ -70,7 +70,7 @@ namespace XCharts.Runtime double min = double.MaxValue; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); if (value < min) min = value; @@ -85,7 +85,7 @@ namespace XCharts.Runtime total = 0; for (int i = index; i > index - rate; i--) { - var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + var value = showData[i].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); total += value; if (value < min) min = value; @@ -104,7 +104,7 @@ namespace XCharts.Runtime if (showData[index].IsDataChanged()) dataChanging = true; - return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue); + return showData[index].GetCurrData(1, dataChangeDuration, inverse, minValue, maxValue, unscaledTime); } } } \ No newline at end of file diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index c3c70c0f..3f8c5707 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -221,7 +221,7 @@ namespace XCharts.Runtime var state = SerieHelper.GetSerieState(serie, serieData); var itemStyle = SerieHelper.GetItemStyle(serie, serieData, state); var value = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse); - var relativedValue = serieData.GetCurrData(1, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue); + var relativedValue = serieData.GetCurrData(1, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue, serie.animation.unscaledTime); var borderWidth = relativedValue == 0 ? 0 : itemStyle.runtimeBorderWidth; var borderGap = relativedValue == 0 ? 0 : itemStyle.borderGap; var borderGapAndWidth = borderWidth + borderGap; diff --git a/Runtime/Serie/Bar/SimplifiedBarHandler.cs b/Runtime/Serie/Bar/SimplifiedBarHandler.cs index 447c48db..c70f4a7c 100644 --- a/Runtime/Serie/Bar/SimplifiedBarHandler.cs +++ b/Runtime/Serie/Bar/SimplifiedBarHandler.cs @@ -162,7 +162,7 @@ namespace XCharts.Runtime var highlight = serieData.context.highlight || serie.highlight; var itemStyle = SerieHelper.GetItemStyle(serie, serieData); var value = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse); - var relativedValue = serieData.GetCurrData(1, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue); + var relativedValue = serieData.GetCurrData(1, dataChangeDuration, relativedAxis.inverse, yMinValue, yMaxValue, serie.animation.unscaledTime); var borderWidth = relativedValue == 0 ? 0 : itemStyle.runtimeBorderWidth; if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting)) diff --git a/Runtime/Serie/Candlestick/CandlestickHandler.cs b/Runtime/Serie/Candlestick/CandlestickHandler.cs index ab401a92..765efcc1 100644 --- a/Runtime/Serie/Candlestick/CandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/CandlestickHandler.cs @@ -71,7 +71,7 @@ namespace XCharts.Runtime param.columns.Clear(); param.columns.Add(param.marker); - param.columns.Add(XCSettings.lang.GetCandlestickDimensionName(i-1)); + param.columns.Add(XCSettings.lang.GetCandlestickDimensionName(i - 1)); param.columns.Add(ChartCached.NumberToStr(param.value, param.numericFormatter)); paramList.Add(param); @@ -100,6 +100,7 @@ namespace XCharts.Runtime bool dataChanging = false; float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; double yMinValue = yAxis.context.minValue; double yMaxValue = yAxis.context.maxValue; var isYAxis = false; @@ -118,10 +119,10 @@ namespace XCharts.Runtime var state = SerieHelper.GetSerieState(serie, serieData); var itemStyle = SerieHelper.GetItemStyle(serie, serieData, state); var startDataIndex = serieData.data.Count > 4 ? 1 : 0; - var open = serieData.GetCurrData(startDataIndex, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var close = serieData.GetCurrData(startDataIndex + 1, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var lowest = serieData.GetCurrData(startDataIndex + 2, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var heighest = serieData.GetCurrData(startDataIndex + 3, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); + var open = serieData.GetCurrData(startDataIndex, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var close = serieData.GetCurrData(startDataIndex + 1, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var lowest = serieData.GetCurrData(startDataIndex + 2, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var heighest = serieData.GetCurrData(startDataIndex + 3, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); var isRise = yAxis.inverse ? close open; var borderWidth = open == 0 ? 0f : (itemStyle.runtimeBorderWidth == 0 ? theme.serie.candlestickBorderWidth : diff --git a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs index 7362e142..924bc692 100644 --- a/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs +++ b/Runtime/Serie/Candlestick/SimplifiedCandlestickHandler.cs @@ -100,6 +100,7 @@ namespace XCharts.Runtime bool dataChanging = false; float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; double yMinValue = yAxis.context.minValue; double yMaxValue = yAxis.context.maxValue; var isYAxis = false; @@ -117,10 +118,10 @@ namespace XCharts.Runtime continue; } var startDataIndex = serieData.data.Count > 4 ? 1 : 0; - var open = serieData.GetCurrData(startDataIndex, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var close = serieData.GetCurrData(startDataIndex + 1, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var lowest = serieData.GetCurrData(startDataIndex + 2, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); - var heighest = serieData.GetCurrData(startDataIndex + 3, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue); + var open = serieData.GetCurrData(startDataIndex, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var close = serieData.GetCurrData(startDataIndex + 1, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var lowest = serieData.GetCurrData(startDataIndex + 2, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); + var heighest = serieData.GetCurrData(startDataIndex + 3, dataChangeDuration, yAxis.inverse, yMinValue, yMaxValue, unscaledTime); var isRise = yAxis.inverse ? close open; var borderWidth = open == 0 ? 0f : (itemStyle.runtimeBorderWidth == 0 ? theme.serie.candlestickBorderWidth : diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index b3bf9ba4..45984f16 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -206,6 +206,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(0, xCount); var animationIndex = serie.animation.GetCurrIndex(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var dataChanging = false; serie.containerIndex = m_SerieGrid.index; serie.containterInstanceId = m_SerieGrid.instanceId; @@ -242,7 +243,7 @@ namespace XCharts.Runtime var isRectSymbol = symbol.type == SymbolType.Rect; SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state); var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse, - yAxis.context.minValue, yAxis.context.maxValue); + yAxis.context.minValue, yAxis.context.maxValue, unscaledTime); if (serieData.IsDataChanged()) dataChanging = true; var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth); diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index d5364dc5..615c574c 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -287,6 +287,7 @@ namespace XCharts.Runtime DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); var dataChanging = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var interacting = false; var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth); @@ -321,7 +322,7 @@ namespace XCharts.Runtime var np = Vector3.zero; var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse); var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, - maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis); + maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime); serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue, i, scaleWid, isStack, ref np); diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 89d15938..d480010b 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -174,6 +174,7 @@ namespace XCharts.Runtime DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate); var dataChanging = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var interacting = false; var lineWidth = LineHelper.GetLineWidth(ref interacting, serie, chart.theme.serie.lineWidth); @@ -200,7 +201,7 @@ namespace XCharts.Runtime var np = Vector3.zero; var xValue = axis.IsCategory() ? i : serieData.GetData(0, axis.inverse); var relativedValue = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, - maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis); + maxCount, totalAverage, i, dataChangeDuration, ref dataChanging, relativedAxis, unscaledTime); serieData.context.stackHeight = GetDataPoint(isY, axis, relativedAxis, m_SerieGrid, xValue, relativedValue, i, scaleWid, false, ref np); diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index 3be3b1c9..1b8322ae 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -191,6 +191,7 @@ namespace XCharts.Runtime sd.context.canShowLabel = false; } float dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; bool isAllZeroValue = SerieHelper.IsAllZeroValue(serie, 1); var dataTotalFilterMinAngle = runtimePieDataTotal; if (isAllZeroValue) @@ -208,7 +209,7 @@ namespace XCharts.Runtime for (int n = 0; n < data.Count; n++) { var serieData = data[n]; - var value = isAllZeroValue ? zeroReplaceValue : serieData.GetCurrData(1, dataChangeDuration); + var value = isAllZeroValue ? zeroReplaceValue : serieData.GetCurrData(1, dataChangeDuration, unscaledTime); serieData.context.startAngle = startDegree; serieData.context.toAngle = startDegree; serieData.context.halfAngle = startDegree; diff --git a/Runtime/Serie/Radar/RadarHandler.cs b/Runtime/Serie/Radar/RadarHandler.cs index 73ad790f..bcfffa56 100644 --- a/Runtime/Serie/Radar/RadarHandler.cs +++ b/Runtime/Serie/Radar/RadarHandler.cs @@ -221,6 +221,7 @@ namespace XCharts.Runtime var dataChanging = false; var interacting = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; SerieHelper.GetAllMinMaxData(serie, m_RadarCoord.ceilRate); Color32 areaColor, areaToColor; for (int j = 0; j < serie.data.Count; j++) @@ -246,7 +247,7 @@ namespace XCharts.Runtime if (n >= serieData.data.Count) break; var min = m_RadarCoord.GetIndicatorMin(n); var max = m_RadarCoord.GetIndicatorMax(n); - var value = serieData.GetCurrData(n, dataChangeDuration); + var value = serieData.GetCurrData(n, dataChangeDuration, unscaledTime); if (serieData.IsDataChanged()) dataChanging = true; if (max == 0) { @@ -361,6 +362,7 @@ namespace XCharts.Runtime var rate = serie.animation.GetCurrRate(); var dataChanging = false; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var startIndex = GetStartShowIndex(serie); var endIndex = GetEndShowIndex(serie); SerieHelper.UpdateMinMaxData(serie, 1, m_RadarCoord.ceilRate); @@ -383,7 +385,7 @@ namespace XCharts.Runtime var index = serieData.index; var p = m_RadarCoord.context.center; var max = m_RadarCoord.GetIndicatorMax(index); - var value = serieData.GetCurrData(1, dataChangeDuration); + var value = serieData.GetCurrData(1, dataChangeDuration, unscaledTime); if (serieData.IsDataChanged()) dataChanging = true; if (max == 0) { diff --git a/Runtime/Serie/Ring/RingHandler.cs b/Runtime/Serie/Ring/RingHandler.cs index c90a7db3..8c7828ba 100644 --- a/Runtime/Serie/Ring/RingHandler.cs +++ b/Runtime/Serie/Ring/RingHandler.cs @@ -182,6 +182,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(serie.startAngle, serie.startAngle + 360); SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var ringWidth = serie.context.outsideRadius - serie.context.insideRadius; var dataChanging = false; for (int j = 0; j < data.Count; j++) @@ -189,7 +190,7 @@ namespace XCharts.Runtime var serieData = data[j]; if (!serieData.show) continue; if (serieData.IsDataChanged()) dataChanging = true; - var value = serieData.GetFirstData(dataChangeDuration); + var value = serieData.GetFirstData(unscaledTime, dataChangeDuration); var max = serieData.GetLastData(); var degree = (float) (360 * value / max); var startDegree = GetStartAngle(serie); diff --git a/Runtime/Serie/Scatter/BaseScatterHandler.cs b/Runtime/Serie/Scatter/BaseScatterHandler.cs index 8d8f0220..b2d3306a 100644 --- a/Runtime/Serie/Scatter/BaseScatterHandler.cs +++ b/Runtime/Serie/Scatter/BaseScatterHandler.cs @@ -135,6 +135,7 @@ namespace XCharts.Runtime serie.animation.InitProgress(0, 1); var rate = serie.animation.GetCurrRate(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var dataChanging = false; var interacting = false; var dataList = serie.GetDataList(xDataZoom); @@ -157,8 +158,8 @@ namespace XCharts.Runtime SerieHelper.GetItemColor(out color, out toColor, out emptyColor, serie, serieData, chart.theme, colorIndex, state); SerieHelper.GetSymbolInfo(out borderColor, out symbolBorder, out cornerRadius, serie, serieData, chart.theme, state); - double xValue = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse); - double yValue = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse); + double xValue = serieData.GetCurrData(0, dataChangeDuration, unscaledTime, xAxis.inverse); + double yValue = serieData.GetCurrData(1, dataChangeDuration, unscaledTime, yAxis.inverse); if (serieData.IsDataChanged()) dataChanging = true; @@ -238,6 +239,7 @@ namespace XCharts.Runtime var rate = serie.animation.GetCurrRate(); var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var dataChanging = false; var dataList = serie.GetDataList(xDataZoom); var isEffectScatter = serie is EffectScatter; @@ -263,7 +265,7 @@ namespace XCharts.Runtime dataChanging = true; var pos = Vector3.zero; - var xValue = serieData.GetCurrData(0, dataChangeDuration, axis.inverse); + var xValue = serieData.GetCurrData(0, dataChangeDuration, unscaledTime, axis.inverse); if (axis.orient == Orient.Horizonal) { diff --git a/Runtime/Serie/Scatter/EffectScatterHandler.cs b/Runtime/Serie/Scatter/EffectScatterHandler.cs index 0ace1597..d7d86bf1 100644 --- a/Runtime/Serie/Scatter/EffectScatterHandler.cs +++ b/Runtime/Serie/Scatter/EffectScatterHandler.cs @@ -11,9 +11,10 @@ namespace XCharts.Runtime { base.Update(); var symbolSize = serie.symbol.GetSize(null, chart.theme.serie.scatterSymbolSize); + var deltaTime = serie.animation.unscaledTime? Time.unscaledDeltaTime : Time.deltaTime; for (int i = 0; i < serie.symbol.animationSize.Count; ++i) { - serie.symbol.animationSize[i] += m_EffectScatterSpeed * Time.deltaTime; + serie.symbol.animationSize[i] += m_EffectScatterSpeed * deltaTime; if (serie.symbol.animationSize[i] > symbolSize) { serie.symbol.animationSize[i] = i * 5; diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index d1ca38c6..9940bf26 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -247,7 +247,7 @@ namespace XCharts.Runtime [SerializeField] private float m_SampleAverage = 0; [SerializeField] private LineType m_LineType = LineType.Normal; - [SerializeField][Since("v3.3.1")] private bool m_SmoothLimit = true; + [SerializeField][Since("v3.4.0")] private bool m_SmoothLimit = true; [SerializeField] private BarType m_BarType = BarType.Normal; [SerializeField] private bool m_BarPercentStack = false; [SerializeField] private float m_BarWidth = 0; @@ -1136,10 +1136,11 @@ namespace XCharts.Runtime else { var duration = animation.GetUpdateAnimationDuration(); + var unscaledTime = animation.unscaledTime; foreach (var sdata in data) { if (sdata.show && !IsIgnoreValue(sdata.data[1])) - total += sdata.GetCurrData(1, duration); + total += sdata.GetCurrData(1, duration, unscaledTime); } } return total; @@ -1459,7 +1460,7 @@ namespace XCharts.Runtime var serieData = GetDataList(dataZoom); if (index < serieData.Count) { - var value = serieData[index].GetCurrData(1, animation.GetUpdateAnimationDuration()); + var value = serieData[index].GetCurrData(1, animation.GetUpdateAnimationDuration(), animation.unscaledTime); if (showAsPositiveNumber) value = Math.Abs(value); return value; @@ -1622,7 +1623,8 @@ namespace XCharts.Runtime { var animationOpen = animation.enable; var animationDuration = animation.GetUpdateAnimationDuration(); - var flag = m_Data[index].UpdateData(dimension, value, animationOpen, animationDuration); + var unscaledTime = animation.unscaledTime; + var flag = m_Data[index].UpdateData(dimension, value, animationOpen, unscaledTime, animationDuration); if (flag) { SetVerticesDirty(); @@ -1648,8 +1650,9 @@ namespace XCharts.Runtime var serieData = m_Data[index]; var animationOpen = animation.enable; var animationDuration = animation.GetUpdateAnimationDuration(); + var unscaledTime = animation.unscaledTime; for (int i = 0; i < values.Count; i++) - serieData.UpdateData(i, values[i], animationOpen, animationDuration); + serieData.UpdateData(i, values[i], animationOpen, unscaledTime, animationDuration); SetVerticesDirty(); dataDirty = true; return true; diff --git a/Runtime/Serie/SerieData.cs b/Runtime/Serie/SerieData.cs index 0b0e10bd..081cf9b2 100644 --- a/Runtime/Serie/SerieData.cs +++ b/Runtime/Serie/SerieData.cs @@ -381,9 +381,9 @@ namespace XCharts.Runtime else return 0; } - public double GetFirstData(float animationDuration = 500f) + public double GetFirstData(bool unscaledTime, float animationDuration = 500f) { - if (m_Data.Count > 0) return GetCurrData(0, animationDuration); + if (m_Data.Count > 0) return GetCurrData(0, animationDuration, unscaledTime); return 0; } @@ -393,23 +393,23 @@ namespace XCharts.Runtime return 0; } - public double GetCurrData(int index, float animationDuration = 500f, bool inverse = false) + public double GetCurrData(int index, float animationDuration = 500f, bool unscaledTime = false, bool inverse = false) { - return GetCurrData(index, animationDuration, inverse, 0, 0); + return GetCurrData(index, animationDuration, inverse, 0, 0, unscaledTime); } - public double GetCurrData(int index, float animationDuration, bool inverse, double min, double max) + public double GetCurrData(int index, float animationDuration, bool inverse, double min, double max, bool unscaledTime) { if (index < m_DataUpdateFlag.Count && m_DataUpdateFlag[index] && animationDuration > 0) { - var time = Time.time - m_DataUpdateTime[index]; + var time = (unscaledTime ? Time.unscaledTime : Time.time) - m_DataUpdateTime[index]; var total = animationDuration / 1000; var rate = time / total; if (rate > 1) rate = 1; if (rate < 1) { - CheckLastData(); + CheckLastData(unscaledTime); var curr = MathUtil.Lerp(GetPreviousData(index), GetData(index), rate); if (min != 0 || max != 0) { @@ -503,14 +503,14 @@ namespace XCharts.Runtime return total; } - public bool UpdateData(int dimension, double value, bool updateAnimation, float animationDuration = 500f) + public bool UpdateData(int dimension, double value, bool updateAnimation, bool unscaledTime, float animationDuration = 500f) { if (dimension >= 0 && dimension < data.Count) { - CheckLastData(); - m_PreviousData[dimension] = GetCurrData(dimension, animationDuration); + CheckLastData(unscaledTime); + m_PreviousData[dimension] = GetCurrData(dimension, animationDuration, unscaledTime); //m_PreviousData[dimension] = data[dimension];; - m_DataUpdateTime[dimension] = Time.time; + m_DataUpdateTime[dimension] = (unscaledTime ? Time.unscaledTime : Time.time); m_DataUpdateFlag[dimension] = updateAnimation; data[dimension] = value; return true; @@ -528,7 +528,7 @@ namespace XCharts.Runtime return false; } - private void CheckLastData() + private void CheckLastData(bool unscaledTime) { if (m_PreviousData.Count != m_Data.Count) { @@ -538,7 +538,7 @@ namespace XCharts.Runtime for (int i = 0; i < m_Data.Count; i++) { m_PreviousData.Add(m_Data[i]); - m_DataUpdateTime.Add(Time.time); + m_DataUpdateTime.Add((unscaledTime ? Time.unscaledTime : Time.time)); m_DataUpdateFlag.Add(false); } } diff --git a/Runtime/Serie/SerieHandler.cs b/Runtime/Serie/SerieHandler.cs index 0b8a53fb..abd8863a 100644 --- a/Runtime/Serie/SerieHandler.cs +++ b/Runtime/Serie/SerieHandler.cs @@ -368,6 +368,7 @@ namespace XCharts.Runtime return; var dataChangeDuration = serie.animation.GetUpdateAnimationDuration(); + var unscaledTime = serie.animation.unscaledTime; var needCheck = serie.context.dataIndexs.Count > 0; foreach (var serieData in serie.data) { @@ -395,7 +396,7 @@ namespace XCharts.Runtime { if (i >= serieData.context.dataPoints.Count) continue; var labelObject = serieData.context.dataLabels[i]; - var value = serieData.GetCurrData(i, dataChangeDuration); + var value = serieData.GetCurrData(i, dataChangeDuration, unscaledTime); var content = string.IsNullOrEmpty(currLabel.formatter) ? ChartCached.NumberToStr(value, currLabel.numericFormatter) : SerieLabelHelper.GetFormatterContent(serie, serieData, value, total, @@ -415,7 +416,7 @@ namespace XCharts.Runtime } else { - var value = serieData.GetCurrData(defaultDimension, dataChangeDuration); + var value = serieData.GetCurrData(defaultDimension, dataChangeDuration, unscaledTime); var total = serie.GetDataTotal(defaultDimension, serieData); var color = chart.GetItemColor(serie, serieData); var content = string.IsNullOrEmpty(currLabel.formatter) ? diff --git a/Runtime/Serie/SeriesHelper.cs b/Runtime/Serie/SeriesHelper.cs index d3e9c244..d643ad06 100644 --- a/Runtime/Serie/SeriesHelper.cs +++ b/Runtime/Serie/SeriesHelper.cs @@ -339,6 +339,7 @@ namespace XCharts.Runtime (!isPolar && serie.yAxisIndex != axisIndex) || !serie.show) continue; var updateDuration = serie.animation.enable?serie.animation.dataChangeDuration : 0; + var unscaledTime = serie.animation.unscaledTime; if (isPercentStack && SeriesHelper.IsPercentStack(series, serie.serieName)) { if (100 > max) max = 100; @@ -363,7 +364,7 @@ namespace XCharts.Runtime foreach (var data in showData) { var currData = performanceMode? data.GetData(yValue?1 : 0, inverse): - data.GetCurrData(yValue ? 1 : 0, updateDuration, inverse); + data.GetCurrData(yValue ? 1 : 0, updateDuration, unscaledTime, inverse); if (!serie.IsIgnoreValue(currData)) { if (currData > max) max = currData;