public override void StartKinetic(VisualPayload payload, Func <float, float> translateTimeToEffectProportion) { var labelVis = payload.VisualData.Bound.GetComponent <LabelVisualizer>(); var startValue = StartValue.GetFirstValue(payload.Data); var endValue = EndValue.GetFirstValue(payload.Data); var transitionTimeInverse = 1f / TransitionTime.GetFirstValue(payload.Data);; var formatString = FormatString.GetFirstValue(payload.Data); var startTime = Time.time; var bound = payload.VisualData.Bound.CreateDependingBound("Lerp Value"); bound.transform.parent = payload.VisualData.Bound.transform.parent; payload.VisualData.Bound.transform.parent = bound.transform; var valueSatellite = bound.gameObject.AddComponent <SetLabelSatellite>(); valueSatellite.LabelVis = labelVis; var newPayload = new VisualPayload(payload.Data, new VisualDescription(bound)); valueSatellite.UpdateFunc = (label) => { float proportion = (Time.time - startTime) * transitionTimeInverse; if (proportion >= 1) { label.Text = string.Format(formatString, endValue); valueSatellite.Cleanup(); return; } proportion = translateTimeToEffectProportion(proportion); var currentValue = Mathf.Lerp(startValue, endValue, proportion); label.Text = string.Format(formatString, currentValue); }; valueSatellite.CleanupFunc = (label) => { JobManager.Instance.StartJob( Finished.Transmit(newPayload), jobName: "Kinetic Finished", startImmediately: true, maxExecutionsPerFrame: 1); }; //throw new NotImplementedException(); }