#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);