08「玉転がし」Roll a Ball – カメラ操作

カメラ操作

プレイヤーの動きに合わせ一定の距離を保ちカメラを移動させるようにします。

カメラの位置を調整する

  1. HierarchyビューのMain Cameraを選択します。
  2. InspectorビューのTransformのPositonとRotationを以下の値に変更します。
    • Position(x:0, y:10, z:-10)
    • Rotation(x:45, y:0, z:0)

Gameビューで確認してみるとカメラの映す位置、角度が変わっています。

カメラ制御を行うCameraControllerを作成する

  1. HierarchyビューのMain Cameraを選択します。
  2. InspectorビューのAdd Componentボタンをクリックします。
  3. 検索バーに「new script」と入力し、表示されたNew scriptを選択します。
  4. Nameに「CameraController」と入力し、Create and Addボタンをクリックします。
  5. ProjectビューCameraControllerをScriptsフォルダーにドラックアンドドロップします。
  6. ScriptsフォルダーにあるCameraControllerをダブルクリックしてスクリプトエディターを起動させます。

Playerの移動に合わせてカメラを移動させるようにします。

  1. CameraControllerのUpdate関数を削除します。

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
-    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {

    }
-
-    // Update is called once per frame
-    void Update()
-    {
-        
-    }
}
  1. Playerゲームオブジェクトを保存する変数とPlayerゲームオブジェクトとカメラの距離を保存する変数を用意します。

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
+    /// <summary>
+    /// Playerゲームオブジェクトを保存する変数
+    /// </summary>
+    public GameObject player;
+
+    /// <summary>
+    /// Playerゲームオブジェクトとカメラの距離を保存する変数
+    /// </summary>
+    private Vector3 _offset;
+    
    void Start()
    {

    }
}
  1. ゲーム実行時にPlayerとカメラの距離を計算し変数_offsetに保存します。

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    /// <summary>
    /// Playerゲームオブジェクトを保存する変数
    /// </summary>
    public GameObject player;

    /// <summary>
    /// Playerゲームオブジェクトとカメラの距離を保存する変数
    /// </summary>
    private Vector3 _offset;

    void Start()
    {
+        // カメラのPositionからPlayerのPositionを引くことで距離を求めます。
+        _offset = transform.position - player.transform.position;
    }
}
  1. Playerの移動に合わせてカメラを移動させます。

ここではUpdate関数は使わずに、LateUpdate関数を使用します。

LateUpdate関数はUpdate関数が呼び出された後に実行されます。

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    /// <summary>
    /// Playerゲームオブジェクトを保存する変数
    /// </summary>
    public GameObject player;

    /// <summary>
    /// Playerゲームオブジェクトとカメラの距離を保存する変数
    /// </summary>
    private Vector3 _offset;

    void Start()
    {
        // カメラのPositionからPlayerのPositionを引くことで距離を求めます。
        _offset = transform.position - player.transform.position;
    }
+
+    void LateUpdate()
+    {
+        // Playerの移動に合わせてカメラを移動させる。また、Playerとカメラの距離を一定に保つために_offsetを足しています。
+        transform.position = player.transform.position + _offset;
+    }
}

ここまで出来たらファイルを保存します。(Windows:Ctrl + C/Mac:Command + C

Playerゲームオブジェクトを参照できるようにする

UnityEditorに戻ります。

  1. HierarchyビューのMain Cameraを選択します。
  2. InspectorビューのCamera ControllerのPlayerにHierarchyビューのPlayerをドラックアンドドロップします。

ゲームのテスト

実行ボタンを押し、移動速度が変わっているか確認します。

カメラが移動されていることが確認できたら実行を停止します。

CameraControllerの最終スクリプト

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    /// <summary>
    /// Playerゲームオブジェクトを保存する変数
    /// </summary>
    public GameObject player;

    /// <summary>
    /// Playerゲームオブジェクトとカメラの距離を保存する変数
    /// </summary>
    private Vector3 _offset;

    void Start()
    {
        // カメラのPositionからPlayerのPositionを引くことで距離を求めます。
        _offset = transform.position – player.transform.position;
    }

    void LateUpdate()
    {
        // Playerの移動に合わせてカメラを移動させる。また、Playerとカメラの距離を一定に保つために_offsetを足しています。
        transform.position = player.transform.position + _offset;
    }
}