先読み
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座標と比較し、移動していないフレームでは進行方向をそのままにします。そうすれば、ボートが止まっている間も、先を映す位置が保たれます。
チャレンジ
中級横方向のカメラに、ランナーが進む先をより多く映しましょう。
LateUpdate()で、ランナーのx座標とlastXを比較します。右に動いたらdirectionを1に、左に動いたら-1に設定し、止まっている場合はそのままにします。shift = Mathf.MoveTowards(shift, direction * ahead, shiftSpeed * Time.deltaTime);でshiftを滑らかに動かします。- 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プレイグラウンド