カメラとライトの基本:追いかけるカメラと明るさの調整【Unityスタートガイド12-5】

ゲームの見え方を決めるのが、カメラとライト。キャラクターが画面の外に出ていってしまったり、シーンが暗すぎて何も見えなかったり・・・は、誰でも一度は通る道です。今回はカメラの基本の設定と、プレイヤーを追いかけるカメラの作り方、ライトで明るさや雰囲気を調整する方法をご紹介します!

目次

この記事で学べること

  • カメラの主な設定(Projection、Size、Field of View、Clipping Planes、Background Type)
  • スクリプトでプレイヤーを追いかけるカメラの作り方
  • ライトの種類の使い分けと、明るさ・色・影の調整
  • シーン全体の明るさ(Environment Lighting)の調整
  • 2Dゲームのライト(Light 2D)
  • 画面が暗い・真っ黒のときの確認ポイント

前提知識

カメラの基本の設定

Main Cameraを選択して、InspectorのCameraコンポーネントを見てみましょう。

Projection:遠近感のあり・なし

  • Perspective:遠くのものが小さく見える(3Dゲーム向け)
    • Field of View:視野の広さ。数字を大きくすると広く映る(広角)、小さくすると望遠のようになる
  • Orthographic:遠くても同じ大きさで見える(2Dゲーム向け)
    • Size:画面の縦の半分に、何ユニット分を映すか。Sizeを5にすると、画面の縦に10ユニット分が映ります

Universal 2DのテンプレートではOrthographic、Universal 3DのテンプレートではPerspectiveが最初から設定されています。

Clipping Planes:映す距離の範囲

  • Near:カメラからこれより近いものは映らない
  • Far:カメラからこれより遠いものは映らない

広いステージの奥が途中で消えるときはFarを大きく、カメラに近いものが欠けるときはNearを小さくします。

Background Type:何も映っていない部分の背景

Environment>Background Typeで選びます。

  • Skybox:空の画像(3Dのテンプレートの初期設定)
  • Solid Color:単色。Backgroundで色を選ぶ(2Dゲームでよく使う)

プレイヤーを追いかけるカメラ

スクリプトで作る

「SimpleFollowCamera」という名前でスクリプトを作り、Main Cameraにアタッチします。

using UnityEngine;

public class SimpleFollowCamera : MonoBehaviour
{
    [SerializeField] private Transform target;          // 追いかける相手(Player)
    [SerializeField] private float smoothTime = 0.2f;   // 追いつくまでのおおよその時間(秒)

    private Vector3 offset;
    private Vector3 velocity = Vector3.zero;

    void Start()
    {
        // 最初のカメラとプレイヤーの位置の差を覚えておく
        offset = transform.position - target.position;
    }

    void LateUpdate()
    {
        // プレイヤーの位置 + 最初の差 = カメラが行きたい場所
        Vector3 targetPosition = target.position + offset;

        // なめらかに近づける
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
    }
}

Inspectorで、TargetにPlayerをドラッグ&ドロップして再生します。プレイヤーを動かすと、カメラが少し遅れてついてくれば成功!

スクリプトのポイント

  • LateUpdateで動かす
    • 6-3の記事で説明したとおり、LateUpdateは全てのUpdateが終わった後に呼ばれます
    • プレイヤーがUpdateで動き終わってからカメラを動かすので、カメラがガタガタ揺れにくくなります
  • offset(最初の位置の差)を保つ
    • シーンで置いたカメラとプレイヤーの位置関係を、そのまま保ったまま追いかけます。カメラの角度や距離は、シーンビューで置き直すだけで変えられます
  • Vector3.SmoothDamp
    • 目標の位置に、ばねのようになめらかに近づけます
    • smoothTimeを0にするとピッタリくっつき、大きくするとゆっくり追いかけます
    • ref velocityは、SmoothDampが今の速さを覚えておくための変数です。毎フレーム同じ変数を渡します
  • 2Dゲームで使う場合も同じスクリプトでOKです(offsetにZの差も入るので、カメラのZ座標は-10のまま保たれます)
スライム

プレイヤーをRigidbodyで動かしたら、カメラで追いかけたときにプレイヤーがカクカク震える・・・

フェアリー

RigidbodyのInterpolateをInterpolateにしてみてね!物理の動きとカメラの動きのタイミングがなめらかにつながるよ

本格的に作るならCinemachine

画面の端で止めたい、振り向いたときに回り込みたい、カメラを切り替えたい、といった場合は、Unity公式のCinemachineを使うと、スクリプトなしで作れます。使い方はCinemachine 3入門!プレイヤーを追いかけるカメラを作ろうで紹介しています。

ライトで明るさと雰囲気を調整する(3D)

