U
タブ 04世界とゲームループ7 レッスン — タップで開く
02 / 07 · 10 分
世界とゲームループ

ライティングとスカイボックス

ここまでのプロジェクト

Assets/

Scenes/

Arena.unity

TerrainMixed Directional Light

Scripts/

DayNight.cs

プロジェクトの設定

baked lightmapsskybox + fog

すでにあるものこのレッスンで追加

あなたの地形は、タブ 01 で回転させたあの Directional Light に照らされています。その上に立つ Knight には見栄えのある影が一つもありません。両方ともこのレッスンで直します。

ライティングはモデル以上に、ゲームの手触りを決めます。その大半を一つの Directional Light が担っています。

アニメーション図

太陽を回転させると、雰囲気も影の向きも空の色も一緒に変わります。

これから使う 3 種類のライト

  • Directional——太陽です。位置は無関係で、意味があるのは回転だけ。シーンに 1 つあれば十分。

  • Point——電球のように全方向へ放射します。松明、ランプ、魔法のオーブ。

  • Spot——円錐形です。懐中電灯、街灯、ステージ照明。

まず入れる太陽の設定

  1. 1

    Rotation 50, -30, 0——顔が明るく照らせる十分な高さ、影が読める十分な傾き。

  2. 2

    Intensity は 1.0〜1.3 ほど、色はごくわずかに暖かい白(#FFF4E0)。

  3. 3

    Shadow Type = Soft Shadows、Strength は 0.8 ほど。真っ黒な影はバグに見えます。

リアルタイムとベイク

✖ Realtime

動くものには正解、動かないものには無駄。

✓ Baked lightmaps

エディターで一度だけ計算すれば、実行時はただで済みます。モバイルゲームが見栄えするのはこのおかげです。
  1. 1

    動かないオブジェクトをすべて選び、Inspector の右上で Static にチェックを入れます。Knight は静的オブジェクトではありません——触らないでください。

  2. 2

    Directional Light の Mode は Mixed にします。静的オブジェクトにはベイクされ、動くプレイヤーも引き続き照らします。

  3. 3

    Window▸Rendering▸Lighting を開き、Generate Lighting を押します。

  4. 4

    試行錯誤中は Lightmap Resolution を 10 に。上げるのは最終ベイクのときだけ、30〜40 です。

Skybox、環境光、フォグ

  • Skybox は単なる背景ではありません——あらゆる面に当たる環境光の主光源です。

  • Lighting > Environment で Ambient Source = Skybox、Intensity を 0.8〜1.0 にすると、影に自然な差し光が入ります。

  • フォグは遠方のクリップ面を隠し、カメラの Far distance を縮められます——タダで手に入るパフォーマンスです。

  • フォグの色は Skybox の水平線の色に合わせましょう。ずれると継ぎ目がばれてしまいます。

12 行で昼夜のサイクル

DayNight.cs — attach to the Directional Light
using UnityEngine;

public class DayNight : MonoBehaviour
{
    [SerializeField] private float dayLengthMinutes = 4f;
    [SerializeField] private Gradient sunColor;          // paint dawn → noon → dusk
    [SerializeField] private AnimationCurve intensity;

    private Light sun;
    private float t;                                     // 0 .. 1 across a full day

    void Awake() => sun = GetComponent<Light>();

    void Update()
    {
        t += Time.deltaTime / (dayLengthMinutes * 60f);
        t %= 1f;

        transform.rotation = Quaternion.Euler((t * 360f) - 90f, 30f, 0f);
        sun.color = sunColor.Evaluate(t);
        sun.intensity = intensity.Evaluate(t);

        RenderSettings.ambientIntensity = Mathf.Lerp(0.2f, 1f, sun.intensity);
    }
}