Menu
CoddyTech

先読み

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 49/71。

移動するプレイヤーを中心に捉えるカメラでは、進行方向だけでなく、通ってきた場所も同じくらい映ります。代わりに少し先を映すには、プレイヤーの進行方向側に、プレイヤーの前方数ユニットの位置でカメラを構えます。

プレイヤーが向きを変えると、先を映す位置も反対側に切り替わりますが、その位置をすぐに切り替えると画面全体が跳ねます。そこで、先を映す位置をフィールドに保持し、各フレームで少しずつ新しい値に近づけます。これにはMathf.MoveTowardsを使います。このボートカメラは2ユニット先を映し、1秒あたり3ユニットの速度で移動します。

float lead;
float heading = 1f;   // 1 は右へ航行、-1 は左へ航行

void LateUpdate()
{
    lead = Mathf.MoveTowards(lead, heading * 2f, 3f * Time.deltaTime);
    transform.position = new Vector3(boat.position.x + lead, transform.position.y, transform.position.z);
}

進行方向は、ボートが最後に移動した方向です。x座標を前のフレームのx座標と比較し、移動していないフレームでは進行方向をそのままにします。そうすれば、ボートが止まっている間も、先を映す位置が保たれます。

challenge icon

チャレンジ

中級

横方向のカメラに、ランナーが進む先をより多く映しましょう。

  1. LateUpdate()で、ランナーのx座標とlastXを比較します。右に動いたらdirectionを1に、左に動いたら-1に設定し、止まっている場合はそのままにします。
  2. shift = Mathf.MoveTowards(shift, direction * ahead, shiftSpeed * Time.deltaTime);でshiftを滑らかに動かします。
  3. y座標とz座標はそのままにして、カメラのx座標をplayer.position.x + shiftに設定します。

「プレイ」を押して、両方向に走ってみましょう。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class LookAheadCamera : MonoBehaviour
{
    public Transform player;
    public float ahead = 3f;
    public float shiftSpeed = 4f;

    void LateUpdate()
    {
        // プレイヤーが最後に移動した方向へ ahead 単位だけ先行し、shiftSpeed の速度で滑らかに移動する。
        transform.position = new Vector3(player.position.x, transform.position.y, transform.position.z);
    }
}

物理演算とゲームプレイのすべてのレッスン

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