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回
ディスカッション
コメント一覧
まだ、コメントがありません