在 Unity 中同时放大一个对象并将其移动到位
Scaling up an object and moving it into position at the same time in Unity
我正在创建一项功能,当用户单击对象的子项时,父项会按一定比例放大,并且父项会移动,以便子项位于中心点。我所有这些都工作得很好。
目前,我正在协同程序中执行该功能,以在缩放和定位之间进行 lerp。我注意到的是,如果说我有一个远离焦点的大型子对象,它会以曲线形式移动,因为它不必缩放那么多,但它必须移动更远的距离因为它的位置。当要移动的位置较小且 scaleTo Vector 较大时,会发生相反的效果。有没有办法抵消两个向量的差异?
所以我的问题是,有没有一种方法可以缩放和移动对象,使其运动不那么不自然?我将 post 我的协程如下:
IEnumerator LerpScaling(Vector3 scale, Vector3 scaleTo, GameObject obj, bool isReverse)
{
Vector3 offset = new Vector3(0, 0, 2.5f);
Transform baseObj = obj.transform.root.GetComponentInChildren<BaseObject>().transform;
elapsedTime = 0;
while (elapsedTime < timeToLerp)
{
baseObj.localScale = Vector3.Lerp(scale, scaleTo, elapsedTime / timeToLerp);
if (isReverse)
{
//lerp the position back
baseObj.position = Vector3.Lerp(baseObj.position, offset, elapsedTime / Instance.timeToLerp);
}
else
{
//lerp the position
baseObj.position = Vector3.Lerp(baseObj.position, baseObj.position - obj.transform.position + offset, elapsedTime / timeToLerp);
}
elapsedTime += Time.deltaTime;
yield return null;
}
正如 Draco 指出的,我的问题是我在 Lerp 内部使用了 baseObj.position
。
相反,我在 while 循环之前将位置存储在 Vector3 position
变量中,因此我的位置 lerp 看起来如下所示。我还在时间变量中添加了一个 SmoothStep,使 Lerp 感觉更自然。
baseObj.position = Vector3.Lerp(position, offset, Mathf.SmoothStep(0,1, elapsedTime / timeToLerp));
我正在创建一项功能,当用户单击对象的子项时,父项会按一定比例放大,并且父项会移动,以便子项位于中心点。我所有这些都工作得很好。
目前,我正在协同程序中执行该功能,以在缩放和定位之间进行 lerp。我注意到的是,如果说我有一个远离焦点的大型子对象,它会以曲线形式移动,因为它不必缩放那么多,但它必须移动更远的距离因为它的位置。当要移动的位置较小且 scaleTo Vector 较大时,会发生相反的效果。有没有办法抵消两个向量的差异?
所以我的问题是,有没有一种方法可以缩放和移动对象,使其运动不那么不自然?我将 post 我的协程如下:
IEnumerator LerpScaling(Vector3 scale, Vector3 scaleTo, GameObject obj, bool isReverse)
{
Vector3 offset = new Vector3(0, 0, 2.5f);
Transform baseObj = obj.transform.root.GetComponentInChildren<BaseObject>().transform;
elapsedTime = 0;
while (elapsedTime < timeToLerp)
{
baseObj.localScale = Vector3.Lerp(scale, scaleTo, elapsedTime / timeToLerp);
if (isReverse)
{
//lerp the position back
baseObj.position = Vector3.Lerp(baseObj.position, offset, elapsedTime / Instance.timeToLerp);
}
else
{
//lerp the position
baseObj.position = Vector3.Lerp(baseObj.position, baseObj.position - obj.transform.position + offset, elapsedTime / timeToLerp);
}
elapsedTime += Time.deltaTime;
yield return null;
}
正如 Draco 指出的,我的问题是我在 Lerp 内部使用了 baseObj.position
。
相反,我在 while 循环之前将位置存储在 Vector3 position
变量中,因此我的位置 lerp 看起来如下所示。我还在时间变量中添加了一个 SmoothStep,使 Lerp 感觉更自然。
baseObj.position = Vector3.Lerp(position, offset, Mathf.SmoothStep(0,1, elapsedTime / timeToLerp));