LoginSignup
13
17

More than 5 years have passed since last update.

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

Posted at

検証環境

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

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

スクリーンショット 2017-07-01 0.09.08.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
処理順通りに定義していけば問題ないです。

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

13
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
17