プレイヤーを追従する2Dカメラの作り方

前回まででクリア・ゲームオーバー処理ができました。次はプレイヤーに追従する2Dカメラを作り、ユニティちゃんが移動したらそれに合わせて画面がスクロールするようにしてみましょう。

スポンサーリンク

今回作るカメラ処理の仕様

ではカメラの処理を作り始める前に、まず「今回のゲームではカメラにどんな処理が必要なのか?」を考えます。というのも、

  • カメラの移動処理は地味だけど非常に重要
  • しかも、実は考えるべきことがとても多い処理

だからです。

それで汎用性の高いカメラを作ろうとすると難しい内容になってしまうので、ここでは難しい部分をバッサリ省いたシンプルな

X軸方向だけプレイヤーを追従するカメラ

を作ります。実際の動きは下のGIF動画をご覧ください。

(クリックで動画再生)

ちなみに「なんでX軸方向だけ追従させるの?」と思う方がいると思うので説明しておくと、一言でいえば「Y軸方向も追従させると、ジャンプしたときに目が疲れるから」です。

実はX,Yの両方を追従させるやり方が一番簡単(=カメラをプレイヤーの子にすれば良いだけ)なのですが、そうするとジャンプしたときの画面移動が大きくなって見づらくなります。個人的にそれは嫌だったので、今回はX軸方向だけ追従させることにしたというわけです。

ただ、このやり方だと「ユニティちゃんがカメラの範囲よりも高い(or低い)位置に移動したときに画面外になってしまう」という問題があります。しかしこれを解決する処理を入れると難しくなってしまうため、あとでステージを作るときは「ステージがカメラの範囲内に収まるように作る」という制約をつけて作ることにします。

プレイヤーをX軸方向だけ追従するカメラのC#スクリプト

仕様が固まったら、さっそくそれをスクリプトに落とし込んでいきましょう。新しく「FollowCamera」という名前のC#スクリプトを作り、次のコードを書いてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class FollowCamera : MonoBehaviour
{

    GameObject playerObj;
    PlayerController player;
    Transform playerTransform;

    void Start()
    {
        playerObj = GameObject.FindGameObjectWithTag("Player");
        player = playerObj.GetComponent<PlayerController>();
        playerTransform = playerObj.transform;
    }

    void LateUpdate()
    {
        MoveCamera();
    }

    void MoveCamera()
    {

        //横方向だけ追従
        transform.position = new Vector3(playerTransform.position.x, transform.position.y, transform.position.z);
    }

}

簡単なスクリプトなので説明はいらないと思います。ただし一点だけ補足しておくと「カメラを追従させるときはLateUpdate内で行うと良い」ということだけ覚えておいてください。というのはLateUpdateは必ずUpdateの後に呼び出されるので、

  1. まず、Updateでキャラクターが移動する
  2. キャラの移動処理が完了し、座標が確定してからカメラを移動させる

という手順で処理を行わせることができるからです。こうしないと場合によっては「カメラがカクカクする」ことがあるのですが、この手順で処理を行えば滑らかにカメラを動かせるというわけです。

さて、スクリプトを書けたらこれをMainCameraにアタッチしましょう。実際にゲームを動かしてみて、先ほどの動画のようにカメラが追従すれば成功です。


次のページ→UIを使った背景の作り方