首页 > 解决方案 > 为什么物体在移动时根本不旋转?

问题描述

IEnumerator ThrowObject(Transform objectToMove, Transform toPosition, float duration)
    {
        float counter = 0;

        while (counter < duration)
        {
            objectToMove.Rotate(throwSpeed * Time.deltaTime, 0, 0);

            counter += Time.deltaTime;
            Vector3 currentPos = objectToMove.position;

            float time = Vector3.Distance(currentPos, toPosition.position) / (duration - counter) * Time.deltaTime;

            objectToMove.position = Vector3.MoveTowards(currentPos, toPosition.position, time);

            yield return null;
        }
        
        var naviParent = GameObject.Find("Navi Parent");
        StartCoroutine(ThrowBack(objectToMove, naviParent.transform.position , duration));
    }

然后 :

IEnumerator ThrowBack(Transform objectToMove,Vector3 originalPosition , float duration)
{
    float counter = 0;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        Vector3 currentPos = objectToMove.position;

        float time = Vector3.Distance(currentPos, originalPosition) / (duration - counter) * Time.deltaTime;
        objectToMove.position = Vector3.MoveTowards(currentPos, originalPosition, time);
        yield return null;
    }

    objectToMove.localPosition = new Vector3(0, 0, 0);
}

我试过了 :

objectToMove.Rotate(throwSpeed * Time.deltaTime, 0, 0);

我想要做的是当 objectToMovei 开始移动时也开始旋转,并且当 objectToMove 接近目标时,距离目标大约 5 距离时慢慢降低旋转速度并在到达目标时停止完成旋转。

物体向后旋转时的逻辑相同,然后在距离 5 停止旋转时缓慢减小旋转。但现在 objectToMove 根本没有旋转。

标签: c#unity3d

解决方案


它不是旋转的,因为您没有告诉它旋转。

如果您在动画中的标准化位置可以表示为 x,则解决此问题的常用方法是使用 Quaternion.Lerp(或 Slerp)

float x= counter/duration;
Quaternion startRotation=objectToMove.rotation;
Quaternion endRotation=?
objectToMove.rotation=Quaternion.Lerp(startRotation,endRotation,x);

我留下了你的结束轮换,因为你需要以某种方式提供它(可能作为 IEnumerator 调用中的下一个参数)

这会给你线性运动。如果你想要更好的动作,你可以做

x = Mathf.SmoothStep(0,1,x);

推荐阅读