current | 移动的开始位置。 |
target | 移动的目标位置。 |
maxDistanceDelta | 每次调用移动 current 的距离。 |
Vector3 新位置。
计算 current
指定的点与 target
指定的点之间的位置,移动距离不超过 maxDistanceDelta
指定的距离。
使用 MoveTowards 成员将 current
位置处的对象移向 target
位置。通过使用此函数计算的位置来更新每个帧的对象位置,您可以平滑地将其移向目标。使用 maxDistanceDelta
参数来控制移动的速度。如果 current
位置相比 maxDistanceDelta 更靠近 maxDistanceDelta
,则返回值等于 maxDistanceDelta
;新位置不会过冲 maxDistanceDelta
。要确保对象速度与帧率无关,请将 maxDistanceDelta
值乘以 Time.deltaTime(或者 FixedUpdate 循环中的 Time.fixedDeltaTime)。
请注意,如果将 maxDistanceDelta 设置为负值,则该函数将返回与 target
相反方向的位置。
using UnityEngine;
// Vector3.MoveTowards example.
// A cube can be moved around the world. It is kept inside a 1 unit by 1 unit // xz space. A small, long cylinder is created and positioned away from the center of // the 1x1 unit. The cylinder is moved between two locations. Each time the cylinder is // positioned the cube moves towards it. When the cube reaches the cylinder the cylinder // is re-positioned to the other location. The cube then changes direction and moves // towards the cylinder again. // // A floor object is created for you. // // To view this example, create a new 3d Project and create a Cube placed at // the origin. Create Example.cs and change the script code to that shown below. // Save the script and add to the Cube. // // Now run the example.
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; } } }