検証環境
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();
}

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