Unity Dotween機能説明～これであなたもDotweenマスター～

## Dotweenとは
Unityでものをうごかす、はねる、大きくなるなど動きのあるアニメーションを付けられるAsset。
これを拡張して、変数を変化させる。アニメーションの組み合わせ、あるタイミングで関数を呼び出すこともできる。

## 使用準備
アセットストアからインストール。
セットアップでテキストのアニメーションがしたい場合TextMeshProにチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/a83c9a32-0899-38c4-f115-2948e28c566c.png)
インストール後は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/af8a40c2-f88e-e436-a666-40a4f5e15741.png)
ここからセットアップをよびだせる。

必要であればAssemblyにも追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/24362373-2fb3-1022-7ba3-97321c516a0a.png)

## 基本機能を使って見る
```
transform.DOMove(new Vector3(5f, 0f, 0f), 3f);
```
基本の形
Vec3で目標地点、３秒後に到達する。
Do～はいろいろある。試してみて。

停止させる
```
gameObject.transform.DOPause();
```
再開
```
gameObject.transform.DOPlay();
```
アニメーションをすぐに終わらす。
```
transform.DOComplete();
```
繰り返す
```
transform.DOMove(new Vector3(5f, 0f, 0f), 3f).
   SetLoops(-1,LoopType.Restart);
```
無限ループで初めから繰り返す。

## 発展機能
.で機能を組み合わせることができる
```
transform.DOMoveX(3f, 0).
    SetRelative(true);
```
移動する機能に[相対的に動く]を組み合わせいる。
これをメソッドチェーンという

```
transform.DOMoveX(3f, 0).
   SetRelative(true).
   SetUpdate(true);
```
好きなだけ組み合わせことができる。

## Easeを使う
Easeは初めゆっくり、最後は速くなどアニメーションのうごきをいい感じにつけるもの。
```
transform.DOMove(new Vector3(5f, 0f, 0f), 5f).SetEase(Ease.Linear);
```
Easeにもいろいろある。

https://easings.net/ja

自分でつくるとかなり細かく設定できる
 ```
      [SerializeField] private AnimationCurve testAnimationCurve;
 ```
 ```
 transform.DOMove(new Vector3(5, 0, 0), 5f).
    SetEase(testAnimationCurve).
    SetLoops(-1,LoopType.Restart);
 ```
 Unityで動かしながらいい感じなるまでためそう。
 AnimationCurveはレベルデザインにも使えるのが覚えておくと便利。
 
## 変数を操作
```
       [SerializeField] private float doTweenVal = 0;
```
```
//5秒かけてaを100まで変化させる
DOTween.To(() => doTweenVal,　//開始時の値
    (x) => doTweenVal = x,　//更新する変数
    100,　//最大値
    5); //秒数
```
DoTween.Toを使用し変数を操作する。
0から100まで5秒かけて変数が動いていく。

## 文字列の操作
```
        [SerializeField] private TextMeshProUGUI testText;
```
```
string str = "文字列のテスト";
testText.DOText(str,2f);
```
２秒かけて文字が入力されていくようなアニメーション

## ２秒後に関数を実行する。
```
DOVirtual.DelayedCall(2f, () =>
{
    Debug.Log("DelayCallTest :2秒後によばれたよ");
});
```
## 処理の前、終わりに関数を実行する。
```
//OnStart()もあるよ
transform.DOLocalMove(new Vector3(0, 0, 10f), 0.5f)
        .OnComplete(() => {
            //完了後オブジェクトが消える
            gameObject.SetActive(false);
        });
```
## 複数の処理をまとめテンプレ化
Sequenceを使う
```
Sequence tseq = DOTween.Sequence();
tseq.Append(transform.DOJump(new Vector3(5f, 0, 0), 5f,3,3f));
tseq.Append(transform.DOMove(new Vector3(0f, 0, 0), 3f));
```
ジャンプしてから移動するアニメーションがまとめられる。
関数化すると使いやすくなる

```
private Sequence JumpAndMoveSeq()
{
    Sequence tseq = DOTween.Sequence();
    tseq.Append(transform.DOJump(new Vector3(5f, 0, 0), 5f,3,3f));
    tseq.Append(transform.DOMove(new Vector3(0f, 0, 0), 3f));

    return tseq;
}
```
使用箇所
```
JumpAndMoveSeq().Play();
```
Sequenceに対してPlayする。


## ちょっと専門的な内容
DotweenはUpdateまでどう動くのかをためている。それまでうごかない。Updateで一度に動く仕組みとなっている。
実行タイミングがUpdateなので注意

Dotweenのメモリ確保のタイミングは初めにDotweenが実行された時と、
DoTween.Init()が呼ばれた時となっている。

ロード画面やScene切り替え時にInitしておくとかくつきをふせげる。

また、メモリの量は
DOTween.SetTweensCapacity(400,100);
(Tween数、Sequence数)
で設定できる。
途中でメモリ確保してかくつかない範囲で設定しよう


## 組み合わせのアイディア無限
これであなたもDoTweenマスター！！

## 参考ページ

https://www.youtube.com/watch?v=KQcxY_wquDw

https://www.youtube.com/watch?v=Qi5y1WY7QCI

https://qiita.com/broken55/items/df152c061da759ad1471