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を1回ログに記録する
    }
}

Unityスクリプトの基礎のすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド