Unity

[Unity] DOTweenで自動再生させない

More than 1 year has passed since last update.


実行環境


  • 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が再生されてしまうことが分かる

play_open_menu_1.gif


defaultAutoPlay

AutoPlay

AutoPlay.All
全てのTween/Sequenceは自動再生される

AutoPlay.AutoPlaySequences
Sequenceは自動再生され、Tweenは自動再生されない

AutoPlay.AutoPlayTweeners
Tweenは自動再生され、Sequenceは自動再生されない

AutoPlay.None
全てのTween/Sequenceは自動再生されない


defaultAutoPlayを変更する


DOTween.Init() 実行後に変更する必要がある


  • 以下のコードを実行時に、ボタンを押していないのに再生されてしまう

  • これは DOTween.Init() を明示的に宣言していないことによる罠である




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



  • 上記コードにて右下のボタンを押すまで実行されなくなった

play_open_menu_2.gif