DOTweenのSequenceで各処理の間に待機時間を入れる方法

# 検証環境
Unity：5.3.7p4
DOTween：1.1.575

# 問題：開始時と終了時に実行される関数の実行順が分からない
・OnStart
　TweenerまたはSequence開始時のコールバック。

・PrependCallback
　Sequenceの開始時のコールバック。

・PrependInterval
　Sequenceの始めに待機時間を持たせる関数。

・OnComplete
　TweenerまたはSequence終了時のコールバック。

・AppendCallback
　Sequenceの終了時のコールバック。

・AppendInterval
　Sequenceの終わりに待機時間を持たせる関数。

Sequenceについてはこちらの記事が参考になりました。
▽[Unity] DOTweenのSequenceを使ってアニメーションを結合する
http://qiita.com/lycoris102/items/6a9e1e39bfa69880eaba

# 結論：各コールバックとアニメーション間に待機時間を挟む記述順
各アニメーション間に待機時間を挟めるように色々試した結果、以下記述になりました。

```
	[SerializeField]
	Transform m_playButton;
	[SerializeField]
	Transform m_questionButton;
	[SerializeField]
	Text m_text;

	// Use this for initialization
	void Start () {
		Sequence sequence = DOTween.Sequence()
			// OnStart の前には待機できない
			.OnStart(() =>
				{
					m_playButton.gameObject.SetActive(true);
					m_text.text = "OnStart";
				})
			
//			.PrependInterval(2f) // ここだと PrependCallback 後の待機になってしまう
			.PrependCallback(() =>
				{
					m_questionButton.gameObject.SetActive(true);
					m_text.text = "PrependCallback";
				})
			.PrependInterval(2f)	// PrependCallback 前の待機

			.AppendInterval(2f)	// 各アニメーション間の待機
			.Append(m_text.DOText("各Append", 0f))
			.Append(m_questionButton.DOLocalMoveX(100f, 2f))
			.AppendInterval(2f)	// 各アニメーション間の待機
			.Append(m_playButton.DOLocalMoveX(0f, 2f))
			.AppendInterval(2f)	// 各アニメーション間の待機
			.Append(m_playButton.DOLocalMoveX(-100, 2f))
			.AppendInterval(2f)	// 各アニメーション間の待機
			.Append(m_questionButton.DOLocalMoveX(0f, 2f))
			.AppendInterval(2f)	// 各アニメーション間の待機

			.AppendCallback(() =>
				{
					m_questionButton.gameObject.SetActive(false);
					m_text.text = "AppendCallback";
				})
			.AppendInterval(2f)	// AppendCallback 後の待機

			.OnComplete(() =>
				{
					m_playButton.gameObject.SetActive(false);
					m_text.text = "OnComplete";
				})
			// OnComplete の後には待機できない
			;
		sequence.Play();
	}   
```
![sequence調査.gif](https://qiita-image-store.s3.amazonaws.com/0/44990/bab535e0-ef08-571f-95e7-52d06cbc1534.gif)


#OnStartとPrependCallbackの違い
#####OnStart
* 複数書いても最後の1つしか呼ばれない。
* 必ずSequenceの最初に実行される。

#####PrependCallback
* 複数書くと全て呼ばれる。
* 記述順によって実行順が変わる。（規則性が分からないので複数使わない方が良さそう）

```
	void Start () {
		Sequence sequence = DOTween.Sequence();
		sequence.AppendCallback(() => { Debug.Log("AppendCallback1");});
		sequence.OnStart(() => { Debug.Log("OnStart");});
		sequence.AppendCallback(() => { Debug.Log("AppendCallback2");});
		sequence.AppendCallback(() => { Debug.Log("AppendCallback3");});
		sequence.OnComplete(() => { Debug.Log("OnComplete");});
		sequence.AppendCallback(() => { Debug.Log("AppendCallback4");});
		sequence.Play();
	}
```
<img width="359" alt="スクリーンショット 2017-07-01 0.09.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/4e129f81-1c46-27bc-cb5e-9c2066fb67bc.png">
OnCompleteとAppendCallbackに関しても同様でした。

# PrependCallbackとAppendCallbackの実行タイミング

PrependCallbackが開始時、AppendCallbackが終了時、
のはずなのですが記述順を変えると実行の順番が変わってしまいます。

```
	void Start () {
		Sequence sequence = DOTween.Sequence();
		sequence.OnStart(() => { Debug.Log("OnStart");});
		sequence.AppendCallback(() => { Debug.Log("AppendCallback");});
		sequence.PrependCallback(() => { Debug.Log("PrependCallback");});
		sequence.OnComplete(() => { Debug.Log("OnComplete");});
		sequence.Play();

		Sequence sequence2 = DOTween.Sequence();
		sequence2.OnStart(() => { Debug.Log("OnStart2");});
		sequence2.PrependCallback(() => { Debug.Log("PrependCallback2");}); // ここと
		sequence2.AppendCallback(() => { Debug.Log("AppendCallback2");}); // ここを入れ替えた
		sequence2.OnComplete(() => { Debug.Log("OnComplete2");});
		sequence2.Play();
	}
```
![スクリーンショット 2017-06-30 10.33.45.png](https://qiita-image-store.s3.amazonaws.com/0/44990/0bdeebac-4df4-a4fa-c5fb-6b91650dd710.png)
処理順通りに定義していけば問題ないです。

# PrependIntervalとAppendIntervalの実行タイミング
記述順を変えるとまたもや実行タイミングが変わってしまいます。
以下のようにPrependIntervalをPrependCallbackの前後に配置するとそれぞれ待機時間が発生します。

```
	void Start () {
		Sequence sequence = DOTween.Sequence()
			.PrependInterval(2f) // 最初に2秒
			.PrependCallback(() =>
				{
					m_playButton.gameObject.SetActive(true);
				})
			.PrependInterval(2f) // ここでも2秒
			.AppendCallback(() =>
				{
					m_playButton.gameObject.SetActive(false);
				});
		
		sequence.Play();
	}   
```
AppendIntervalとAppendCallbackも同様に記述位置によって実行タイミングが変わりました。