[Unity] LayerとSortingLayerの違い


LayerとSortingLayerの役割は全く別物です。
ややこしいので備忘録としてメモ。

Layer

概要

Layerの更新

  • Layerの設定は以下の方法で開くことが出来ます
    • 上部メニュー [Edit] => [ProjectSettings] => [Tags and Layers]
    • UnityEditor右上 [Layers] => [Edit Layers...]
    • Insperctor上部 [Layer] => [Add Layer ...]
  • LayerのSettingより、任意の名称のLayerを更新/追加/削除することができる

LayerをGameObjectに対して設定する

  • 任意のGameObjectを選択し、Inspector上部の Layer からLayerを割り当てることが可能

  • Script上では以下のように変更する
this.gameObject.layer = LayerMask.NameToLayer("LayerName");

Layerで出来ること

Cameraにて特定のLayerのGameObjectを描画させない

  • CameraコンポーネントがアタッチされているGameObjectを選択
  • CameraコンポーネントでCullingMaskが有効なレイヤーのみ、そのCameraで描画される
  • 描画させたくないLayerのチェックを外せばOK

特定のLayerに所属するGameObjectのみライトを当てたい

  • 任意のLightを追加する (e.g: DirectionalLight)
  • LightコンポーネントでCullingMaskが有効なレイヤーのみ、そのライトが有効となる
  • ライトを当てたいLayerのみチェックを残せばOK

特定のLayerに所属するGameObjectを衝突させない

  • [Edit]=>[Project Settings]=>[Physics] にてPhysicsManagerを開く
  • PhysicsManagerでは物理判定の設定を変更できる
  • 衝突マトリクスにてLayer同士の衝突の有無を設定できる

SortingLayer

概要

SortingLayerの更新

  • Layerの設定と同じ方法で Tags & Layers を開く
  • [+] を押して新規のレイヤーを追加する
  • レイヤーをドラッグして並び順を変更することで描画順序を変更することが出来る
    • 下にある要素ほど前面に表示される

SortingLayerをGameObjectに設定する

Sprite

  • SpriteRendererコンポーネント上のSortingLayerの項目より設定する

  • Script上からは以下のように変更する
SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
spriteRenderer.sortingLayerName = "Sprite";

Canvas(UI)

  • Canvasコンポーネント上のSortingLayerの項目より設定する
  • ただしRenderModeが ScreenSpace - Overlay の場合は設定できない
    • 強制的に前面に描画される扱いなため
    • OverlayなCanvas同士の順序比較はSortOrderを利用する

  • Script上からは以下のように変更する
Canvas canvas = GetComponent<Canvas>();
canvas.sortingLayerName = "UI";

Particle

  • ParticleSystem上のRenderのSortingLayerの項目より設定する

  • Script上からは以下のように変更する
ParticleSystem particleSystem = GetComponent<ParticleSystem>();
particleSystem.renderer.sortingLayerName = "Particle";

備考

  • 同一のSortingLayerにおける描画順序はOrder In Layer > Z値の順で判定が掛かる

参考