ライトの種類は3-5の記事で紹介しました。ここでは、実際にシーンの見た目を調整する手順を中心に見ていきます。

ライトの種類の使い分け

ライト使いどころ
Directional Light太陽や月。シーン全体を同じ向きから照らす。まずはこれ1つでOK
Point Light電球やたいまつ。周りを丸く照らす
Spot Light懐中電灯やスポットライト。円すいの形に照らす

新しいライトは、Hierarchyで右クリック>Light>目的のライトで追加します。

Directional Lightで雰囲気を変える

  • Rotation:光の向き。Xを小さく(例:10)すると、夕方のように低い位置から照らして影が長くなる
  • Color:光の色。白は昼、オレンジは夕方、青っぽい色は夜のような雰囲気になる
  • Intensity:光の強さ。明るすぎる・暗すぎるときはここで調整

Point Light・Spot Lightの調整

  • Range:光が届く距離
  • Intensity:光の強さ(Point・Spotは、Directionalより大きめの値にしないと明るく見えないことがあります)
  • Spot Angle:Spot Lightの光の広がり(Spot Lightのみ)

影の設定

  • ライトのShadow Type:No Shadows / Hard Shadows / Soft Shadows
    • Soft Shadowsは影のふちがやわらかくなる分、少し重くなります
  • 影を落としたくないオブジェクトは、Mesh RendererのCast ShadowsをOffにします

シーン全体の明るさ(Environment Lighting)

ライトが当たっていない影の部分がどれぐらい明るいかは、Environment Lightingで決まります。

  • Window>Rendering>Lightingを開く
  • Environmentタブを選択
  • Environment Lighting>Sourceで、空の色から明るさを決めるか(Skybox)、自分で色を決めるか(Color / Gradient)を選ぶ
  • Intensity Multiplierで、全体の明るさを調整する

影の部分が真っ黒すぎるときは、Intensity Multiplierを上げるか、SourceをColorにして明るめの色を選びます。

画面全体の色味をまとめて変える(Global Volume)

Universal 3DのテンプレートにはGlobal Volumeが最初から入っていて、光をにじませるBloomや、画面全体の色味の調整(ポストプロセス)が出来ます。使い方は画面全体に影響が現れるPost Processingの導入についてで紹介しています。

2Dゲームのライト(Light 2D)

Universal 2Dのテンプレートでは、2D用のライトを使います。3D用のDirectional LightなどはSprite(Sprite-Lit-Default)には効かないので注意しましょう。

  • Global Light 2D:シーン全体を同じ明るさで照らす。最初から置いてあるライト
  • Spot Light 2D:一部分を丸く照らす(たいまつや懐中電灯)
  • Hierarchyで右クリック>Light>Spot Light 2Dで追加

夜のステージを作るときは、Global Light 2DのIntensityを下げて全体を暗くし、Spot Light 2Dで明るくしたい場所だけ照らすと雰囲気が出ます。

よくあるエラーと対処法

画面が真っ暗・暗すぎる

  • 原因:Directional Lightが消えている・非表示、Intensityが0に近い、またはEnvironment Lightingが暗い
  • 対処法:HierarchyにDirectional Lightがあるか確認する(ないときは右クリック>Light>Directional Lightで追加)。IntensityとEnvironment LightingのIntensity Multiplierを上げる

2Dのスプライトが真っ黒になった

  • 原因:Universal 2DでGlobal Light 2Dを消してしまった、またはIntensityが0になっている
  • 対処法:Hierarchyで右クリック>Light>Global Light 2Dで追加し直す、Intensityを1に戻す

Game ビューに何も映らない(背景の色だけ)

  • 原因:カメラの向きが違う、映したいものがClipping Planesの範囲外、または2Dでカメラの位置がスプライトより手前にない(Z座標)
  • 対処法:Main Cameraを選んでシーンビューの右下のプレビューで映っている範囲を確認する。2DならカメラのZ座標を-10にする

追いかけるカメラがガタガタ揺れる

  • 原因:カメラをUpdateで動かしている、またはプレイヤーのRigidbodyのInterpolateがNone
  • 対処法:カメラはLateUpdateで動かす。RigidbodyのInterpolateをInterpolateにする

NullReferenceException(SimpleFollowCamera)

  • 原因:Targetを設定していない
  • 対処法:InspectorのTargetにPlayerをドラッグ&ドロップする

まとめ

  • 3DはPerspective(Field of View)、2DはOrthographic(Size)
  • 映らないときはClipping PlanesとカメラのZ座標を確認
  • 追いかけるカメラはLateUpdateとVector3.SmoothDamp。本格的にやるならCinemachine
  • 雰囲気はDirectional Lightの角度・色・強さ、影の部分の明るさはEnvironment Lighting
  • 2DはGlobal Light 2DとSpot Light 2D

次のステップ

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次