DOTween으로 커브
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)
Reference
이 문제에 관하여(DOTween으로 커브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/__poosuke/items/b6ead27a265cefd048a9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
Reference
이 문제에 관하여(DOTween으로 커브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/__poosuke/items/b6ead27a265cefd048a9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
DOTween.To(() => Vector3.zero, (x) => transform.position = x, new Vector3(3, 0, 0), 1);
DOTween.To(() => 0, (x) => transform.position = new Vector3(x,0,0), 3, 1);
var q = Quaternion.AngleAxis(x, axis);
transform.position = q * (from - center) + center;
transform.localEulerAngles = fromRot + q.eulerAngles;
Quaternion은 굉장하다.
※ CurveAroundAndRotate로 오브젝트의 방향이 잘 변하지 않는 버그가 있었으므로, 수정했습니다. (2020/6/5)
Reference
이 문제에 관하여(DOTween으로 커브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/__poosuke/items/b6ead27a265cefd048a9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)