音無サノトの空想録

ゆるく生きている人の漫画

【ゲーム制作】イチから Unity の学びなおし ④玉転がしゲーム その3 カメラの追従

どうも音無サノトです。

Unity でのゲーム制作を学びなおしています。公式HPにある初級チュートリアルの玉転がしゲームを作成中です。

前回は Player の動作処理を作成しました。実際にキーボード入力でボールが動くのをゲームシーンで確認できましたが、このままだとカメラが固定されたまんまなのでゲームらしくないです。

そこで今回は Player に焦点を当てるようにカメラの動作処理を作成します。

 

 

カメラのデフォルト位置を変更

まず、Hierarchy ウィンドウからカメラを選択してください。

現在の位置でカメラが映しているゲームシーンが右下に表示されます。

f:id:otonasisanoto:20190401093327p:plain

真横から見ている状態ですね。このデフォルトの状態を変更します。

 

Inspector ウィンドウの Transform の値を次の様に変更します。

f:id:otonasisanoto:20190401093537p:plain

これで再生すると上から俯瞰した状態に変わります。

f:id:otonasisanoto:20190401093613p:plain

 

オブジェクトの親子関係

オブジェクトの親子関係について説明します。

Hierarchy ウィンドウで Main Camera を Player にドラッグ&ドロップします。

これでカメラオブジェクトは Player オブジェクトの子オブジェクトになります。

f:id:otonasisanoto:20190401093825p:plain

こうすることで、Player の動きにカメラがついてくるようになります。 

Player のX軸、Z軸を変更すると、それに合わせてカメラの座標も変わります。

実際に Player の座標を変更してみると分かります。

Unity ではこのオブジェクトの親子関係はよく使うので、覚えておいた方がいいです。

 

しかし、この方法だとゲーム再生時にボールの転がりに合わせてカメラも動くので、画面がぐるぐると回ってしまいます。

そこでカメラはプログラミングで動作させるようにしなければなりません。

 

Main Camera を元に戻し、スクリプトを作成していきます。

 

カメラの動作処理

「CameraContoller」という名前のスクリプトを作成し、Main Camera にアタッチします。スクリプトは Project ウィンドウの Scripts フォルダに入れることを忘れないようにします。

f:id:otonasisanoto:20190401095125p:plain

 

CameraContoller の処理は以下のようになります。

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

public class CameraContoller : MonoBehaviour
{
    public GameObject player; // Player オブジェクトを格納する変数
    private Vector3 offset;   // Player とカメラの距離を保持する変数

    void Start()
    {
        // Player とカメラのデフォルトの距離を取得
        offset = transform.position - player.transform.position;
    }

    // Updare 関数の後に実行されるのでカメラの追従に適している
    void LateUpdate()
    {
        // Player の動きに合わせて位置を変更
        transform.position = player.transform.position + offset;
    }
}

 

まずは、GameObject を格納できる変数とデフォルトの距離を保持しておく変数を用意します。

f:id:otonasisanoto:20190401100721p:plain

Start 関数でこのこのオブジェクトの距離と player 変数に格納されたオブジェクトの距離の差分を offset に代入します。

f:id:otonasisanoto:20190401100845p:plain

ゲームオブジェクトの位置は transform.position で取得できます。

transform.position と書くと、このスクリプトがアタッチされているゲームオブジェクトの位置を取得します。今回だとカメラの位置です。

player.transform.position は上で宣言した player という変数に格納されているゲームオブジェクトの位置になります。

 

次に、LateUpdate 関数でゲームオブジェクトの位置を変更します。

LateUpade は Update の処理の後に実行されるので、カメラの追従に適しているそうです。まず、Player を操作すると、Player のポジションが変わります。それが描画された後にカメラのポジションを変更するという流れです。

f:id:otonasisanoto:20190401101135p:plain

GameContoller に表示されている Playerのところに、Hierarchy ウィンドウから Player オブジェクトをドラッグ&ドロップします。

f:id:otonasisanoto:20190401100352p:plain

これでスクリプト内での player という変数は、Player オブジェクトを指すことになります。

 

実際にゲームを再生させてみると、Player の動きに合わせてカメラが追いかけてくるようになります。 

 

ただし、このままだと床からはみ出したところで、ボールが永遠に落下し続けることになるので、次回はエリアを作成します。

 

本日は以上となります。最後まで読んでいただきありがとうございました!