diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index cf4b0f9e..566b8340 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -73,6 +73,7 @@ slug: /changelog 日志详情: +* (2023.07.26) 增加`MLValue`多样式数值 * (2023.07.25) 增加`XLog`日志系统 * (2023.07.18) 完善`Pie`饼图的交互动画效果 * (2023.07.14) 增加`Animation`的`Interaction`交互动画配置支持 diff --git a/Editor/ChildComponents/AnimationDrawer.cs b/Editor/ChildComponents/AnimationDrawer.cs index 53fc5af0..4e28aa5d 100644 --- a/Editor/ChildComponents/AnimationDrawer.cs +++ b/Editor/ChildComponents/AnimationDrawer.cs @@ -60,8 +60,8 @@ namespace XCharts.Editor { ++EditorGUI.indentLevel; PropertyField(prop, "m_Duration"); - PropertyField(prop, "m_WidthRate"); - PropertyField(prop, "m_RadiusRate"); + PropertyField(prop, "m_Width"); + PropertyField(prop, "m_Radius"); PropertyField(prop, "m_Offset"); --EditorGUI.indentLevel; } diff --git a/Editor/ChildComponents/MLValueDrawer.cs b/Editor/ChildComponents/MLValueDrawer.cs new file mode 100644 index 00000000..fe515641 --- /dev/null +++ b/Editor/ChildComponents/MLValueDrawer.cs @@ -0,0 +1,27 @@ +using UnityEditor; +using UnityEngine; +using XCharts.Runtime; + +namespace XCharts.Editor +{ + + [CustomPropertyDrawer(typeof(MLValue), true)] + public class MLValueDrawer : BasePropertyDrawer + { + public override void OnGUI(Rect pos, SerializedProperty prop, GUIContent label) + { + Rect drawRect = pos; + drawRect.height = EditorGUIUtility.singleLineHeight; + SerializedProperty m_Percent = prop.FindPropertyRelative("m_Type"); + SerializedProperty m_Color = prop.FindPropertyRelative("m_Value"); + + ChartEditorHelper.MakeTwoField(ref drawRect, drawRect.width, m_Percent, m_Color, prop.displayName); + drawRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + } + + public override float GetPropertyHeight(SerializedProperty prop, GUIContent label) + { + return 1 * EditorGUIUtility.singleLineHeight + 1 * EditorGUIUtility.standardVerticalSpacing; + } + } +} \ No newline at end of file diff --git a/Editor/ChildComponents/MLValueDrawer.cs.meta b/Editor/ChildComponents/MLValueDrawer.cs.meta new file mode 100644 index 00000000..e551a920 --- /dev/null +++ b/Editor/ChildComponents/MLValueDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 364b6129b88e14605b1a1454b7bf876b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Component/Animation/AnimationInfo.cs b/Runtime/Component/Animation/AnimationInfo.cs index b0ca43c7..37ad59c2 100644 --- a/Runtime/Component/Animation/AnimationInfo.cs +++ b/Runtime/Component/Animation/AnimationInfo.cs @@ -412,30 +412,44 @@ namespace XCharts.Runtime [System.Serializable] public class AnimationInteraction : AnimationInfo { - [SerializeField][Since("v3.8.0")] private float m_WidthRate = 1.1f; - [SerializeField][Since("v3.8.0")] private float m_RadiusRate = 1.1f; - [SerializeField][Since("v3.8.0")] private float m_Offset = 5f; + [SerializeField][Since("v3.8.0")] private MLValue m_Width = new MLValue(1.1f); + [SerializeField][Since("v3.8.0")] private MLValue m_Radius = new MLValue(1.1f); + [SerializeField][Since("v3.8.0")] private MLValue m_Offset = new MLValue(MLValue.Type.Absolute, 5f); /// - /// the size rate of the width. - /// |宽度的放大倍率。 + /// the mlvalue of width. + /// |宽度的多样式数值。 /// - public float widthRate { get { return m_WidthRate; } set { m_WidthRate = value; } } + public MLValue width { get { return m_Width; } set { m_Width = value; } } /// - /// the size rate of the radius. - /// |半径的放大倍率。 + /// the mlvalue of radius. + /// |半径的多样式数值。 /// - public float radiusRate { get { return m_RadiusRate; } set { m_RadiusRate = value; } } + public MLValue radius { get { return m_Radius; } set { m_Radius = value; } } /// - /// the offset when interaction. Such as the offset of the pie chart when the sector is selected. - /// |交互时的偏移。如饼图的扇形选中时的偏移。 + /// the mlvalue of offset. Such as the offset of the pie chart when the sector is selected. + /// |交互的多样式数值。如饼图的扇形选中时的偏移。 /// - public float offset { get { return m_Offset; } set { m_Offset = value; } } - + public MLValue offset { get { return m_Offset; } set { m_Offset = value; } } public float GetRadius(float radius) { - return radius * radiusRate; + return m_Radius.GetValue(radius); + } + + public float GetWidth(float width) + { + return m_Width.GetValue(width); + } + + public float GetOffset(float total) + { + return m_Offset.GetValue(total); + } + + public float GetOffset() + { + return m_Offset.value; } } } \ No newline at end of file diff --git a/Runtime/Component/Child/MLValue.cs b/Runtime/Component/Child/MLValue.cs new file mode 100644 index 00000000..4b8dd16a --- /dev/null +++ b/Runtime/Component/Child/MLValue.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace XCharts.Runtime +{ + /// + /// 多样式数值。 + /// + [Since("v3.8.0")] + [System.Serializable] + public class MLValue : ChildComponent + { + public enum Type + { + /// + /// Percent form. + /// |百分比形式。 + /// + Percent, + /// + /// Absolute form. + /// |绝对值形式。 + /// + Absolute, + /// + /// Extra form. + /// |额外形式。 + /// + Extra + } + [SerializeField] private Type m_Type; + [SerializeField] private float m_Value; + + public Type type { get { return m_Type; } set { m_Type = value; } } + public float value { get { return m_Value; } set { m_Value = value; } } + + public MLValue(Type type, float value) + { + m_Type = type; + m_Value = value; + } + + public MLValue(float value) + { + m_Type = Type.Percent; + m_Value = value; + } + + public float GetValue(float total) + { + switch (m_Type) + { + case Type.Percent: + return m_Value * total; + case Type.Absolute: + return m_Value; + case Type.Extra: + return total + m_Value; + default: return 0; + } + } + } +} \ No newline at end of file diff --git a/Runtime/Component/Child/MLValue.cs.meta b/Runtime/Component/Child/MLValue.cs.meta new file mode 100644 index 00000000..194febee --- /dev/null +++ b/Runtime/Component/Child/MLValue.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10f15d7e58cf24fa6a1986793ba2a36b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs index 04688c44..278196ac 100644 --- a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs +++ b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs @@ -53,7 +53,7 @@ namespace XCharts.Runtime if (m_LegendEnter) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.PolarCoord.cs b/Runtime/Serie/Heatmap/HeatmapHandler.PolarCoord.cs index 6b225c37..f32cfb26 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.PolarCoord.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.PolarCoord.cs @@ -53,7 +53,7 @@ namespace XCharts.Runtime if (m_LegendEnter) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index 90a569ca..e5598134 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -61,7 +61,7 @@ namespace XCharts.Runtime if (m_LegendEnter) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; @@ -73,7 +73,7 @@ namespace XCharts.Runtime else if (serie.context.isTriggerByAxis) { serie.context.pointerEnter = false; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; @@ -116,7 +116,7 @@ namespace XCharts.Runtime needInteract = true; } if (serie.context.pointerItemDataIndex >= 0) - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); else serie.interact.SetValue(ref needInteract, lineWidth); } diff --git a/Runtime/Serie/Line/LineHandler.PolarCoord.cs b/Runtime/Serie/Line/LineHandler.PolarCoord.cs index 41f0dd34..d66c1b0b 100644 --- a/Runtime/Serie/Line/LineHandler.PolarCoord.cs +++ b/Runtime/Serie/Line/LineHandler.PolarCoord.cs @@ -53,7 +53,7 @@ namespace XCharts.Runtime if (m_LegendEnter) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; diff --git a/Runtime/Serie/Line/SimplifiedLineHandler.cs b/Runtime/Serie/Line/SimplifiedLineHandler.cs index 40348d7d..9e9ee788 100644 --- a/Runtime/Serie/Line/SimplifiedLineHandler.cs +++ b/Runtime/Serie/Line/SimplifiedLineHandler.cs @@ -72,7 +72,7 @@ namespace XCharts.Runtime if (m_LegendEnter) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; @@ -84,7 +84,7 @@ namespace XCharts.Runtime else if (serie.context.isTriggerByAxis) { serie.context.pointerEnter = true; - serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.widthRate); + serie.interact.SetValue(ref needInteract, lineWidth, true, serie.animation.interaction.GetWidth(lineWidth)); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.data[i]; diff --git a/Runtime/Serie/Pie/PieHandler.cs b/Runtime/Serie/Pie/PieHandler.cs index d7114719..bf4c846e 100644 --- a/Runtime/Serie/Pie/PieHandler.cs +++ b/Runtime/Serie/Pie/PieHandler.cs @@ -229,23 +229,24 @@ namespace XCharts.Runtime serie.context.outsideRadius; var offset = 0f; + var interactOffset = serie.animation.interaction.GetOffset(serie.context.outsideRadius); if (serie.pieClickOffset && (serieData.selected || serieData.context.selected)) { - offset += serie.animation.interaction.offset; + offset += interactOffset; } if (offset > 0) { - serieData.context.outsideRadius += serie.animation.interaction.offset; + serieData.context.outsideRadius += interactOffset; var currRad = serieData.context.halfAngle * Mathf.Deg2Rad; var currSin = Mathf.Sin(currRad); var currCos = Mathf.Cos(currRad); serieData.context.offsetRadius = 0; if (serie.pieClickOffset && (serieData.selected || serieData.context.selected)) { - serieData.context.offsetRadius += serie.animation.interaction.offset; + serieData.context.offsetRadius += interactOffset; if (serieData.context.insideRadius > 0) { - serieData.context.insideRadius += serie.animation.interaction.offset; + serieData.context.insideRadius += interactOffset; } } serieData.context.offsetCenter = new Vector3( @@ -512,7 +513,8 @@ namespace XCharts.Runtime return -1; var dist = Vector2.Distance(local, serie.context.center); - var maxRadius = serie.context.outsideRadius + 3 * serie.animation.interaction.offset; + var interactOffset = serie.animation.interaction.GetOffset(serie.context.outsideRadius); + var maxRadius = serie.context.outsideRadius + 2 * interactOffset; if (dist < serie.context.insideRadius || dist > maxRadius) return -1; diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 9c351243..8d4fccf4 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -688,7 +688,7 @@ namespace XCharts.Runtime { case SerieState.Emphasis: case SerieState.Select: - size *= serie.animation.interaction.radiusRate; + size = serie.animation.interaction.GetRadius(size); break; default: break;