Readme
What
- Rx Tween Animation Library for Unity
Requirements
Examples
Basic

Move from (-5,0,0) to (5,0,0) at 4m / s.
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Motion.Uniform(4f))
.Subscribe(x => cube.transform.position = x);
//.SubscribeToPosition(cube);
Method Chain

Move from (-5,0,0) to (5,0,0) and then move to (0,3,0) at a constant speed. When this method is used, the change in value stops for one frame between the first movement and the second movement. Use the following Path method to move smoothly.
var tween = Motion.Uniform(5f);
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), tween)
.Play(new Vector3(0f, 3f, 0f), tween)
.SubscribeToPosition(cube);
Easing

Move in 2 seconds with EaseOutQuad.
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Easing.OutQuad(2f))
.SubscribeToPosition(cube);
Sleep

After moving, it starts again after 1 second.
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(0f, 0f, 0f), Easing.OutExpo(2f))
.Sleep(1f)
.Play(new Vector3(5f, 0f, 0f), Easing.OutExpo(2f))
.SubscribeToPosition(cube);
Path

Move to the specified position in order.
var positions = new[]
{
new Vector3(-5f, 0f, 0f),
new Vector3(0f, 3f, 0f),
new Vector3(5f, 0f, 0f),
new Vector3(0f, -3f, 0f),
new Vector3(-5f, 0f, 0f),
};
Tweener.Play(positions, Easing.InOutSine(6f))
.SubscribeToPosition(cube);
Combine

Each x, y, z coordinate is animated separately and synthesized.
var x = Tweener.Play(-5f, 5f, Easing.InOutSine(3f));
var y = Tweener.Play(0f, 3f, Easing.InOutSine(1.5f))
.Play(0f, Easing.InOutSine(1.5f));
var z = Tweener.Stay(0f);
Observable.CombineLatest(x, y, z)
.SubscribeToPosition(cube);
AnimationCurve

Move using UnityEngine.AnimationCurve.
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Motion.From(curve, 3f))
.SubscribeToPosition(cube);
Extensions

Move from cube.transform.position to (3,3,0).
cube.transform.position
.Play(new Vector3(3f, 3f, 0f), Easing.OutBack(2f))
.SubscribeToPosition(cube);
Circle

Convert IObservble
Tweener.Play(0f, Mathf.PI * 2f, Easing.OutCubic(3f))
.Select(x => new Vector3(Mathf.Sin(x), Mathf.Cos(x), 0.0f))
.Select(x => x * 3f)
.SubscribeToPosition(cube);
Range / Lerp

Follow along halfway. Follow only a specific range.
var flow = Tweener.Play(Easing.InOutExpo(2.5f))
.Stop(0.5f)
.Play(1.0f, 0.0f, Easing.InOutExpo(2.5f));
flow
.Range(0.0f, 0.5f)
.Lerp(new Vector3(-5f, 0f, 0f), new Vector3(0f, 0f, 0f))
.SubscribeToPosition(cube2);
flow
.Lerp(new Vector3(-5f, -1f, 0f), new Vector3(5f, -1f, 0f))
.SubscribeToPosition(cube);
PlayIn/PlayOut/PlayInOut

From animation to constant speed movement.
Tweener.PlayIn(-5f, 0f, 5f, Easing.InCubic(1f))
.SubscribeToPositionX(cube);
Delay

Observable.Delay in UniRx
var circle = Tweener.Play(0f, Mathf.PI * 2f, Easing.OutCubic(3f))
.Select(x => new Vector3(Mathf.Sin(x), Mathf.Cos(x), 0.0f))
.Select(x => x * 3f);
circle
.SubscribeToPosition(cube);
circle
.Delay(0.3f)
.SubscribeToPosition(cube2);
circle
.Delay(0.55f)
.SubscribeToPosition(cube3);
Blend

Add the two moves together.
var circle = Tweener
.Play(Mathf.PI, Mathf.PI * 2f * 3f, Easing.InOutSine(3f))
.Select(x => new Vector3(Mathf.Sin(x), Mathf.Cos(x), 0f));
var straight = Tweener
.Play(-3f, 3f, Easing.InOutSine(3f))
.Select(x => new Vector3(0f, x, 0f));
Observable.CombineLatest(circle, straight)
.Sum()
.SubscribeToPosition(cube);
WhenAll

Use WhenAll to synchronize the animation.
var leftCube1 = Tweener
.Play(new Vector3(-5f, 0f, 0f), new Vector3(-0.5f, 0f, 0f), Easing.Linear(2.5f))
.DoToPosition(cube);
var rightCube1 = Tweener
.Play(new Vector3(5f, 0f, 0f), new Vector3(0.5f, 0f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube2);
var leftCube2 = Tweener
.Play(new Vector3(-0.5f, 0f, 0f), new Vector3(-0.5f, 3f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube);
var rightCube2 = Tweener
.Play(new Vector3(0.5f, 0f, 0f), new Vector3(0.5f, 3f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube2);
Observable.WhenAll(leftCube1, rightCube1)
.ContinueWith(Observable.WhenAll(leftCube2, rightCube2))
.Subscribe();
Subscribe onComplete
Tracking Tween complete using DoOnCompleted or override of method ex SubscribeToPosition, DoToPosition …
var tween = TweenMotion.Uniform(5f);
Tweener.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), tween).DoOnCompleted(() => Debug.Log("Complete part 1"))
.Play(new Vector3(5f, 3f, 0f), tween).DoOnCompleted(() => Debug.Log("Complete part 2"))
.SubscribeToPosition(cube);
var leftCube1 = Tweener
.Play(new Vector3(-5f, 0f, 0f), new Vector3(-0.5f, 0f, 0f), Easing.Linear(2.5f))
.DoToPosition(cube, () => Debug.Log("Complete left cube move x to -0.5f")).DoOnCompleted(() => Debug.Log("Do on complete left cube move x to -0.5f"));
var rightCube1 = Tweener
.Play(new Vector3(5f, 0f, 0f), new Vector3(0.5f, 0f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube2, () => Debug.Log("Complete right cube move x to 0.5f"));
var leftCube2 = Tweener
.Play(new Vector3(-0.5f, 0f, 0f), new Vector3(-0.5f, 3f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube);
var rightCube2 = Tweener
.Play(new Vector3(0.5f, 0f, 0f), new Vector3(0.5f, 3f, 0f), Easing.OutCubic(1f))
.DoToPosition(cube2);
Observable.WhenAll(leftCube1, rightCube1).DoOnCompleted(() => Debug.Log("Compelete both left cube and right cube"))
.ContinueWith(Observable.WhenAll(leftCube2, rightCube2)).DoOnCompleted(() => Debug.Log("COMPLETE"))
.Subscribe();
Dependencies
License
- Under the MIT license
- Some code is borrowed from @AnimeRx
- Thanks for kyubuns