実行環境
- Unity5.6.0b1 (beta)
- DOTween v1.1.310
DOTweenの自動再生について
- DOTweenにおけるTween/Sequenceは明示的に Play() を呼び出さなくても実行されるような標準設定となっている
- そのため、ボタン押下や任意のメソッド呼び出し時に再生したいケースで困る
例: ボタンを押したらメニューが表示される
OpenMenuButton
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
[RequireComponent(typeof(Button))]
public class OpenMenuButton : MonoBehaviour
{
public Image BackGroundImage;
public CanvasGroup MenuCanvasGroup;
void Start ()
{
BackGroundImage.enabled = false;
MenuCanvasGroup.gameObject.SetActive(false);
Sequence sequence = DOTween.Sequence()
.OnStart(() =>
{
MenuCanvasGroup.gameObject.SetActive(true);
MenuCanvasGroup.alpha = 0.0f;
BackGroundImage.enabled = true;
BackGroundImage.color = new Color(
BackGroundImage.color.r,
BackGroundImage.color.g,
BackGroundImage.color.b,
0.0f
);
})
.Append(MenuCanvasGroup.DOFade(1.0f, 2.0f))
.Join(BackGroundImage.DOFade(0.3f, 2.0f));
GetComponent<Button>().onClick.AddListener(() => sequence.Play());
}
}
- 上記をアタッチした状態で実行すると右下のボタンを押す前にSequenceが再生されてしまうことが分かる
defaultAutoPlay
- ドキュメント
- リファレンス(defaultAutoPlay)
- リファレンス(AutoPlay)
-
DOTween.defaultAutoPlay
の値によって自動再生の有無が制御出来る- デフォルトで
AutoPlay.All
が設定されている - これによりTween/Sequence が生成された直後に再生される
- デフォルトで
AutoPlay | |
---|---|
AutoPlay.All | 全てのTween/Sequenceは自動再生される |
AutoPlay.AutoPlaySequences | Sequenceは自動再生され、Tweenは自動再生されない |
AutoPlay.AutoPlayTweeners | Tweenは自動再生され、Sequenceは自動再生されない |
AutoPlay.None | 全てのTween/Sequenceは自動再生されない |
defaultAutoPlayを変更する
DOTween.Init() 実行後に変更する必要がある
- 以下のコードを実行時に、ボタンを押していないのに再生されてしまう
- これは
DOTween.Init()
を明示的に宣言していないことによる罠である- Init が未実行な場合、Tween/Sequence生成時に Init が暗黙的に実行される (認識)
- Init 実行前の設定の変更は反映されない
- 参考: Initの各種引数に関しては [Unity] DOTweenを使ってUI要素を点滅させる に記載
OpenMenuButton
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
[RequireComponent(typeof(Button))]
public class OpenMenuButton : MonoBehaviour
{
public Image BackGroundImage;
public CanvasGroup MenuCanvasGroup;
void Start ()
{
BackGroundImage.enabled = false;
MenuCanvasGroup.gameObject.SetActive(false);
// 自動再生させない
DOTween.defaultAutoPlay = AutoPlay.None;
Sequence sequence = DOTween.Sequence()
.OnStart(() =>
{
MenuCanvasGroup.gameObject.SetActive(true);
MenuCanvasGroup.alpha = 0.0f;
BackGroundImage.enabled = true;
BackGroundImage.color = new Color(
BackGroundImage.color.r,
BackGroundImage.color.g,
BackGroundImage.color.b,
0.0f
);
})
.Append(MenuCanvasGroup.DOFade(1.0f, 2.0f))
.Join(BackGroundImage.DOFade(0.3f, 2.0f));
GetComponent<Button>().onClick.AddListener(() => sequence.Play());
}
}
修正例
OpenMenuButton
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
[RequireComponent(typeof(Button))]
public class OpenMenuButton : MonoBehaviour
{
public Image BackGroundImage;
public CanvasGroup MenuCanvasGroup;
// DOTWeenInitializer的なスクリプトに移植してゲーム開始時に呼び出すと良い
void Awake()
{
DOTween.Init();
DOTween.defaultAutoPlay = AutoPlay.None;
}
void Start ()
{
BackGroundImage.enabled = false;
MenuCanvasGroup.gameObject.SetActive(false);
Sequence sequence = DOTween.Sequence()
.OnStart(() =>
{
MenuCanvasGroup.gameObject.SetActive(true);
MenuCanvasGroup.alpha = 0.0f;
BackGroundImage.enabled = true;
BackGroundImage.color = new Color(
BackGroundImage.color.r,
BackGroundImage.color.g,
BackGroundImage.color.b,
0.0f
);
})
.Append(MenuCanvasGroup.DOFade(1.0f, 2.0f))
.Join(BackGroundImage.DOFade(0.3f, 2.0f));
GetComponent<Button>().onClick.AddListener(() => sequence.Play());
}
}
- 上記コードにて右下のボタンを押すまで実行されなくなった