DOTween으로 커브

10437 단어 dotweenUnity3DC#Unity

DOTween 편리



1주일 정도 전에 DOTween 사용하기 시작했습니다. 편리하네요 이거.
단지, 조금 찾고 있었던 느낌, 오브젝트를 원주상에서 커브 시키는 방법을 찾을 수 없었습니다. 패스를 잘 하면 그렇게 할 수 있는 것 같습니다만, 공부가 테라 확장 메소드를 써 보았습니다.

할 수있는 사람



DOCurveAroundAndRotate의 실행 상태. Cylinder를 중심으로 Cube가 회전하고 있다.

public static class DoTweenExt
{
    //centerを中心、axisを軸として、degree(度)回転する
    public static TweenerCore<float, float, FloatOptions> DOCurveAround(this Transform transform, Vector3 axis, Vector3 center, float degree, float duration)
    {
        var from = Vector3.negativeInfinity;
        return DOTween.To(() => 0, (x) =>
            {
                if (float.IsNegativeInfinity(from.x)) from = transform.position;
                transform.position = Quaternion.AngleAxis(x, axis) * (from - center) + center;
            },
            degree,
            duration
        );
    }

    //オブジェクトそのものも回転させる
    public static TweenerCore<float, float, FloatOptions> DOCurveAroundAndRotate(this Transform transform, Vector3 axis, Vector3 center, float degree, float duration)
    {
        var from  = Vector3.negativeInfinity;
        var fromRot = Vector3.zero;
        return DOTween.To(() => 0, (x) =>
            {
                if (float.IsNegativeInfinity(from.x))
                {
                    from = transform.position;
                    fromRot = transform.localEulerAngles;
                }
                var q = Quaternion.AngleAxis(x, axis);
                transform.position = q * (from - center) + center;
                transform.localEulerAngles = fromRot + q.eulerAngles;
            },
            degree,
            duration
        );
    }

    //使い方
    //(x,y,z)=(2,0,0)を中心に3秒かけて90度回転させる。
    //transform.DOCurveAround(Vector3.up, new Vector3(2, 0, 0), 90, 3);
}

해설



모두 사랑해, To 메소드를 사용합니다. To를 사용하는 방법이지만,
DOTween.To(() => Vector3.zero, (x) => transform.position = x, new Vector3(3, 0, 0), 1);

 (0,0,0)에서 (3,0,0)으로 1초에 걸쳐 이동합니다.
DOTween.To(() => 0, (x) => transform.position = new Vector3(x,0,0), 3, 1);

위와 의미는 같습니다만, 변화하는 값이 어디까지나 프리미티브인 float가 되어 있습니다. 이 float를 각도로 해, 각도로부터 position, localEulerAngles를 인덱싱합니다.

 그것은 CurveAroundAndRotate
var q = Quaternion.AngleAxis(x, axis);
transform.position = q * (from - center) + center;
transform.localEulerAngles = fromRot + q.eulerAngles;

이 부분입니다. 우선은 Quaternion을 냅니다. 그 Quaternion과 회전시키고 싶은 Vector3를 곱하면 (0,0,0)을 중심으로 회전합니다. from은 시작 위치이지만 어디까지나 이 함수가 달리기 시작하는 시점에서의 위치입니다. 변수 초기화시에 transform.position을 넣어 버리면 Sequence에서 움직일 때 이상해집니다.
각도도 마찬가지이며, 함수가 달리는 시점에서의 eulerAngles를 fromRot에 둡니다. 그리고 fromRot과 조금 전에 Quaternion의 eulerAngles를 더한 것을 던져라.

소감



Quaternion은 굉장하다.

※ CurveAroundAndRotate로 오브젝트의 방향이 잘 변하지 않는 버그가 있었으므로, 수정했습니다. (2020/6/5)

좋은 웹페이지 즐겨찾기