見出し画像

最近のUnity Tweenライブラリの紹介と速度検証


はじめに

この記事はColorful Paletteアドベントカレンダー 12/12の記事です。

こんにちは!株式会社Colorful Paletteでクライアントエンジニアをしている「saba🐟」です!普段は「UI実装」「キャラクター制御周り」を担当しています!「UXの向上」に重きを置いた実装が大好きです!!

本記事では、最近増えつつある、「Tweenライブラリの紹介」
「各Tweenのパフォーマンス」について検証していければと思います!
少しでも参考になれば嬉しいです!



Tweenライブラリとはなんぞや

Tweenという言葉を知らない方向けに説明すると
Tweenライブラリは主に、アニメーションを簡単かつ効率的に制作するために使われるライブラリです。

ここでいう「Tween(トゥイーン)」つまり「中間」を意味する言葉で、
開始と終了の数値滑らかに補完する機能を持つライブラリのことです。

以下のGIFのような様々なAnimationを簡単に実装することができます!

Tweenのサンプル

今回紹介するTweenライブラリ

近年、様々なTweenライブラリが出てきていますが、今回の検証では

の3つのTweenをメインに紹介していきます!


DOTween

Unityでゲーム開発をしている人であれば、誰もが知っているTweenライブラリなのではないでしょうか?
「拡張メソッド+メソッドチェーン」の形式でTweenを書いていくことができます。

// イージング付き移動Tween (DOTween)
transform.DOMove(endValue, duration).SetEase(animationCurve) ;

PrimeTween

こちらはOpenSourceで提供されているTweenで、
DOTweenより高速でGC.Allocも0Bytesになるように実装されています。
「Staticメソッド」にTargetを渡すことでTweenを実装できます。

// イージング付き移動Tween (PrimeTween) 
Tween.Position(transform, endValue, duration, animationCurve)

MagicTween

2023年9月8日に公開されたTweenライブラリで、GameObject/ECSの両方をサポートし、Sequenceの機能やTextMesh Proのサポートなど、非常に豊富な機能を取り揃えているライブラリです。
ECSを使用してECS用にチューニングした実装をすればかなりの高速化が見込めるTweenライブラリとなっています。
v0.2からはstringを含むものなどの一部を除きGC.Allocが0Bytesになるように実装されています。
DOTweenと同じく「拡張メソッド+メソッドチェーン」の形式でTweenを書いていくことができます。

// イージング付き移動Tween (MagicTween) 
transform.TweenPosition(endValue, duration).SetEase(animationCurve);

パフォーマンス周り

MagicTween公式のベンチマーク画像

こちらの図はfloatの値をTween.To()でアニメーションさせた場合の図です。
図の中の「MagicTween」は他のTweenライブラリに比べて、2~5倍ほど高速なことがわかります。
ECSのコンポーネント内のfloatの値をTween.Entity.To()でアニメーションさせる場合はさらに2倍高速なことがわかります・・・速い・・・!


MagicTween公式のベンチマーク画像

こちらの図はpositionを各TweenライブラリのDoMoveのようなTweenでアニメーションさせたものです。
こちらでも最速を維持しています。すごい..!

図の中の「MagicTween (Job)」となっている部分に関してはScripting Define Symbolsに「MAGICTWEEN_ENABLE_TRANSFORM_JOBS」を追加してあげることで有効化できTransformに特化したTweenを作成できるみたいです!

ただ、後述で説明しますが、Startupの処理にコストがかかってしまうみたいですので注意が必要です!


MagicTween公式のベンチマーク画像

こちらはpositionTweenを生成したときのStartup時の図です。
唯一MagicTweenが他のTweenライブラリに劣っている部分はStartup時のようです。Startupなのでそこまで気にならないと思いますが、考慮しつつ使用して行きましょう!


実際に速度検証してみる

実際に速度検証をしてみないことにはわからないので軽くではありますが、検証してみました!
今回の計測はTestRunnerでXperia 1 Ⅱを使用し、MagicTweenBenchmarksのコードをお借りして計測をしていきます!

作業環境

Unity 2022.3.13f1
DOTween 1.2.745
PrimeTween 1.1.2
MagicTween 0.2.1
Entities 1.0.16

検証端末 : Xperia 1 Ⅱ


計測結果

$$
\begin{array}{|c|c|c|c|c|} \hline
 & DOTween & PrimeTween & MagicTween & MagicTweenECS\\ \hline
Startup & 292.35 ms & 66.99 ms & 292.50ms & 44.99ms \\ \hline
float & 33.29 ms & 33.26 ms & 33.25 ms & 33.26 ms\\ \hline
Gc.Alloc & 563.00 B & 0.00B &0.00B & -\\ \hline
Position & 33.25 ms & 33.26 ms & 33.27 ms & -\\ \hline
\end{array}
$$

上の表が実際に計測した結果をまとめたものです。
端末の個体差があるのか、公式のベンチマークとは差異がある計測データがありますね。
Startupに関してはやはりPrimeTweenが高速ですね。
Gc.Allocに関してはPrimeTweenとMagicTweenは宣言通り0.00Bytesになってるみたいです!

もしお手元の環境で試したいという方は、MagicTweenの公式でベンチマーク用コードを公開してくれていますのでぜひ試してみてください!

MagicTweenBenchmarks


最後に

今回は3つのTweenライブラリの紹介と速度検証を行いました!
結果としてはやはりMagicTweenのECSは爆速ですね!!
MagicTweenは自分が今一番注目しているTweenライブラリなので、どんどん使って応援していきたいと思っています!
PrimeTweenもDOTweenより高速なので検討の余地はあると思います!
今後Tweenライブラリを選定する時にはぜひ、PrimeTweenMagicTweenを検討してみてはいかがでしょうか?

最後まで読んでいただきありがとうございました!🐟