Awesome
AnimeTask
Task Animation Library for Unity
[!WARNING] This is also a very old library.
If you want to use a new one now, I recommend PrimeTween.
Read this document in other languages: 日本語
Sample
Basic
Move from (-5f, 0f, 0f)
to (5f, 0f, 0f)
over 2 seconds.
await Easing.Create<Linear>(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), 2f).ToLocalPosition(cube);
<img src="https://user-images.githubusercontent.com/961165/85938659-32d8aa00-b94a-11ea-84e4-162626e31861.gif" width="480">
PlayTo
Move from the current location to a specified location.
await Easing.Create<Linear>(new Vector3(-5f, 3f, 0f), 2f).ToLocalPosition(cube);
<img src="https://user-images.githubusercontent.com/961165/85938725-b5fa0000-b94a-11ea-8c4c-2b20b2090561.gif" width="480">
Easing
Use InCubic
of Easing
to move to a specified position.
await Easing.Create<InCubic>(new Vector3(-5f, 3f, 0f), 2f).ToLocalPosition(cube);
<img src="https://user-images.githubusercontent.com/961165/85938690-6d424700-b94a-11ea-9f8a-9bccddabf6b3.gif" width="480">
Linear
Move at 1 per second for 2 seconds.
await Moving.Linear(1f, 2f).ToLocalPositionX(cube);
Gravity
const float xRange = 5f;
const float yRangeMin = 5f;
const float yRangeMax = 10f;
await Moving.Gravity(
new Vector2(Random.Range(-xRange, xRange), Random.Range(yRangeMin, yRangeMax)),
Vector2.down * 9.8f,
5f
).ToLocalPosition(shape)
<img src="https://user-images.githubusercontent.com/961165/85940937-8c48d500-b95a-11ea-81b5-fddd17166a96.gif" width="480">
AnimationCurve
[SerializeField] private AnimationCurve sample12 = default;
public async UniTask Sample12()
{
await Moving.AnimationCurve(sample12).ToLocalPositionX(cube);
}
CalcDuration
Move by calculating moving time from distance.
await Easing.Create<OutCubic>(new Vector3(5f, 0f, 0f), x => x / 2f)
.Concat(Easing.Create<OutCubic>(new Vector3(5f, 2f, 0f), x => x / 2f))
.Concat(Easing.Create<OutCubic>(new Vector3(-5f, 0f, 0f), x => x / 2f))
.ToLocalPosition(cubes);
TranslateTo.Action
TranslateTo.Action
enables you to use the animated values freely.
Easing.Create<Linear>(0, 100, 2f).ToAction<float>(x => Debug.Log(x))
UnscaledTime
You can create your own scheduler, so you can stop time for specific objects.
The default is to use Time.time
, and you can also use UnscaledTimeScheduler
, which uses Time.unscaledTime
.
Easing.Create<Linear>(new Vector3(-5f, 0f, 0f), new Vector3(5f, 0f, 0f), 2f)
.ToLocalPosition(shape, default, new UnscaledTimeScheduler());
Update Timing
If an update timing is specified in the scheduler, values can be updated at times other than Update.
public class CustomScheduler : IScheduler
{
public float DeltaTime => Time.deltaTime;
public PlayerLoopTiming UpdateTiming => PlayerLoopTiming.PreUpdate;
}
Cancel
var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.Token.Register(() => Debug.Log("Cancel"));
cancellationTokenSource.CancelAfter(500);
await Easing.Create<OutCubic>(new Vector3(5f, 0f, 0f), 2f).ToLocalPosition(cubes[0], cancellationTokenSource.Token);
Convert
Convert a float
transition to a circular motion.
await Easing.Create<OutCubic>(0.0f, Mathf.PI * 2.0f, 2f)
.Convert(x => new Vector3(Mathf.Sin(x), Mathf.Cos(x), 0.0f) * 3.0f)
.ToLocalPosition(go);
<img src="https://user-images.githubusercontent.com/961165/85940836-ef863780-b959-11ea-94a3-11e9ed5057f4.gif" width="480">
Concat
It moves from 5f to 0f in 2 seconds, stops for 1 second, and moves to -5f in 2 seconds.
await Easing.Create<OutCubic>(5f, 0f, 2f)
.Delay(1f)
.Concat(Easing.Create<OutCubic>(0f, -5f, 2f))
.ToLocalPositionX(cubes[0]);
IProgress
Supporting IProgress
await Easing.Create<Linear>(2f).ToProgress(Progress.Create<float>(x => Debug.Log(x)));
AnimationCanceller
var canceller = go.GetAnimationCanceller().Cancel();
Easing.Create<Linear>(1.0f, 0.5f).ToLocalPositionX(go, canceller.Token);
// in other class/scope
var canceller = go.GetAnimationCanceller().Cancel();
Easing.Create<Linear>(0.0f, 0.5f).ToLocalPositionX(go, canceller.Token);
Skip
- Cancel (using CancellationToken) will stop at the position at the moment of
Cancel
. - Skip (using SkipToken) will move to the last position at the moment of
Skip
.
var skipTokenSource = new SkipTokenSource();
Easing.Create<OutCubic>(new Vector3(5f, 0f, 0f), 5f).ToLocalPosition(cubes[0], default, skipTokenSource.Token).Forget();
await UniTask.Delay(TimeSpan.FromSeconds(1));
skipTokenSource.Skip();
UniRx.Extensions
var score = new ReactiveProperty<int>(0);
score
.SubscribeTask(async (x, cancellationToken) =>
{
scoreCounter.text = $"{x}";
await Easing.Create<OutBounce>(2f, 1f, 0.5f).ToLocalScale(scoreCounter, cancellationToken);
});
Instructions
- Import AnimeTask via Package Manager
https://github.com/kyubuns/AnimeTask.git?path=Assets/AnimeTask
- Import AnimeTask via UnityPackage
- Import UniTask
- Import UnityPackage
Way of thinking
You can pass two arguments to Play
and PlayTo
.
The first is the Animator
and the second is the Translator
, which have distinct roles.
Animator
Takes the elapsed time and returns the current value.
Translator
Reflect the value.
Requirements
- Requires Unity2020.3 or later
License
MIT License (see LICENSE)