UnityUnityメモ

Unityでメインカメラをプレイヤーに追従させる方法

Unity

1. はじめに

Unityでゲームを作るとき、キャラクターを動かすだけでなく、そのキャラクターをカメラが追いかける仕組みが必要になることがよくあります。これを「カメラの追従」と呼びます。例えば、プレイヤーが広いフィールドを動き回るゲームでは、カメラがプレイヤーを見失わないように自動で追いかける必要がありますよね。

「でも、カメラを追従させるスクリプトなんて難しそう…」と思う方もいるかもしれません。大丈夫です!この記事では、初心者でも簡単に理解できるように、Unityでメインカメラをプレイヤーに追従させる方法を詳しく解説します。

Unityを触ったことがないという方はコチラの記事から見てみてください!



1.オブジェクトを配置する

まず、プレイヤーキャラクターとして動かすキューブと床を配置します。

床を作成

  1. ヒエラルキー(Hierarchy)ウィンドウで右クリックして、「3D Object」→「Plane」を選択して、シーン内に床を作成します。
  2. 位置やサイズはそのままでも問題ありません。

Cube(プレイヤー)を作成

  1. Hierarchy(ヒエラルキー)ウィンドウで右クリックします。
  2. 「3D Object(3Dオブジェクト)」→「Cube(キューブ)」を選びます。これでシーンにキューブが追加されます。
  3. 追加されたキューブの名前を「Player」に変更します。

色を変更(任意)

  1. プロジェクトウィンドウを右クリック、「Create」→「Material」を選択します。
  2. インスペクター画面から色を設定して「Cube」にアタッチします。

物理特性を追加する

  1. インスペクター画面の「AddComponent」ボタンをクリックします。
  2. 「Rigidbody」を検索して追加します。



2. プレイヤー移動スクリプトの作成

次に、プレイヤー(Cube)を移動させるスクリプトを作成します。キーボードの矢印キーを使って、簡単に前後左右に動かせるようにします。


スクリプトを作成する

  1. プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選択します。
  2. 新しいスクリプトの名前を「CubeMove」と入力します。
  3. 作成したスクリプトをダブルクリックして開き、以下のコードをコピーして貼り付けてください。

1. 最初の部分(usingの部分)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  • ここでは、スクリプトを書くために必要な「ライブラリ」を読み込んでいます。
    • UnityEngine: Unityの機能(オブジェクトの移動や入力など)を使うために必要です。
    • System.CollectionsSystem.Collections.Generic: コレクション(リストや配列など)を扱うためのものですが、今回のスクリプトでは特に使っていません。

2. クラスの宣言

public class CubeMove : MonoBehaviour
  • public class CubeMove:
    • このスクリプトの名前を「CubeMove」にしています。この名前はファイル名と一致している必要があります。
  • : MonoBehaviour:
    • Unityの「スクリプトの親クラス」です。これを付けることで、Unityの中でこのスクリプトを使えるようになります。

3. Updateメソッド

