Menu
CoddyTech

朝一个点移动

本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 35 课,共 85 课。

Vector3.MoveTowards(current, target, maxStep) 返回一个距离 target 最多近 maxStep 的点。如果目标比这段距离更近,它就返回目标本身,因此不会越过目标。将 speed * Time.deltaTime 作为步长时,对象会以稳定的速度移动,并准确停在目标位置。这辆缆车以每秒 2 个单位的速度滑向车站:

public Vector3 station = new Vector3(6, 3, 0);
public float speed = 2f;

void Update()
{
    transform.position = Vector3.MoveTowards(transform.position, station, speed * Time.deltaTime);
}

到达后,之后每次调用都会再次返回 station,所以缆车会停在原地,并且 transform.position == station 为 true。对于单个数字,Mathf.MoveTowards 的工作方式也一样。

Vector3.Lerp(a, b, t) 表示从 a 到 b 移动 t 比例后到达的点:当 t = 0.5 时,它就在中点。在 Update() 中写成 Lerp(transform.position, station, 2f * Time.deltaTime) 时,它每帧都会移动剩余距离的一部分:一开始很快,接近终点时越来越慢,逐渐靠近目标,而不是以固定速度到达。对象需要以固定速度移动并准确停下时,使用 MoveTowards;需要平缓减速时,使用这种 Lerp 写法。

challenge icon

挑战

中等

按下 Space 时,让无人机飞到着陆平台。

  1. 添加字段 bool flying; 和 bool landed;。当触发 Input.GetKeyDown(KeyCode.Space) 时,将 flying = true;。
  2. 当 flying && !landed 时,使用 Vector3.MoveTowards(transform.position, pad, speed * Time.deltaTime) 移动。
  3. 当 transform.position == pad 时,设置 landed 并记录日志 Landed。

按下“开始”,然后按 Space:无人机就会降落在平台上。接着按“检查”。

亲手试试

using UnityEngine;

public class Drone : MonoBehaviour
{
    public Vector3 pad = new Vector3(0, 0.25f, 0);
    public float speed = 2f;

    void Update()
    {
        // 按下 Space 后:以 speed 飞向 pad,到达时只记录一次 Landed
    }
}

Unity 脚本基础中的所有课

自己练习: Unity 在线编辑器