点に向かって移動する
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を1回ログに記録する
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド