Unity

[Unity] DOTweenで相対的に値を増減させたい時には .SetRelative() を使う

開発環境

  • Unity 2018.2.16f1
  • DOTweenPro 1.0.075 (ProでなくてOK)

概要

DOTweenで現在の値を元に相対量を増減させるということをする際に、まず思いつくのは以下のような 「現在の値に対して相対量を加減した値を終了値として渡す」 というコードです。

DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        // UniRx: 2秒ごとに処理を実行する
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        var position = this.transform.position + Vector3.right;
        this.transform.DOMove(position, 1f);
    }
}

実はもう少し楽に記載する方法があり、それが Tween.SetRelative() です。Tweenに対してメソッドチェインで呼び出すことで、Tweenで指定した値を相対値として取り扱ってくれます。下記の例題だと、一定時間毎に Vector3.right だけ移動します (最初の例と同一の挙動)

DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        this.transform.DOMove(Vector3.right, 1f).SetRelative();
    }
}

setrelative.gif

この Tween.SetRelative() は値を操作する系統のTweenであれば、基本的に何でも使えます。試しに「右に移動する」「回転する」「フェードアウトする」の3通りの挙動に対して適応します。

DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        this.transform.DOMove(Vector3.right, 1f).SetRelative();
        this.transform.DOLocalRotate(new Vector3(0, 0, 90), 1f).SetRelative();
        this.GetComponent<SpriteRenderer>().DOFade(-0.2f, 1f).SetRelative();
    }
}

setrelative2.gif

また上記と同等の挙動は Sequence を利用して、以下のように記載することもできます。

DOTween.Sequence()
    .Append(this.transform.DOMove(Vector3.right, 1f))
    .Join(this.transform.DOLocalRotate(new Vector3(0, 0, 90), 1f))
    .Join(this.GetComponent<SpriteRenderer>().DOFade(-0.2f, 1f))
    .SetRelative();