How to make tweener OnUpdate and ChangeEndValue work properly in Unity using DOTween?

118 views Asked by At

I want to make object 1 to follow object 2, within a fixed time(when object 2 moves to opposite direction, it should makes object 1 to move faster in order to keep the whole move time fixed).

Problem 1: The following codes do not work at all. obj1 doesn't move at all.

    var tweener = obj1.transform.DOMove(obj2.transform.position, 5f);
    tweener.OnUpdate(() => {
        tweener.ChangeEndValue(obj2.transform.position);
    });

Problem 2: Using the following codes, obj1 moves and follows obj2. However its speed reduces gradually and never reaches obj2. I think the ChangeValues call must have reset the duration to 5 somehow.

    var tweener = obj1.transform.DOMove(obj2.transform.position, 5f);
    tweener.OnUpdate(() => {
        tweener.ChangeValues(obj1.transform.position, obj2.transform.position);
    });

If I know how to get the remaining duration time of a tweener, and maybe this following codes may work properly. But I haven't found a way to get te remaining duration in documentation.

    var tweener = obj1.transform.DOMove(obj2.transform.position, 5f);
    tweener.OnUpdate(() => {
        tweener.ChangeEndValue(obj2.transform.position);
        tweener.ChangeValues(obj1.transform.position, obj2.transform.position, newDuration: tweener.currentRemainingDuration);
    });
1

There are 1 answers

0
derHugo On

In that use case it might be easier to not use DoTween at all.

I would use a simple Lerp Coroutine instead:

StartCoroutine(MoveRoutine(someTarget));

private void IEnumerator MoveRoutine(Transform target)
{
    var start = transform.position;

    for(var timePassed = 0f; timePassed < 5f; timePassed += Time.deltaTime)
    {
        var factor = timePassed / 5f;
        // optional add any easing function you wish e.g.
        factor = Mathf.SmoothStep(0, 1, factor);

        transform.position = Vector3.Lerp(start, target.position, factor);

        yield return null;
    }
    
    transform.position = target.position;
}

Otherwise - far shot but maybe works - do not use the current position but cash the first one like in

var start = obj1.transform.position;
var tweener = obj1.transform.DOMove(obj2.transform.position, 5f);
tweener.OnUpdate(() => {
    tweener.ChangeValues(start, obj2.transform.position);
});