diff --git a/src/LitMotion/Assets/LitMotion/Runtime/MotionSequenceBuilder.cs b/src/LitMotion/Assets/LitMotion/Runtime/MotionSequenceBuilder.cs index c4494013..e4afd2ee 100644 --- a/src/LitMotion/Assets/LitMotion/Runtime/MotionSequenceBuilder.cs +++ b/src/LitMotion/Assets/LitMotion/Runtime/MotionSequenceBuilder.cs @@ -39,6 +39,7 @@ public static void Return(MotionSequenceBuilderSource source) MotionSequenceBuilderSource next; ushort version; MotionSequenceItem[] buffer; + Ease ease; int count; double tail; double lastTail; @@ -70,10 +71,16 @@ public void Join(MotionHandle handle) Insert(lastTail, handle); } + public void WithEase(Ease ease) + { + this.ease = ease; + } + public MotionHandle Schedule(Action> configuration) { var source = MotionSequenceSource.Rent(); var builder = LMotion.Create(0.0, duration, (float)duration) + .WithEase(ease) .WithOnComplete(source.OnCompleteDelegate) .WithOnCancel(source.OnCancelDelegate); @@ -148,6 +155,14 @@ public readonly MotionSequenceBuilder Join(MotionHandle handle) return this; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public readonly MotionSequenceBuilder WithEase(Ease ease) + { + CheckIsDisposed(); + source.WithEase(ease); + return this; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public MotionHandle Run() { diff --git a/src/LitMotion/Assets/LitMotion/Tests/Runtime/SequenceTest.cs b/src/LitMotion/Assets/LitMotion/Tests/Runtime/SequenceTest.cs index 6a629b87..dd41452d 100644 --- a/src/LitMotion/Assets/LitMotion/Tests/Runtime/SequenceTest.cs +++ b/src/LitMotion/Assets/LitMotion/Tests/Runtime/SequenceTest.cs @@ -193,5 +193,41 @@ public void Test_Error_UseMotionHandleInSequence() handle.Time = 0; }, "Cannot access the motion in sequence."); } + + [UnityTest] + public IEnumerator Test_SequenceWithEase() + { + var x1 = 0f; + var x2 = 0f; + Ease ease = Ease.InExpo; + + var motionHandle = LSequence.Create() + .Append(LMotion.Create(0f, 1f, 5f).Bind(v => x1 = v)) + .Append(LMotion.Create(0f, 1f, 5f).Bind(v => x2 = v)) + .WithEase(ease) + .Run(); + + motionHandle.Preserve(); + + for (int i = 1; i <= 10; i++) + { + yield return new WaitForSeconds(1f); + float sequenceProgress = (float)motionHandle.Time / 10f; + float sequenceEasedTime = EaseUtility.Evaluate(sequenceProgress, ease); + Assert.AreEqual(GetX1Time(sequenceEasedTime), x1, 0.01f, $"iteration: {i}"); + Assert.AreEqual(GetX2Time(sequenceEasedTime), x2, 0.01f, $"iteration: {i}"); + } + yield break; + + float GetX1Time(float time) + { + return Mathf.Clamp01(time / 0.5f); + } + + float GetX2Time(float time) + { + return Mathf.Clamp01((time - 0.5f) / 0.5f); + } + } } }