【小・中学生でもわかる】Unityでカメラがキャラクターを追いかける方法【初心者向け】

子ども・小学生・中学生向けに、Unityでカメラをキャラクターに追従させる方法を初心者向けに解説。プログラム不要の方法から、C#スクリプトを使った2D追従、なめらかなカメラ移動まで紹介します。

お子様
お子様
Unityでキャラクターが画面の外に出てしまう!
お子様
お子様
カメラがキャラクターについてきてほしい!

Unityで横スクロールゲームや探索ゲームを作るとき、カメラをキャラクターに追従させる処理は必ず必要になります。

この記事では、小学生・中学生のUnity初心者のお子様でもわかりやすいシンプルなカメラ追従スクリプトから、なめらかに動くスムーズ追従まで解説します!

【方法1】プログラム不要のシンプルな追従

シンプルにUnityのカメラをキャラクターに追いかけさせる方法としては、カメラをキャラクターにくっつけてしまう方法です。

Unityのヒエラルキーウインドウで、Main Cameraをキャラクターにドラッグ&ドロップします。

「runner」というキャラクターにMainCameraをドラッグ&ドロップした図

この方法は、キャラクターがカメラを自撮り棒をもって歩き回るイメージです。

キャラクターが動けば、同じ位置関係を保ったまま自撮り棒につながったカメラも動きます。
なので、キャラクターの動きにぴったり合わせてカメラが動いてくれるようになります。

シンプルなゲームの場合は、この方法でも十分活用できます。

【方法2】2Dでシンプルな追従(初心者向け)

次の方法は、Unity上のカメラの位置をキャラクターの位置に合わせ続けることです。

C#のプログラムを作ってカメラに追いかける動きをさせましょう。

スクリプトを作ろう

CameraFollow という名前でC#スクリプトを作成し、Main Camera にアタッチします(キャラクターではなくカメラに!←ここ大事)。

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    // 追いかける対象のTransform(InspectorでPlayerをドラッグして設定する)
    [SerializeField] private Transform target;

    // カメラのZ座標(ここではZ=-10を使う)
    [SerializeField] private float zOffset = -10f;

    // ここでカメラがブレるのを防ぐ
    void LateUpdate()
    {
        // だれを追いかけるかが設定されていなければ何もしない
        if (target == null) return;

        // カメラの位置をキャラクターのX・Y座標に合わせる
        // Z座標は固定してカメラが前後に動かないようにしておく
        transform.position = new Vector3(
            target.position.x,  // キャラクターのX座標
            target.position.y,  // キャラクターのY座標
            zOffset             // カメラのZ座標は固定
        );
    }
}

UnityのインスペクタウインドウでTarget(追いかける対象)を設定する

スクリプトをMain Cameraにアタッチしたらインスペクタを開き、「Target」の項目にリストから選択、または、ヒエラルキーウインドウから追いかけたいキャラクターのオブジェクトをドラッグ&ドロップしましょう。

設定したら、実際にプレイして動作確認をしてみましょう。

【方法3】なめらかにカメラが追いかける

先ほどの「方法1」や「方法2」は、カメラがキャラクターにピタッとついてくるため、少しぎこちない動きになります。
Lerp(なめらかに移動するような処理)を使うと、カメラがすこし遅れてついてくるので、カメラマンがカメラを動かしているかのような自然な動きになります!

新しくCameraFollowSmoothというスクリプトを作成し、カメラにアタッチしておきます。
※先程作ったCameraFollowスクリプトはMainCameraから外してください。

CameraFollowSmoothスクリプトの内容は以下のとおりです。

using UnityEngine;

public class CameraFollowSmooth : MonoBehaviour
{
    // 追いかける対象
    [SerializeField] private Transform target;

    // 追従のなめらかさ(小さいほど遅れてついてくる。0.1〜0.3が自然)
    [SerializeField] private float smoothSpeed = 0.15f;

    // キャラクターからカメラをずらす(インスペクタウインドウから好きに調整してください)
    [SerializeField] private Vector3 offset = new Vector3(0f, 2f, -10f);

    void LateUpdate()
    {
        if (target == null) return;

        // カメラが目指す位置 = キャラクターの位置 + オフセット
        Vector3 desiredPosition = target.position + offset;

        // 現在の位置から目標位置へ、smoothSpeedの割合だけ近づける ← ここが大事!
        // Lerp(現在地, 目標地, 補間率) :補間率が大きいほど素早く追う
        Vector3 smoothedPosition = Vector3.Lerp(
            transform.position,   // 現在のカメラの位置
            desiredPosition,      // 目指す位置
            smoothSpeed           // どれだけ近づくか(0〜1)
        );

        // 計算した位置をカメラに適用する
        transform.position = smoothedPosition;
    }
}

カメラがほんの少しだけ遅れてついてきていたら成功です!

よくある失敗・エラーと対処法

キャラクターは動くがカメラが動かない

  • 作成したスクリプトがMain Cameraのゲームオブジェクトに正しくアタッチされているか確認しましょう(Main Cameraのインスペクタウインドウに「CameraFollow(Script)」など表示がされているか)
  • カメラのインスペクタのTargetに追従させたいプレイヤーのオブジェクトが設定されているか確認しましょう

カメラがガタガタする

  • Update() ではなく LateUpdate() を使いましょう。
    LateUpdateはキャラクターの移動処理が終わった後に実行されるため、ガタつきが起きません。

2Dゲームでカメラが映らなくなった

  • カメラのZ座標が0になっていませんか?2Dゲームでは通常 -10 に設定します。

offset(オフセット)のY座標を変えてもカメラ位置が変わらない

  • スクリプトを変更した後はUnityエディタを確認し、インスペクタの値が反映されているか確認しましょう。
  • カメラのインスペクタで値が設定されていると、プログラムのカメラ座標を編集しても反映されません。

まずはUnityのカメラのシンプルな追従から始めて、動きに慣れてきたらスムーズ追従にチャレンジしてみましょう!

小中学生のお子様へ!アンズテックでUnityを本格的に学びましょう

カメラ追従を実装できたら、次はスクロールゲームやアクションゲームの完成に挑戦しましょう!
アンズテックでは現役プログラマーが一緒にUnityゲームを作ります。

アンズテックのUnityの体験レッスンでは、3Dゲームを作りながらカメラの動きも操作できます。
ゲームクリエイターを目指すお子様は、ぜひアンズテックの無料体験レッスンへお越しください!

アンズテック子どもプログラミング教室

プログラミング講師 / プログラマー 指導歴9年

アンズテックは、小中学生向けの完全オンラインプログラミングスクールです。ScratchやUnityを使い、子どもの興味に合わせた楽しいカリキュラムで、創造力・思考力・ITスキルを育みます。全国どこからでも現役プログラマーの受講が可能!

223本の記事を執筆

NEWS一覧へ