UnityでCanvasの前後関係を制御する方法

Unityで複数のCanvasを使用する際、適切な前後関係を設定することが重要です。本資料では、Screen Space - CameraモードにおけるCanvasの前後関係を制御する方法を詳しく説明します。


ゲームビューでの実行結果

このスクリーンショットには、異なるCanvasに配置されたUI要素の描画順序に関連する情報が示されています。それぞれの要素がどのように描画されているかを解説します。


画像の構造

  1. Image(白い背景)
    • 背景として使用されている矩形(Imageコンポーネント)。
  2. Text (Sample, New Text)
    • Imageの上に配置されたテキスト。
    • 「Imageと同じCanvas」と記載がある部分は、このテキストがImageと同じCanvas内で管理されていることを意味します。
  3. Text (別のCanvasに属する)
    • 「Imageと違うCanvas」に属するテキスト。異なるCanvasに配置されており、Imageと別の描画順序が設定されています。
  4. Cube
    • シーン内にある3Dオブジェクト。これはCanvasではなく、一般的な3Dオブジェクトとして配置されています。

描画順序に関する解説

1. 同じCanvas内での描画順序

  • Imageと「Sample / New Text」が同じCanvasに属しているため、Hierarchy内での順序が描画順序に影響します。
  • Hierarchyで下に配置されたオブジェクトほど手前に描画されるため、Imageの上にテキストが描画されています。

2. 異なるCanvas間での描画順序

  • 「Imageと違うCanvas」に属するテキストは、別のCanvasに配置されています。この場合、描画順序は以下のプロパティによって制御されます:
  • Order in Layer: 同じSorting Layer内での描画順序を指定。
  • Sorting Layer: Canvasごとの描画優先順位を制御。
  • このテキストが、Imageを含むCanvasの描画順序よりも前に設定されているため、手前に表示されています。

3. 3DオブジェクトとUIの描画順序

  • Cubeは3DオブジェクトとしてCanvas外に配置されています。
  • Screen Space - Cameraモードでは、Canvas内のUIは通常の3Dオブジェクトよりも手前に描画されることが一般的です。ただし、以下の要素が影響する場合があります:
  • カメラのクリッピング設定Near/Far Plane)。
  • CanvasのPlane Distance

トラブルシューティングと設定の確認ポイント

  1. 同じCanvas内での順序調整
    • Hierarchyの順序を調整することで、Imageとテキストの表示順を変更できます。
  2. 異なるCanvas間での描画調整
    • Sorting LayerOrder in Layerを確認し、適切に値を設定してください。
    • Imageと違うCanvasOrder in Layerが、背景Canvasの値より大きく設定されている場合、手前に描画されます。
  3. 3DオブジェクトとUIの関係
    • 3DオブジェクトがUIに隠れる場合、CanvasのPlane Distanceを変更することで、UI全体をカメラに近づけたり遠ざけたりできます。

サンプル設定例

Canvas 1(背景Canvas)

  • Sorting Layer: Default
  • Order in Layer: 0
  • Plane Distance: 100

Canvas 2(手前のCanvas)

  • Sorting Layer: Default
  • Order in Layer: 1
  • Plane Distance: 90

カメラ

  • Render Mode: Screen Space – Camera
  • Culling Mask: UIが含まれるレイヤーを設定。

1. 前提知識

CanvasのRender Mode

Canvasには以下の3つのRender Modeがありますが、本資料ではScreen Space - Cameraに焦点を当てます。

  1. Screen Space – Overlay
    • UIがスクリーン全体に描画されます。
    • 描画順序はSorting Orderで制御されます。
  2. Screen Space – Camera(本資料の対象)
    • UIが特定のカメラに関連付けられて描画されます。
    • 描画順序はOrder in LayerSorting Layerで制御されます。
  3. World Space
    • UIが3Dオブジェクトとしてシーン内に配置されます。

2. 前後関係を制御するプロパティ

2.1 Order in Layer

Order in Layerは、同じSorting Layerに属するCanvas間の前後関係を制御します。

  • 値が大きいほど手前に描画されます。
  • 値が同じ場合、描画順序は保証されません。

