AnimeRx - Unity + RxでTweenアニメーションをつける!
github.comkyubuns/AnimeRx
UniRxガンガン使ってる方向けのTweenアニメーションライブラリです。
コンセプト
- アニメーションライブラリといいつつも、TransformやGameObjectは握らず、
素直に IObservable(float,Vector2,Vector3)を操作するライブラリ。
(下記サンプル内の"Combine"や"Advanced - Circle"を見ていただければ柔軟さがわかると思います。) - Easingは一通り実装済み。
- 「aからbにn秒で移動」だけでなく「aからbに速度vで移動」の指定が可能。
- スケジューラーも自分で書けるので「Time.time」「Time.unscaledTime」だけでなく独自のタイマーで動かすことが可能。
リポジトリ
github.comkyubuns/AnimeRx基本
Anime.PlayでIObservable<Vector3>を準備SubscribeToPosition(cube)などを使ってtransformに代入
サンプル
Start

(-5,0,0)から(5,0,0)へ、秒速4mで移動。
Anime.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Motion.Uniform(4f))
.SubscribeToPosition(cube);SubscribeToPositionは以下と同義です。
.Subscribe(x => cube.transform.position = x);他にもSubscribeToLocalPosition, SubscribeToLocalScaleや、IObservable<float> を取るSubscribeToPositionXなどなど諸々準備してあります。
Method Chain

(-5,0,0)から(5,0,0)へ移動した後、(0,3,0)に等速で移動。
メソッドチェーンでガンガン次の動きを書いていけます。
var animator = Motion.Uniform(5f);
Anime.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), animator)
.Play(new Vector3(0f, 3f, 0f), animator)
.SubscribeToPosition(cube);Easing

EaseOutQuadで2秒かけて移動。
Easingは一通り実装済み。
Anime.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Easing.EaseOutQuad(TimeSpan.FromSeconds(2f)))
.SubscribeToPosition(cube);Wait

移動した後、1秒まって再度動き出す。
Anime.Play(new Vector3(-5f, 0f, 0f), new Vector3(0f, 0f, 0f), Easing.EaseOutExpo(TimeSpan.FromSeconds(2f)))
.Wait(TimeSpan.FromSeconds(1f))
.Play(new Vector3(5f, 0f, 0f), Easing.EaseOutExpo(TimeSpan.FromSeconds(2f)))
.SubscribeToPosition(cube);Path

指定したpositionに順番に移動。
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),
};
Anime.Play(positions, Easing.EaseInOutSine(TimeSpan.FromSeconds(6f)))
.SubscribeToPosition(cube);Combine

x, y, zの各座標を別々にアニメーションさせて合成。
var x = Anime.Play(-5f, 5f, Easing.EaseInOutSine(TimeSpan.FromSeconds(3f)));
var y = Anime.Play(0f, 3f, Easing.EaseInOutSine(TimeSpan.FromSeconds(1.5f)))
.Play(0f, Easing.EaseInOutSine(TimeSpan.FromSeconds(1.5f)));
var z = Anime.Stay(0f);
Observable.CombineLatest(x, y, z)
.SubscribeToPosition(cube);Extensions

cube.transform.positionから(3,3,0)へ移動。
cube.transform.position
.Play(new Vector3(3f, 3f, 0f), Easing.EaseOutBack(TimeSpan.FromSeconds(2f)))
.SubscribeToPosition(cube);Advanced - Circle

IObservble<float>を円運動に変換。
Anime.Play(0f, Mathf.PI * 2f, Easing.EaseOutCubic(TimeSpan.FromSeconds(3f)))
.Select(x => new Vector3(Mathf.Sin(x), Mathf.Cos(x), 0.0f))
.Select(x => x * 3f)
.SubscribeToPosition(cube);Advanced - Timing

WhenAllを使ってアニメーションのタイミングを合わせる。
var leftCube1 = Anime
.Play(new Vector3(-5f, 0f, 0f), new Vector3(-0.5f, 0f, 0f), Easing.Linear(TimeSpan.FromSeconds(2.5f)))
.DoToPosition(cube);
var rightCube1 = Anime
.Play(new Vector3(5f, 0f, 0f), new Vector3(0.5f, 0f, 0f), Easing.EaseOutCubic(TimeSpan.FromSeconds(1f)))
.DoToPosition(cube2);
var leftCube2 = Anime
.Play(new Vector3(-0.5f, 0f, 0f), new Vector3(-0.5f, 3f, 0f), Easing.EaseOutCubic(TimeSpan.FromSeconds(1f)))
.DoToPosition(cube);
var rightCube2 = Anime
.Play(new Vector3(0.5f, 0f, 0f), new Vector3(0.5f, 3f, 0f), Easing.EaseOutCubic(TimeSpan.FromSeconds(1f)))
.DoToPosition(cube2);
Observable.WhenAll(leftCube1, rightCube1)
.ContinueWith(Observable.WhenAll(leftCube2, rightCube2))
.Subscribe();AnimationCurve

UnityEngine.AnimationCurveを利用して移動。
Anime.Play(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), Motion.From(curve, TimeSpan.FromSeconds(3f)))
.SubscribeToPosition(cube);HPゲージが徐々に減る
AnimeRxを使うと、よくある「HPゲージが徐々に減る」ってやつもEasingでいい感じにアニメ付けながら簡単に作れる https://t.co/WW9lzrPyQg https://t.co/zgrPoxnMOd #Unity pic.twitter.com/7jJKZPKSi4
— きゅぶんず (@kyubuns) 2018年2月6日