朝一个点移动
本课属于 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 写法。
挑战
中等按下 Space 时,让无人机飞到着陆平台。
- 添加字段
bool flying;和bool landed;。当触发Input.GetKeyDown(KeyCode.Space)时,将flying = true;。 - 当
flying && !landed时,使用Vector3.MoveTowards(transform.position, pad, speed * Time.deltaTime)移动。 - 当
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 在线编辑器