void Update () {
  • Update():
    • Unityの「フレームごとに呼ばれる」メソッドです。毎秒60回(またはそれ以上)、この中のコードが実行されます。
    • キーボードの入力を常に監視し、キューブを動かすために使っています。

4. 矢印キーでの移動処理

if (Input.GetKey (KeyCode.LeftArrow)) {
this.transform.Translate (-0.1f,0.0f,0.0f);
}
  • Input.GetKey(KeyCode.LeftArrow):
    • 「左矢印キー」が押されているかをチェックします。
  • this.transform.Translate(-0.1f, 0.0f, 0.0f):
    • キューブを「左に0.1」移動させます。
    • Translate(x, y, z):
      • オブジェクトを指定した方向に動かすメソッドです。
      • -0.1f: 左方向(X軸マイナス方向)に少しだけ移動します。
      • 0.0f: 上下方向(Y軸)は動かしません。
      • 0.0f: 奥行き方向(Z軸)も動かしません。

以下のコードも同じように、他の矢印キーをチェックしてキューブを動かします:

  • 右矢印キーif (Input.GetKey (KeyCode.RightArrow)) { this.transform.Translate (0.1f, 0.0f, 0.0f); }
    • X軸プラス方向(右)に移動。
  • 上矢印キーif (Input.GetKey (KeyCode.UpArrow)) { this.transform.Translate (0.0f, 0.0f, 0.1f); }
    • Z軸プラス方向(前)に移動。
  • 下矢印キーif (Input.GetKey (KeyCode.DownArrow)) { this.transform.Translate (0.0f, 0.0f, -0.1f); }
    • Z軸マイナス方向(後ろ)に移動。

全体の動き

  1. スクリプトをキューブにアタッチ
    • Unityエディタでこのスクリプトを作成し、キューブオブジェクトにドラッグ&ドロップします。
  2. ゲームをプレイ
    • ゲームを実行し、矢印キーを押すとキューブがその方向に動きます。
    • キューブは毎フレームごとに指定された分だけ移動します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CubeMove : MonoBehaviour
{
    void Update () {
        if (Input.GetKey (KeyCode.LeftArrow)) {
            this.transform.Translate (-0.1f,0.0f,0.0f);
        }
        if (Input.GetKey (KeyCode.RightArrow)) {
            this.transform.Translate (0.1f,0.0f,0.0f);
        }
        if (Input.GetKey (KeyCode.UpArrow)) {
            this.transform.Translate (0.0f,0.0f,0.1f);
        }
        if (Input.GetKey (KeyCode.DownArrow)) {
            this.transform.Translate (0.0f,0.0f,-0.1f);
        }
    }
}

スクリプトを設定する

  1. 作成したスクリプト「CubeMove」をヒエラルキー(Hierarchy)ウィンドウで選択した「Player」オブジェクト(Cube)にドラッグ&ドロップしてアタッチします。
  2. スクリプトが正しくアタッチされていることを確認します。
    • Playerオブジェクトを選択すると、インスペクター(Inspector)ウィンドウに「CubeMove」スクリプトが表示されます。



3. カメラ追従スクリプトの作成

カメラをプレイヤーに追従させるには、カメラが常にプレイヤーを一定の距離で追いかけるようにするスクリプトを作成します。以下の手順で進めていきましょう!


① 新しいスクリプトの作成

まず、カメラの動きを制御するためのC#スクリプトを作成します。

  1. プロジェクトウィンドウを開きます。
  2. Scriptsフォルダがない場合は作成しましょう。プロジェクトウィンドウ内で右クリックし、「Create」→「Folder」を選び、名前を「Scripts」にします。
  3. Scriptsフォルダ内で右クリックし、「Create」→「C# Script」を選びます。
  4. スクリプトの名前を CameraMove に変更します。

② スクリプトにコードを記述

作成した CameraMove スクリプトをダブルクリックして開きます。以下のコードを貼り付けてください。

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

public class CameraMove : MonoBehaviour
{
    public GameObject target; // カメラが追いかけるターゲット(プレイヤー)
    private Vector3 distance; // カメラとプレイヤー間の距離

    void Start()
    {
        // カメラとターゲットの初期距離を計算
        distance = transform.position - target.transform.position;
    }

    void LateUpdate()
    {
        // カメラをターゲットに追従させる
        transform.position = target.transform.position + distance;
    }
}

コードのポイント:

  • target: プレイヤーオブジェクトを指定するための変数です。publicにすることで、Unityのインスペクターから簡単に設定できます。
  • distance: カメラとプレイヤーの初期位置の距離を保存します。
  • Start(): 初回の距離を計算して設定します。
  • LateUpdate(): 毎フレーム、プレイヤーの位置に基づいてカメラを移動させます。LateUpdateを使うことで、他のオブジェクトの動きが完了した後にカメラを動かします。

1. 最初の部分

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
  • ここではUnityの基本機能を使えるようにするためのライブラリを読み込んでいます。
    • UnityEngine: Unityの機能を使うために必須のライブラリです。

2. クラスの宣言

public class CameraMove : MonoBehaviour
  • public class CameraMove:
    • このスクリプトの名前を「CameraMove」にしています。
    • ファイル名も「CameraMove.cs」にしておく必要があります。
  • : MonoBehaviour:
    • Unityで使うスクリプトには必須の部分です。

3. 変数の宣言

public GameObject target; // カメラが追いかけるターゲット(プレイヤー)
private Vector3 distance; // カメラとプレイヤー間の距離
  • public GameObject target:
    • カメラが追いかける「ターゲット」を指定する変数です。
    • Unityエディタで、追いかけたいオブジェクト(たとえばプレイヤーのキャラクター)をこの変数にドラッグ&ドロップで設定します。
  • private Vector3 distance:
    • カメラとターゲット(プレイヤー)との間の距離を記録する変数です。
    • **Vector3**はX、Y、Zの3つの値を持つ型で、オブジェクトの位置や方向を表すのに使います。

4. Startメソッド

void Start()
{
// カメラとターゲットの初期距離を計算
distance = transform.position - target.transform.position;
}
  • Start():
    • ゲーム開始時に1回だけ実行されるメソッドです。
  • distance = transform.position - target.transform.position:
    • カメラの現在位置(transform.position)とターゲットの現在位置(target.transform.position)との差を計算し、それを距離として記録します。
    • これにより、ゲーム中ずっとカメラがターゲットと同じ距離を保てるようになります。

5. LateUpdateメソッド

void LateUpdate()
{
// カメラをターゲットに追従させる
transform.position = target.transform.position + distance;
}
  • LateUpdate():
    • **Update()**と似ていますが、他のオブジェクトの動きが全て終わった後に呼ばれるメソッドです。
    • プレイヤーの動きが確定した後でカメラを動かすために使います。
  • transform.position = target.transform.position + distance:
    • ターゲットの現在位置に対して、計算した「距離」を足し算して、カメラをその位置に移動させます。
    • この結果、カメラがターゲットを追いかけるようになります。

全体の動き

  1. カメラとターゲットの距離を記録:
    • ゲームが始まると、カメラとターゲット(プレイヤー)の間の距離を計算して記録します。
  2. ターゲットを追いかける:
    • 毎フレーム、カメラがターゲットの現在位置に基づいて移動し、最初に記録した距離を保ちながら追従します。

③ スクリプトをメインカメラにアタッチ

  1. ヒエラルキーウィンドウで「Main Camera」を選択します。
  2. プロジェクトウィンドウのScriptsフォルダから CameraMove スクリプトをドラッグ&ドロップして、Main Cameraにアタッチします。

④ ターゲット(Player)の設定

  1. Main Cameraを選択した状態で、インスペクターを確認します。
  2. CameraMoveスクリプトの「Target」フィールドが表示されているはずです。
  3. ヒエラルキーから Playerオブジェクト をドラッグ&ドロップして、この「Target」フィールドに設定します。



実行してみよう

これで設定は完了です! プレイボタンを押して、カメラがプレイヤーを追いかけるか確認してみましょう。

カメラがうまくプレイヤーを追いかけるようになったでしょうか?この方法を使えば、簡単にカメラがプレイヤーを追いかける仕組みを作ることができます。もっと高度なカメラ操作をしたい場合は、Unityの公式ドキュメントやチュートリアルを参考にするといいですよ。



まとめ

今回は、Unityでメインカメラをプレイヤーに追従させる方法を解説しました!プレイヤーの動きを制御するスクリプト「CubeMove」と、カメラを追従させるスクリプト「CameraMove」を使うことで、簡単にカメラ追従の仕組みを実現できます。

カメラ追従は、多くのゲームで使われる重要なテクニックです。この仕組みを理解すると、次はプレイヤーの動きに応じてカメラのズームを変えたり、障害物を避けたりするような応用も作れるようになります。

この記事を参考に、ぜひ自分だけのゲームを作る第一歩を踏み出してくださいね!ゲーム開発は、失敗しながら学ぶのも楽しみの一つです。それでは、楽しいUnityライフを!


おすすめのアセット

ゲームを開発していると、キャラクターの動きをスムーズに制御するのが難しいと感じたことはありませんか?特に、三人称視点のアクションゲームやシューティングゲームでは、プレイヤーが自然に操作できるキャラクターコントローラーが必須です。

そこでおすすめなのが、Unity Asset Storeで大人気の Invector – Third Person Controller – Shooter Template です。このアセットを使えば、手間のかかるキャラクターコントローラーの開発がぐっと簡単になります!気になったらチェックしてみてくださいね!