Unityで学ぶ:方向ベクトル(normalized)と大きさ(magnitude)を組み合わせた応用例

これを理解すると、敵キャラのAIやプレイヤーの移動演出などがぐっとリアルになります。

はじめに

ベクトルの「方向」と「大きさ」を分けて考えると、ゲームの動きに幅が出ます。

ここでは代表的な応用例として、敵キャラがプレイヤーに近づくと速度を落とす 移動処理を紹介します。


1. 基本となる移動処理

まずは「敵がプレイヤーに向かって移動する」基本コードです。

void Update()
{
    Vector3 toPlayer = (player.position - transform.position);

    // 方向(normalized)
    Vector3 dir = toPlayer.normalized;

    // 一定速度で移動
    transform.position += dir * moveSpeed * Time.deltaTime;
}
  • (player.position – transform.position) でプレイヤーまでのベクトルを取得
  • .normalized で「向き」だけにして進む
  • moveSpeed で移動スピードを調整

2. 距離に応じてスピードを調整する

ここで magnitude(距離) を使って、近づいたら減速するようにします。

void Update()
{
    Vector3 toPlayer = player.position - transform.position;

    // 距離を計算
    float distance = toPlayer.magnitude;

    // 方向を計算
    Vector3 dir = toPlayer.normalized;

    // 距離が近いほどスピードを落とす(最大1.0, 最小0.2)
    float speedFactor = Mathf.Clamp(distance / 10f, 0.2f, 1.0f);

    transform.position += dir * moveSpeed * speedFactor * Time.deltaTime;
}

ポイント

  • distance / 10f → 10メートル離れていれば 1.0、近づくと 0.2 に近づく
  • Mathf.Clamp → 値を「0.2〜1.0」の範囲に制限
  • 距離に応じて自然に減速する敵AIが実現できる

3. さらに応用:近づいたら止まる

「一定距離まで来たら止まる」という処理も、magnitudeを使えば簡単です。

void Update()
{
    Vector3 toPlayer = player.position - transform.position;
    float distance = toPlayer.magnitude;

    if (distance > 2f) // 2m以上離れていたら近づく
    {
        transform.position += toPlayer.normalized * moveSpeed * Time.deltaTime;
    }
    else
    {
        Debug.Log("攻撃可能距離に入りました!");
    }
}

4. 実際のゲームでの活用シーン

  • 敵AI:プレイヤーに近づいて減速、攻撃距離で停止
  • アイテム取得判定:プレイヤーとアイテムの距離が一定以下なら拾う
  • カメラ制御:プレイヤーに近づくほどゆっくりカメラを追従させる
  • 移動演出:ゴールに近づくとブレーキがかかる自然な動き

まとめ

  • normalized → 進む方向を決める
  • magnitude → どのくらい離れているかを調べる
  • 両方を組み合わせることで「方向に移動するが、距離に応じて速度を変える」といった自然な挙動が作れる

訪問数 3 回, 今日の訪問数 3回

Unity

Posted by hidepon