Почему объект вообще не вращается при перемещении?

#c# #unity3d

#c# #unity3d

Вопрос:

 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 вообще не вращается.

Ответ №1:

он не вращается, потому что вы не говорите ему вращаться.

Обычным способом решения этой проблемы было бы использовать Quaternion .Lerp (или Slerp), если ваша нормализованная позиция в анимации может быть выражена как x

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

Я не включил ваше конечное вращение, поскольку вам нужно было бы как-то его обеспечить (возможно, в качестве следующего параметра в вызове IEnumerator)

Это даст вам линейное движение. Если вам нужно более приятное движение, вы можете сделать

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