お役立ち情報

コードを使わずにUnityでキャラ追従のカメラを作る方法

Unityでカメラ

Unityはコードなしでいろいろな機能を使える魅力があり、コードを書いたとしてもだいたいのことはクラスに用意されている関数でできてしまいます。そこでこのページではUnityでキャラ追従のカメラをコードなしに作る方法を紹介します。

カメラのインポートから設定まで

それでは具体的にUnityでキャラ追従型のカメラを設定する方法を紹介します。まずカメラのインポートですが、以下のようになります。

メニューから「Asset → Import Package → Cameras」と進みます。そうするとカメラのインポートをするかどうかの確認画面が出てくるので、インポートします。次にプレハブを入れます。

「 Standard Assets → Cameras → Prefabs」という手順で設定できます。ここまで設定できたら土台は整ったのですが、もともとあったカメラが邪魔になります。そこで、キャラを指定する前にメインのカメラを削除してしまいます。方法はメインカメラを選択して削除するだけです。

カメラにキャラを指定する

次にカメラがどのキャラに追従するのかを指定します。

方法としては、カメラを追従させたいキャラクターにPlayerタグを付けます。インスペクターのTagから選ぶだけなので一瞬です。

スクリプトでカメラのカスタマイズ

上で紹介した方法でカメラをキャラクターに追従することができます。これで基本的な設定は終わったのでそれ以上いじる必要はなく、ゲームとしても問題ありません。しかし、カメラにスクリプトを追加することでより機能性を高めることができます。

スクリプトのサンプルコードは以下です。

CameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {
    public Transform target;
    public float smoothing = 5f;
    private Vector3 offset;

    void Start () {
        offset = transform.position - target.position;
    }

    void Update () {
        Vector3 targetCamPos = target.position + offset;
        transform.position = Vector3.Lerp(
            transform.position,
            targetCamPos,
            Time.deltaTime * smoothing
        );
    }
}

スクリプトを書くことでカメラの位置や角度を細かく設定できます。また、常にプレイヤーの後ろからのみ追従させることも可能です。こうすることで、キャラクターの目線に近い状態でなおかつキャラクターを見ながらプレイすることができます。

サンプルコードは以下です。

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

public class ChaseCamera : MonoBehaviour {

    private GameObject player;
    private Vector3 prevPlayerPos;
    private Vector3 posVector;
    public float scale = 3.0f;
    public float cameraSpeed = 1.0f;

    void Start () {
        player = GameObject.Find ("CameraTarget");
    prevPlayerPos = new Vector3 (0, 0, -1);
    }

    void Update () {
        Vector3 currentPlayerPos = player.transform.position;
        Vector3 backVector = (prevPlayerPos - currentPlayerPos).normalized;
        posVector = (backVector == Vector3.zero) ? posVector : backVector;
        Vector3 targetPos = currentPlayerPos + scale * posVector;
        targetPos.y = targetPos.y + 0.5f;
        this.transform.position = Vector3.Lerp (
            this.transform.position,
            targetPos,
            cameraSpeed * Time.deltaTime
        );
        this.transform.LookAt (player.transform.position);
        prevPlayerPos = player.transform.position;
    }
}

これでカメラの位置ベクトルがキャラクターの背面となりました。同様に、以下のサンプルコードのように記述すれば正面ベクトルにすることができます。つまり、キャラクターの正面から撮影できます。

void Update () {
    Vector3 currentPlayerPos = player.transform.position;
    Vector3 frontVector = (currentPlayerPos - prevPlayerPos).normalized;
    posVector = (frontVector == Vector3.zero) ? posVector : frontVector;
    Vector3 targetPos = currentPlayerPos + scale * posVector;
    targetPos.y = targetPos.y + 0.5f;
    this.transform.position = Vector3.Lerp (
        this.transform.position,
        targetPos,
        cameraSpeed * Time.deltaTime
    );
    this.transform.LookAt (player.transform.position);
    prevPlayerPos = player.transform.position;
}

これでキャラクターの正面からのアングルになりました。

まとめ

以上、カメラをキャラクターに追従させる方法を紹介してきました。基本的にはコードなしで設定することが可能です。ただし詳細な設定を行いたい場合はスクリプトを書くことになります。

今回紹介した方法だと自動でカメラを追従する方法や、背面や前面で固定する方法についてでしたが、キャラクターの動きに合わせて独特なカメラアングルを取るようなことも可能です。

ゲームによってはキャラクターが動くたびにアングルがぐるぐる回転するようなものもあります。個人的にはあまりにアングルを変えると目が回るのである程度固定しておきたいのですが、アングルが回転することで臨場感が増すというメリットがあります。

よくあるのが、前面から撮っているカメラに対してキャラクターが一定以上近づいてきたらカメラが背面に切り替わる、逆に背面からのカメラに対してキャラクターが離れていったら前面からのアングルに切り替わる、といったものです。

カメラワーク一つでゲームの特徴にもなるので、Unityでのゲーム制作になれてきたらこだわりたいポイントの一つです。

【Unity関連記事】
▼Unityの基礎編
・ 【unityのフリーランス求人・案件情報】エンジニア需要や開発単価、未経験でもいける?
・ 【unity入門】ゲーム開発だけじゃない、Unityで出来ること

▼Unityの外部アセット、リソース編
・ UnityでMMDモデルを自由自在に動かしてみよう!
・ Unity adsを使って簡単に広告を導入しよう
・ Unityのアセットストアの上手な使い方
・ Unityで作られているARアプリをまとめてみました

▼Unityのコンポーネント編
・ Unityのrigidbodyを使って物理演算を導入してみよう
・ (この記事)コードを使わずにUnityでキャラ追従のカメラを作る方法
・ Unityで簡単にアニメーションを作成する方法をまとめました
・ Unityでオブジェクトを回転させる方法をわかりやすくまとめました
・ Unityのtransformを使ってオブジェクトの座標や回転を操作する
・ Unityのアニメーターを簡単に作成する方法まとめ
・ UnityのShaderの解説と使い方まとめました
・ Unityで「当たり判定」(衝突判定)を付ける方法
・ Unityのgetcomponentの上手な使い方と使用時の注意点まとめ
・ Unityでキャラの移動を制御する方法まとめ
Unityのraycastを使って出来ることをまとめました

▼Unityのデフォルト機能、ゲーム製作編
blenderで作ったオブジェクトをUnityで組み込んでみよう
・ Unityのコルーチンとは?使い方をまとめました
Unityで作られているRPGゲームを作るための6つのステップ
・ Unityのパーティクルを使って演出できるエフェクト例
・ UnityでのUIデザインの基礎をまとめてみました
Unityのcloud buildの便利な点をまとめました
・ Unityを使って半日でFPSゲームを作ってみよう

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