DOTweenをふわっとまとめてみた

#はじめに
DOTween is　なに？って方もいると思います。
Unityのアセットで名前の通りTween系のアセットです。
中でも処理が最適化されているらしく早いみたいです（要検証）
リンクは[<b>こちら</b>](https://www.assetstore.unity3d.com/jp/#!/content/27676)

さらにDoTweenは<b>シーケンス</b>という概念を持っており、例えば右行った後に拡大縮小してパンチされてジャンプしてプルプルして、というのをシンプルに書くことができます。（Cocos2d_xを触ったことがある人はActionと同じ振る舞いができるとお考えください）
ここでは、基本的な使い方や詰まった点など書いていきます。

#基本的な使い方
まず忘れてはいけないのが

```csharp
using DG.Tweening;
```

DoTweenは２Ｄ,３Ｄどちらも使えますがここでは２Dについて書いていきます。
例ではuGUIのRectTransformをTweenさせます。
なおRectTransformは、

```csharp
[SerializeField]
RectTransform rectTran;
```

で取得しているものとします。

基本的にDOTweenは、

```csharp
rectTran.DOhoge(値,時間);
```

のようにかいきます。(hogeはScaleやMoveなどしたいことを書く)

##移動系
もっとも使うであろう移動系
書き方は

```csharp
//1秒で座標（1,1,1）に移動
rectTran.DOMove (
	Vector3.one,　　//移動後の座標
	1.0f 　　　　　　//時間
	);
```


他にも<b>DOMoveX</b>,<b>DOMoveY</b>など一つの要素だけ動かすこともできる。（マジ有能）
ちなみに上記の書き方だとワールド座標になってしまうが<b>DOLocalMove</b>とするとローカル座標で扱われる。
ここからいくつ移動といった書き方もあるがそちらは後ほど説明いたします。

##スケール系
プニッとさせるのに簡単にできるスケール系
書き方は

```csharp
//1秒でスケール（1,1,1）にスケーリング
rectTran.DOScale (
	Vector3.one,　　//終了時点のScale
	1.0f 　　　　　　//時間
	);
```

こちらもMove同様DOScaleX,DOScaleYもあります。

##回転系
少し遊び心をもたせたいときに使う回転系
書き方は

```csharp
// 1秒かけて90度まで回転
rectTransform.DORotate(
    new Vector3(0f, 90f),   // 終了時点のRotation
    1.0f                    // アニメーション時間
);
```

ちなみに上記の場合例えば300度にした場合360->359...301->300のように近い方に回転してしまいます。
0->1...299->300のようにしたい場合はデフォルトでは第3引数が<b>RotateMode.Fast</b>となっているのですがここを<b>RotateMode.FastBeyond360</b>を引数にするとなります。


##その他用意されている動き
DOTweenでは頻繁に使いそうなものをあらかじめ用意してくれています。
###Jump
移動しながらぴょんぴょんしていきます。

```csharp
rectTran.DOLocalJump(
    Vector3.one,      // 移動終了地点
    30,               // ジャンプする力
    10,               // ジャンプする回数
    1.0f              // アニメーション時間
);
```

DOLocalJumpもあります。

###Punch
擬音でいうとビヨヨーンみたいな感じで、指定した値と現在の値を行き来する。

```csharp
rectTran.DOPunchScale(
    new Vector3(1.5f, 1.5f),    // scale1.5倍指定
    1.0f                        // アニメーション時間
);
```
他にも<b>DOPunchPosition</b>,<b>DOPunchRotation</b>があります。

###Shake
先ほどのよりランダムに変化をする。

```csharp
rectTran.DOShakeScale(
    1.0f  　　　　　　　　　// アニメーション時間
);
```

こちらも<b>DOShakePosition</b>,<b>DOShakeRotation</b>があります

##変数などのTween
少し変則的な使い方ですが例えばスコアを獲得したとき一気に上がるのではなく徐々に数を増やしたい。といったこともできます。（ほんと助かる）
例えば

```csharp
int score = 0;
// 数値の変更
DOTween.To(
    () => score,          // 何を対象にするのか
    num => score = num,   // 値の更新
    100,                  // 最終的な値
    1.0f                  // アニメーション時間
);
```

など簡単に使えますね。

##Sequence
これは冒頭でも紹介しているように動きを組み立てて実行することができるものです。
あれやってこれやってこれと同時にあれやってといった感じですね。

###Append()
直前の動作に追加するときに使います。

```csharp
Sequence seq = DOTween.Sequence();
//(1,1,1)に移動
seq.Append(
rectTransform.DOLocalMove(Vector3.one, 1.0f)
);
//(0,0,0)にスケーリング
seq.Append(
rectTransform.DOScale(Vector3.zero, 1.0f)
);

```

###Join()
こちらは先ほどが追加に対して、同時に行うときに使います。

```csharp
Sequence seq = DOTween.Sequence();
//(1,1,1)に移動
seq.Append(
rectTransform.DOLocalMove(Vector3.one, 1.0f)
);
//(0,0,0)にスケーリング
seq.Join(
rectTransform.DOScale(Vector3.zero, 1.0f)
);
```

基本的にはこのような感じで使えますがさらに便利な機能もたくさんあるので詳しく見たい方は[<b>こちら</b>](http://qiita.com/lycoris102/items/6a9e1e39bfa69880eaba)

##より使いこなすための追加要素
ここからは単体としては使いませんがさらに細かく設定するときに使います
###Easing
アニメーションといえばEasingですよね。
デフォルトでも[このよう](http://qiita.com/ryosebach/items/5bd90d4b464b9059f35d)に豊富にあります
書き方は

```csharp
hoge.SetEase(Ease.InOutCirc);
```

hogeはMoveやSequenceなどです。
Ease.InOutCircはeaseの種類です。

もっと細かく決めたい方は

```csharp
[SerializeField]
AnimationCurve curve;
```

のように設定したcurveを（）の中に書けば設定できます。

###Loop
言わずもなが繰り返しです。
書き方は

```csharp
hoge.SetLoops (100);
```
（）の中の回数分繰り返します。
ちなみに-1を入れると無限ループします。

###Delay
開始時間を遅らせるものです

```csharp
hoge.SetDelay(1.0f);
```

###Relative
Moveの時に先延ばしにした項目です。
基本的にDOTweenでは絶対値で計算しています。（どこどこに行く、この大きさ、角度になるなど）
これを設定した場合相対的に計算するようになります（ここから〜移動、今の大きさの何倍になるなど）
書き方は

```csharp
hoge.SetRelative();
```
###Callback
こちらは始まった時、更新時、終わった時などに呼ばれるものです。

```csharp
hoge.OnStart(() => {
        // アニメーション開始時によばれる
    });
hoge.OnUpdate(() => {
        // 対象の値が変更される度によばれる
    });
hoge.OnComplete(() => {
        // アニメーションが終了時によばれる
    });
```

##止める、始めるなどの操作
###一時停止

```csharp
hoge.Pause();
```

###再生

```csharp
hoge.Play();
```


###再スタート

```csharp
hoge.Restart();
```

###終了

```csharp
hoge.Complete();
```

###破壊

```csharp
hoge.Kill();
```

#注意点など
ここまでさーっと書いてきましたが使う時にまた見て頂ければと思います。
ここからは僕が詰まった、引っかかったところについて書いていきます。
##Complete OR Killするまで残り続ける問題
これは与えたTweenのobjectをsetActive(false)しても内部でTweenし続けるということです。
終了するタイミングで終わっていない可能性があるならCompleteやKillなどを呼びましょう
##-1LoopがCompleteできない問題
これはSetLoopのところで(-1)にすると無限ループできると書きました。こちらには落とし穴がありCompleteという概念がなくなります（完了することがないため）なので消すときは必ずKillしてください（結構悩まされました）
##Killしても消えないsequence
これは未だに原因がよくわからないのですが、僕はsequence1のOnCompleteでsequence2の無限Loopを適用したのですが消すタイミングでKillしても消すことができませんでした。
原因がわかり次第追記します。
#最後に
使えば使うほど便利機能を理解してくると思います。ぜひ動き系など作るときは使って見てください。