public override void StartKinetic(VisualPayload payload, Func <float, float> translateTime) { var transitionTimeInverse = 1f / TransitionDuration.GetFirstValue(payload.Data); var startTime = StartTime.GetFirstValue(payload.Data); var startParent = payload.VisualData.Bound.transform.parent; var localStart = payload.VisualData.Bound.transform.localPosition; var targetBound = TargetBound.GetFirstValue(payload.Data); var bound = payload.VisualData.Bound.CreateDependingBound("Lerp to Target"); bound.transform.parent = targetBound.transform; bound.transform.position = StartPosition.GetFirstValue(payload.Data); payload.VisualData.Bound.transform.parent = bound.transform; payload.VisualData.Bound.transform.localPosition = Vector3.zero; var movementSatellite = bound.gameObject.AddComponent <BoundMovementSatellite>(); var newPayload = new VisualPayload(payload.Data, new VisualDescription(bound)); movementSatellite.MovementFunc = (trans) => { float proportion = (Time.time - startTime) * transitionTimeInverse; if (proportion >= 1) { trans.position = targetBound.transform.position; movementSatellite.Cleanup(); return; } proportion = translateTime(proportion); var startPos = startParent.PiecewiseMultiply(localStart); var endPos = targetBound.transform.position; trans.position = Vector3.Lerp(startPos, endPos, proportion); }; movementSatellite.CleanupFunc = (trans) => { JobManager.Instance.StartJob( Finished.Transmit(newPayload), jobName: "Kinetic Finished", startImmediately: true, maxExecutionsPerFrame: 1); }; // execute first step immediately to set initial position movementSatellite.MovementFunc(movementSatellite.transform); }
public override void StartKinetic(VisualPayload payload, Func <float, float> translateTime) { var startRotation = StartRotation.GetFirstValue(payload.Data); var endRotation = EndRotation.GetFirstValue(payload.Data); var transitionTimeInverse = 1f / TransitionDuration.GetFirstValue(payload.Data); var startTime = StartTime.GetFirstValue(payload.Data); var bound = payload.VisualData.Bound.CreateDependingBound("Lerp Rotation"); bound.transform.parent = payload.VisualData.Bound.transform.parent; payload.VisualData.Bound.transform.parent = bound.transform; var rotationSatellite = bound.gameObject.AddComponent <BoundMovementSatellite>(); var newPayload = new VisualPayload(payload.Data, new VisualDescription(bound)); rotationSatellite.MovementFunc = (trans) => { float proportion = (Time.time - startTime) * transitionTimeInverse; if (proportion >= 1) { trans.rotation = endRotation; rotationSatellite.Cleanup(); return; } proportion = translateTime(proportion); trans.rotation = Quaternion.Lerp(startRotation, endRotation, proportion); }; rotationSatellite.CleanupFunc = (trans) => { JobManager.Instance.StartJob( Finished.Transmit(newPayload), jobName: "Kinetic Finished", startImmediately: true, maxExecutionsPerFrame: 1); }; // execute first step immediately to set initial position rotationSatellite.MovementFunc(rotationSatellite.transform); //throw new System.NotImplementedException(); }