#c# #unity3d #qvector3d
#c# #unity3d #qvector3d
Вопрос:
Я пытаюсь переместить четыре объекта и проигрыватель SteamVR, обновив transform.position. Это работает нормально, однако выглядит не очень хорошо, потому что перемещение происходит мгновенно. Вот почему я хочу использовать Vector3.MoveTowards().
Каким-то образом приведенный ниже код не выполняет задание. Я надеялся, что кто-нибудь сможет мне помочь.
private void ZoomObject(Vector3 currentPlayerPosition, float height, float distance)
{
TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
TPEastObject.transform.position = Vector3.MoveTowards(TPEastObject.transform.position, new Vector3(distance, height, 0), 10 * Time.deltaTime);
TPSouthObject.transform.position = Vector3.MoveTowards(TPSouthObject.transform.position, new Vector3(0, height, -distance), 10 * Time.deltaTime);
TPWestObject.transform.position = Vector3.MoveTowards(TPWestObject.transform.position, new Vector3(-distance, height, 0), 10 * Time.deltaTime);
}
Чего я ожидал, так это того, что объект переместится в новое векторное место. Однако, похоже, это не так.
Может кто-нибудь дать мне некоторое представление или совет?
Заранее спасибо
Комментарии:
1. Как вы вызываете этот
ZoomObject
метод. Это вызывается только один раз?2. Вам нужно вызвать это в цикле, иначе оно будет выполнено только один раз
Ответ №1:
Из документации Unity:
https://docs.unity3d.com/ScriptReference/Vector3.MoveTowards.html
Вычислите положение между точками, указанными current и target, перемещаясь не дальше расстояния, указанного maxDistanceDelta.
Используйте элемент MoveTowards для перемещения объекта из текущего положения в целевое положение. Обновляя положение объекта в каждом кадре, используя положение, вычисленное этой функцией, вы можете плавно перемещать его к цели. Управляйте скоростью перемещения с помощью параметра maxDistanceDelta.
То есть MoveTowards не выполняет плавную анимацию за вас. Если вы не хотите какого-либо анимационного эффекта, ваша функция ZoomObject должна вызываться в цикле, пока ваш объект не достигнет целевого положения. Ознакомьтесь с примером на странице документации.
Для этого вы можете использовать цикл или сопрограмму. Может быть, что-то, что выглядело бы примерно так.
IEnumerator Fade()
{
while (Vector3.Distance(TPNorthObject.transform.position, new Vector3(0, height, distance)) > 0.001f)
{
// Speed = Distance / Time => Distance = speed * Time. => Adapt the speed if move is instant.
TPNorthObject.transform.position = Vector3.MoveTowards(TPNorthObject.transform.position, new Vector3(0, height, distance), 10 * Time.deltaTime);
yield return null;
}
}