開発環境
- 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();
}
}
この 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();
}
}
また上記と同等の挙動は 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();