Menu
CoddyTech

先読み

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

動いている対象に向けたカメラには、これから進む場所だけでなく、これまでいた場所も映ります。代わりに、対象より少し先の点を狙いましょう。対象の位置に、速度と秒単位の先行時間を掛けた値を加えた点です。レーストラック脇のスタンドに設置したこのカメラは、車を追って向きを変え、車の0.5秒先を狙います。

public Rigidbody car;
public float lead = 0.5f;

void LateUpdate()
{
    Vector3 aim = car.position + car.linearVelocity * lead;
    transform.LookAt(aim);
}

秒速20単位なら照準点は車の10単位前、秒速4単位なら2単位前になり、停止中の車はそのまま正面から狙います。速度は車の実際の動きなので、スリップ中や後退中でも照準点は正しい位置にあります。transform.forwardではそうなりません。後退中の車の前方は進行方向とは逆を向き、転がるボールの前方はボールとともに回転するからです。

追従カメラでも先行できます。対象そのものではなく、その前方の点を画面に収めます。プレイヤーが振り返るときのように、その点が反対側へ移る可能性がある場合は、フレームごとに先行量を少しずつ変えましょう。そうしないと、画面全体が一度に飛んでしまいます。

challenge icon

チャレンジ

中級

この横視点カメラは、x軸に沿ってランナーを追います(矢印キーで左右に動かします)。ランナーが進む先をより多く映すカメラにしましょう。

  • カメラは、ランナーが最後に進んだ側のx軸方向で、ランナーよりahead(3)単位先に位置します。ランナーが最初に動くまでは、ランナーを中心に映します。
  • ランナーが向きを変えたら、先行位置は飛び移るのではなく、1秒あたりshiftSpeed(4)単位の速さで反対側へ移動します。
  • ランナーが停止しても、カメラは先行位置を保ちます。
  • カメラのyとzはそのままにします。

Playを押し、両方向に走ってから、Checkを押します。

自分で試してみよう

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);
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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