Posted at

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

More than 1 year has passed since last update.


検証環境

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();
}


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();
}



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();
}



処理順通りに定義していけば問題ないです。


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も同様に記述位置によって実行タイミングが変わりました。