設定手順

  1. 各Canvasを選択します。
  2. InspectorのCanvasコンポーネントでOrder in Layerを確認。
  3. 必要に応じて値を調整します。

  • 背景Canvas: Order in Layer = 0
  • 前景Canvas: Order in Layer = 1

2.2 Sorting Layer

Sorting Layerは、Canvasをグループ化して描画順序を整理するプロパティです。

  • 異なるSorting Layerに属するCanvas間では、Sorting Layerの優先順位が適用されます
  • Sorting Layerを設定することで、複数のUIグループを管理しやすくなります。

設定手順

  1. Unityメニューで「Edit > Project Settings > Tags and Layers」を開きます。
  2. 必要なSorting Layerを作成(例: Background, Foreground)。
  3. 各CanvasのInspectorでSorting Layerを設定します。

  • 背景Canvas: Sorting Layer = Background
  • 前景Canvas: Sorting Layer = Foreground

2.3 Plane Distance

Plane Distanceは、Canvasが関連付けられたカメラからどれだけ離れて描画されるかを指定します。

  • 通常はOrder in Layerが優先されますが、Plane Distanceを大幅に変更すると描画順序に影響することがあります。

設定手順

  1. CanvasのInspectorでPlane Distanceを確認。
  2. 必要に応じて値を調整します。
  • 手前のCanvas: 小さい値(例: 50)。
  • 背景のCanvas: 大きい値(例: 100)。

3. カメラ設定の影響

3.1 Culling Mask

カメラが描画するオブジェクトを制御するプロパティです。

  • Sorting Layerや特定のオブジェクトをカメラで制御したい場合に使用します。

設定手順

  1. 各カメラのInspectorでCulling Maskを確認。
  2. 対象のCanvasが含まれるレイヤーを有効化します。

4. 設定例

以下は、背景Canvasと前景Canvasを分けて設定する例です。

Canvasの設定

項目背景Canvas前景Canvas
Sorting LayerBackgroundForeground
Order in Layer01
Plane Distance10050

カメラの設定

項目背景用カメラ前景用カメラ
Culling MaskBackgroundForeground

5. チェックリスト

  1. CanvasのOrder in Layerが正しいか?
    • 前後の描画順序を制御する主要なプロパティです。
  2. Sorting Layerを適切に活用しているか?
    • 複数のUIグループが存在する場合は、Sorting Layerを整理して管理します。
  3. カメラのCulling Maskが正しく設定されているか?
    • 不要なCanvasが描画されないようにします。
  4. Plane Distanceが意図通りか?
    • 必要に応じてCanvasの距離を調整します。
  5. Game Viewで結果を確認する
    • すべての設定が正しく反映されているか確認します。

6. 注意点

  1. Canvasの分割は最小限に
  • Canvasを増やすとパフォーマンスに影響する可能性があります。可能な限り1つのCanvasにまとめて管理しましょう。
  1. Order in Layerの重複に注意
    • 複数のCanvasで同じOrder in Layerを設定すると、描画順序が不定になる可能性があります。
  2. カメラのRender Modeを統一
    • Screen Space - Cameraと他のRender Modeが混在している場合、意図しない結果になることがあります。

Emission、Bloomに関係する設定、登録

添付のキャプチャーから合わせてみましょう

using UnityEngine;
using UnityEngine.UI;

public class EmissionExample : MonoBehaviour
{
    public Color glowColor = new Color(1.0f, 1.0f, 0.5f); // 発光色
    public float glowIntensity = 2.0f; // 発光の強度

    void Start()
    {
        // マテリアルの発光色を設定
        GetComponent<Image>().material.SetColor("_EmissionColor", glowColor * glowIntensity);
    }
}
using UnityEngine;

public class EmissionExample3DObject : MonoBehaviour
{
    public Color emissionColor = Color.blue;  // 発光する色
    public float emissionIntensity = 2.0f;    // 発光の強度

    void Start()
    {
        Renderer renderer = GetComponent<Renderer>();
        if (renderer != null)
        {
            Material material = renderer.material;

            // エミッションを有効化
            material.EnableKeyword("_EMISSION");

            // エミッションカラーを設定
            material.SetColor("_EmissionColor", emissionColor * emissionIntensity);
        }
    }
}

Post-Process,UI,Unity

Posted by hidepon