UnityでCanvasの前後関係を制御する方法
Unityで複数のCanvasを使用する際、適切な前後関係を設定することが重要です。本資料では、Screen Space - Camera
モードにおけるCanvasの前後関係を制御する方法を詳しく説明します。
目次
ゲームビューでの実行結果
このスクリーンショットには、異なるCanvasに配置されたUI要素の描画順序に関連する情報が示されています。それぞれの要素がどのように描画されているかを解説します。
画像の構造
- Image(白い背景)
- 背景として使用されている矩形(Imageコンポーネント)。
- Text (Sample, New Text)
Image
の上に配置されたテキスト。- 「Imageと同じCanvas」と記載がある部分は、このテキストが
Image
と同じCanvas内で管理されていることを意味します。
- Text (別のCanvasに属する)
- 「Imageと違うCanvas」に属するテキスト。異なるCanvasに配置されており、
Image
と別の描画順序が設定されています。
- 「Imageと違うCanvas」に属するテキスト。異なるCanvasに配置されており、
- 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
。
トラブルシューティングと設定の確認ポイント
- 同じCanvas内での順序調整
- Hierarchyの順序を調整することで、
Image
とテキストの表示順を変更できます。
- Hierarchyの順序を調整することで、
- 異なるCanvas間での描画調整
Sorting Layer
とOrder in Layer
を確認し、適切に値を設定してください。Imageと違うCanvas
のOrder in Layer
が、背景Canvasの値より大きく設定されている場合、手前に描画されます。
- 3DオブジェクトとUIの関係
- 3DオブジェクトがUIに隠れる場合、Canvasの
Plane Distance
を変更することで、UI全体をカメラに近づけたり遠ざけたりできます。
- 3DオブジェクトがUIに隠れる場合、Canvasの
サンプル設定例
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
に焦点を当てます。
- Screen Space – Overlay
- UIがスクリーン全体に描画されます。
- 描画順序は
Sorting Order
で制御されます。
- Screen Space – Camera(本資料の対象)
- UIが特定のカメラに関連付けられて描画されます。
- 描画順序は
Order in Layer
とSorting Layer
で制御されます。
- World Space
- UIが3Dオブジェクトとしてシーン内に配置されます。
2. 前後関係を制御するプロパティ
2.1 Order in Layer
Order in Layer
は、同じSorting Layer
に属するCanvas間の前後関係を制御します。
- 値が大きいほど手前に描画されます。
- 値が同じ場合、描画順序は保証されません。
設定手順
- 各Canvasを選択します。
- InspectorのCanvasコンポーネントで
Order in Layer
を確認。 - 必要に応じて値を調整します。
例
- 背景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グループを管理しやすくなります。
設定手順
- Unityメニューで「
Edit > Project Settings > Tags and Layers
」を開きます。 - 必要な
Sorting Layer
を作成(例:Background
,Foreground
)。 - 各CanvasのInspectorで
Sorting Layer
を設定します。
例
- 背景Canvas:
Sorting Layer = Background
- 前景Canvas:
Sorting Layer = Foreground
2.3 Plane Distance
Plane Distance
は、Canvasが関連付けられたカメラからどれだけ離れて描画されるかを指定します。
- 通常は
Order in Layer
が優先されますが、Plane Distance
を大幅に変更すると描画順序に影響することがあります。
設定手順
- CanvasのInspectorで
Plane Distance
を確認。 - 必要に応じて値を調整します。
- 手前のCanvas: 小さい値(例:
50
)。 - 背景のCanvas: 大きい値(例:
100
)。
3. カメラ設定の影響
3.1 Culling Mask
カメラが描画するオブジェクトを制御するプロパティです。
Sorting Layer
や特定のオブジェクトをカメラで制御したい場合に使用します。
設定手順
- 各カメラのInspectorで
Culling Mask
を確認。 - 対象のCanvasが含まれるレイヤーを有効化します。
4. 設定例
以下は、背景Canvasと前景Canvasを分けて設定する例です。
Canvasの設定
項目 | 背景Canvas | 前景Canvas |
---|---|---|
Sorting Layer | Background | Foreground |
Order in Layer | 0 | 1 |
Plane Distance | 100 | 50 |
カメラの設定
項目 | 背景用カメラ | 前景用カメラ |
---|---|---|
Culling Mask | Background | Foreground |
5. チェックリスト
- Canvasの
Order in Layer
が正しいか?- 前後の描画順序を制御する主要なプロパティです。
Sorting Layer
を適切に活用しているか?- 複数のUIグループが存在する場合は、
Sorting Layer
を整理して管理します。
- 複数のUIグループが存在する場合は、
- カメラの
Culling Mask
が正しく設定されているか?- 不要なCanvasが描画されないようにします。
Plane Distance
が意図通りか?- 必要に応じてCanvasの距離を調整します。
- Game Viewで結果を確認する
- すべての設定が正しく反映されているか確認します。
6. 注意点
- Canvasの分割は最小限に
- Canvasを増やすとパフォーマンスに影響する可能性があります。可能な限り1つのCanvasにまとめて管理しましょう。
Order in Layer
の重複に注意- 複数のCanvasで同じ
Order in Layer
を設定すると、描画順序が不定になる可能性があります。
- 複数のCanvasで同じ
- カメラの
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);
}
}
}
ディスカッション
コメント一覧
まだ、コメントがありません