Developer

【Unity実践】#11 左右移動に合わせたカメラの移動【ランゲーム】
2021.10.31
Lv2

【Unity実践】#11 左右移動に合わせたカメラの移動【ランゲーム】

今回の内容

前回までの移動関連の処理に関連する内容となります。
プレイヤーの左右移動に合わせて、カメラが移動するように実装していきます。

※初めての方はこちらから
【第1回記事】導入とサンプルの紹介

現状の問題点と実装方針の整理

現状、プレイヤーを道の両端まで移動させると、少し見切れるような形となっています。

解決方法として以下のようなパターンが考えられます。

1.カメラのFOVを広げる or カメラを引く
2.カメラをプレイヤーに追従させる
3.カメラをプレイヤーに少し追従させる(今回はコレ)
4.見切れてるけど仕様にしてしまう

他にも方法はありますが、この辺りが自然な解決法かと思います。

今回はこの中の3つ目の方法を採用します。
楽なのは1の方法ですが、これだとプレイヤーが小さく表示されてしまいます。
2と3の方法については、楽なのは2の方法ですが、画面端まで移動したときに無駄な表示領域が増えてしまいます。

さらに決め手として執筆時点でランキング上位にあるランゲームが3つ目の方法でしたので、
今回は3つ目の方法を採用します。

CameraScriptの作成

新規スクリプトを作成して名前を CameraScript とし、以下を記述します。

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

public class CameraScript : MonoBehaviour
{
    [SerializeField]
    GameObject player;

    float yOffset; // y座標の初期位置を格納
    float zOffset; // z座標の初期位置を格納

    const float X_RATIO = 0.7f; // 道の中心とプレイヤーの間の線分上の何分目に配置するか

    private void Start()
    {
        yOffset = transform.localPosition.y;
        zOffset = transform.localPosition.z;
    }

    void Update()
    {
        // 各座標の計算
        var x = player.transform.localPosition.x * X_RATIO;
        var y = player.transform.localPosition.y + yOffset;
        var z = player.transform.localPosition.z + zOffset;

        // 目標地点の位置ベクトル生成
        Vector3 newLocalPos = new Vector3(x, y, z);

        // 目標地点へゆっくり移動させる
        transform.localPosition = Vector3.Lerp(transform.localPosition, newLocalPos, 0.2f);
    }
}

y, z方向は初期の位置関係から変更しないような実装としています。
x方向のみ、プレイヤーの中心からの座標に倍率をかけて、中間のどこかに位置するような実装としています。
X_RATIO を 0.5 にすると、道とプレイヤーの中央に配置されます。
ここでは 0.7 と設定して、やや中央からプレイヤー寄りに配置しています。

また、移動には Vector3.Lerp を使うことで、ゆっくりと移動する仕組みとしています。
(Lerp自体の仕組みというより、Updateと絡めることで実現しています。)

(公式リファレンス)
Vector3.Lerp

作成ができたらスクリプトを Main Camera にアタッチします。
さらに、インスペクターで、player に Playerオブジェクトを設定しましょう。

シーンを再生して、カメラが7割くらいの位置まで追従していれば成功です。

X_RATIO や Vector3.Lerp の 0.2f の箇所はお好みで調整してみてください。

おわりに

今回までで移動周りの主な実装は完了となります。
次回はゴール時の仕組みを実装していきたいと思います!

 

 
関連リンク ➡ 「初心者のための」Unityゲーム制作 目次

© Unity Technologies Japan/UCL