DOTween 基本を学ぶ

DOTween とは

dotween.demigiant.com

DOTween is a fast, efficient, fully type-safe object-oriented animation engine for Unity, optimized for C# users, free and open-source, with tons of advanced features.
(DOTweenは、高速で効率的、完全に型安全なUnity用オブジェクト指向アニメーションエンジンで、C#ユーザーのために最適化されており、フリーでオープンソースで、多くの高度な機能を備えています。)

UnityでTweenを扱いたいときに有名なアセット.
「Tween」とは開始時の情報と終了時の情報を入力として、途中の経過状態を補間して表現する方法.

DOTween準備

下記の二つを記述する.

// DOTweenを使用する場合は,DG.Tweeningをusingに入れる
using DG.Tweening;

// DOTweenの初期化 (StartかAwakeで呼び出す)
DOTween.Init();

DOTween 基本的なAPI

DOMove

派生形として,DORotate,DOMoveX,DOMoveY,DOMoveZ,DOLocalMoveがある.
第一引数:移動先のポジション,第二引数:何秒で移動するか指定

DOMove(new Vector3(5, 5, 0), 1);

Append

複数のアニメーションを直列結合できるようになる.
Sequence型の変数でDOTween.Sequence()を設定する必要がある.
(Streamみたいなイメージ?)

Sequence moveSequence = DOTween.Sequence();
moveSequence.Append(_cube.transform.DOMoveX(5, 1));
moveSequence.Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1));
moveSequence.Append(_cube.transform.DOMoveY(5, 1));
moveSequence.Append(_cube.transform.DOMove(Vector3.zero, 1));

Join

複数のアニメーションを並列結合できるようになる.
同じくSequence型の変数でDOTween.Sequence()を設定する必要がある.
こっちはparallelStreamみたいなイメージ?

Sequence moveSequence = DOTween.Sequence();
moveSequence.Append(_cube.transform.DOMoveX(5, 1));
moveSequence.Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1));
moveSequence.Append(_cube.transform.DOMoveY(5, 1));
moveSequence.Append(_cube.transform.DOMove(Vector3.zero, 1));
moveSequence.Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 4));

SetLoops

一連のアニメーションをループすることができる.
引数に何回ループするかを設定する.-1にすると無限ループ.

Sequence moveSequence = DOTween.Sequence();
moveSequence.Append(_cube.transform.DOMoveX(5, 1));
moveSequence.Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1));
moveSequence.Append(_cube.transform.DOMoveY(5, 1));
moveSequence.Append(_cube.transform.DOMove(Vector3.zero, 1));
moveSequence.Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 4));
moveSequence.SetLoops(-1);

メソッドチェーン

メソッドチェーンで書くことができる.ア!これしゅき♥

DOTween.Sequence()
    .Append(_cube.transform.DOMoveX(5, 1))
    .Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1))
    .Append(_cube.transform.DOMoveY(5, 1))
    .Append(_cube.transform.DOMove(Vector3.zero, 1))
    .Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 1))
    .SetLoops(-1);

SetEase

アニメーションにEasing設定できる.
Easing設定したいアニメーションの直後にSetEase()を記述する.

Easing CheatSheet

easings.net

Easingの数が多くて全部覚えきれない.
この記事を見て視覚的に理解するしかない.
Sineはあのサインで,Expoはあの指数関数なのはイメージできる.
jQueryCSSでもちょっと使った覚えがあるけどすぐ忘れる.

design.kayac.com

qiita.com

DOTween.Sequence()
    .Append(_cube.transform.DOMoveX(5, 1))
    .Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1))
    .Append(_cube.transform.DOMoveY(5, 1))
    .Append(_cube.transform.DOMove(Vector3.zero, 1))
    .Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 1))
    .SetLoops(-1);

OnComplete

アニメーションが終わった後に関数を呼ぶことができる.

[SerializeField] private GameObject _cube;

void Start()
{
    DOTween.Init(false, true, LogBehaviour.ErrorsOnly);

    DOTween.Sequence()
        .Append(_cube.transform.DOMoveX(5, 1)).SetEase(Ease.InSine)
        .Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1)).SetEase(Ease.InQuad)
        .Append(_cube.transform.DOMoveY(5, 1)).SetEase(Ease.OutCubic)
        .Append(_cube.transform.DOMove(Vector3.zero, 1)).SetEase(Ease.OutExpo)
        .Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 1))
        .OnComplete(Disappear);
    // .SetLoops(-1);
}

void Disappear()
{
    _cube.SetActive(false);
}

DOColor

Colorをアニメーションさせることができる.
フェードイン,フェードアウトによく使われる.

α値を変更するだけの場合は,DOFadeもある.

DOTween.Sequence()
    .Append(_cube.transform.DOMoveX(5, 1)).SetEase(Ease.InSine)
    .Append(_cube.transform.DOMove(new Vector3(5, 5, 0), 1)).SetEase(Ease.InQuad)
    .Append(_cube.transform.DOMoveY(5, 1)).SetEase(Ease.OutCubic)
    .Append(_cube.transform.DOMove(Vector3.zero, 1)).SetEase(Ease.OutExpo)
    .Join(_cube.transform.DORotate(new Vector3(180, 275, 180), 1))
    .Append(_panel.GetComponent<Renderer>().material.DOColor(new Color(0, 0, 0, 1), 1))
    .OnComplete(LoadScene);

To

任意のプロパティやクラス変数をTweenする場合によく使われる.

int score = 0;

DOTween.To(
    getter: () => score, // Tweenしたい対象の取得 
    setter: num => score = num, // Tweenしたい対象の設定
    endValue: 100, // 最終的な値
    duration: 1.0f // アニメーション時間
);

こんな使い方もある.

www.karvan1230.com

参考資料・記事

qiita.com

section31.jp

パフォーマンス的にはLeanTweenの方がいいらしいけどAPIはDOTweenに比べて豊富ではないらしい.
qiita.com

終わりに

次からのゲームジャム系では積極的にDOTween使っていこう.
Proを半額時に購入したのでせっかくだし利用しない手はないね.
メソッドチェーンで書けるの好きなんだよな.