Объявление
public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);Параметры
current | Позиция, из которой нужно двигаться. |
target | Позиция, к которой нужно двигаться. |
maxDistanceDelta | Расстояние для перемещения current за вызов. |
Возвращает
Vector3 Новая позиция.
Описание
Вычислить положение между точками, указанными current
и target
, перемещаясь не дальше, чем на расстояние, указанное maxDistanceDelta
.
Используйте элемент MoveTowards, чтобы переместить объект из current
позиции в направлении target
позиция. Обновляя положение объекта в каждом кадре, используя положение, вычисленное этой функцией, вы можете плавно перемещать его к цели. Управляйте скоростью движения с помощью параметра maxDistanceDelta
. Если current
положение уже ближе к target
, чем maxDistanceDelta , возвращаемое значение равно target
; новая позиция не превышает target
. Чтобы скорость объекта не зависела от частоты кадров, умножьте значение maxDistanceDelta
на Time.deltaTime (или Time.fixedDeltaTime в цикле FixedUpdate).
Обратите внимание: если для параметра maxDistanceDelta задано отрицательное значение, эта функция возвращает позицию в противоположном направлении от target
.
using UnityEngine;
// Пример Vector3.MoveTowards.
// Куб можно перемещать по миру. Он хранится внутри 1 единицы на 1 единицу
// пробел xz. Создается небольшой длинный цилиндр, который располагается вдали от центра
// блок 1x1. Цилиндр перемещается между двумя точками. Каждый раз, когда цилиндр
// позиционированный куб движется к нему. Когда куб достигает цилиндра, цилиндр
// перемещается в другое место. Затем куб меняет направление и движется
// снова к цилиндру.
//
// Объект пола создан для вас.
//
// Чтобы просмотреть этот пример, создайте новый 3D-проект и создайте куб, размещенный в
// Происхождение. Создайте Example.cs и измените код скрипта на показанный ниже.
// Сохраняем скрипт и добавляем в куб.
//
// Теперь запустим пример.
public class Example : MonoBehaviour
{
// Adjust the speed for the application.
public float speed = 1.0f;
// The target (cylinder) position.
private Transform target;
void Awake()
{
// Position the cube at the origin.
transform.position = new Vector3(0.0f, 0.0f, 0.0f);
// Create and position the cylinder. Reduce the size.
var cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
cylinder.transform.localScale = new Vector3(0.15f, 1.0f, 0.15f);
// Grab cylinder values and place on the target.
target = cylinder.transform;
target.transform.position = new Vector3(0.8f, 0.0f, 0.8f);
// Position the camera.
Camera.main.transform.position = new Vector3(0.85f, 1.0f, -3.0f);
Camera.main.transform.localEulerAngles = new Vector3(15.0f, -20.0f, -0.5f);
// Create and position the floor.
GameObject floor = GameObject.CreatePrimitive(PrimitiveType.Plane);
floor.transform.position = new Vector3(0.0f, -1.0f, 0.0f);
}
void Update()
{
// Move our position a step closer to the target.
var step = speed * Time.deltaTime; // calculate distance to move
transform.position = Vector3.MoveTowards(transform.position, target.position, step);
// Check if the position of the cube and sphere are approximately equal.
if (Vector3.Distance(transform.position, target.position) < 0.001f)
{
// Swap the position of the cylinder.
target.position *= -1.0f;
}
}
}