[Unity] LayerとSortingLayerの違い

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

# Layer
## 概要
- http://docs.unity3d.com/ja/current/Manual/Layers.html
- GameObjectのグルーピングの役割を持つ
- 特定のLayerに所属するGameObjectに対してカメラの描画の有無や衝突を行うか否かを設定することが可能

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

![layersetting.png](https://qiita-image-store.s3.amazonaws.com/0/102664/732a3b28-4a62-21d3-043e-1469047d17fd.png)

## LayerをGameObjectに対して設定する
- 任意のGameObjectを選択し、Inspector上部の **Layer** からLayerを割り当てることが可能

![layer.png](https://qiita-image-store.s3.amazonaws.com/0/102664/bfb7b86f-f321-f305-243b-caf3a75a3ce1.png)

- Script上では以下のように変更する

```
this.gameObject.layer = LayerMask.NameToLayer("LayerName");
```

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

![cullingmaskcamera.png](https://qiita-image-store.s3.amazonaws.com/0/102664/3a33372e-8d1a-d84f-28be-df52c44d3d84.png)

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

![cullingmasklight.png](https://qiita-image-store.s3.amazonaws.com/0/102664/f9e3041a-5610-4663-5da4-20204642f9fb.png)

### 特定のLayerに所属するGameObjectを衝突させない
- **[Edit]=>[Project Settings]=>[Physics]** にてPhysicsManagerを開く
- PhysicsManagerでは物理判定の設定を変更できる
- 衝突マトリクスにてLayer同士の衝突の有無を設定できる

![physics.png](https://qiita-image-store.s3.amazonaws.com/0/102664/7bea679d-19ad-9ed3-a8af-2ce63ea13421.png)

# SortingLayer
## 概要
- http://docs.unity3d.com/ja/current/ScriptReference/SortingLayer.html
- 特定のCameraにおける複数のRendererのレンダリングの順序を設定できる

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

![sortinglayer.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/2c00bf29-ee14-966e-8564-7ed09f52fe84.gif)

## SortingLayerをGameObjectに設定する
### Sprite
- SpriteRendererコンポーネント上のSortingLayerの項目より設定する

![Sprite.png](https://qiita-image-store.s3.amazonaws.com/0/102664/b036c6cb-6513-b759-178e-ece631dcce45.png)

- Script上からは以下のように変更する

```csharp
SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
spriteRenderer.sortingLayerName = "Sprite";
```

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

![canvas.png](https://qiita-image-store.s3.amazonaws.com/0/102664/ada07e24-a2ac-37d4-3b26-aca3bc0a8fb4.png)

- Script上からは以下のように変更する

```csharp
Canvas canvas = GetComponent<Canvas>();
canvas.sortingLayerName = "UI";
```

### Particle
- ParticleSystem上のRenderのSortingLayerの項目より設定する

![particle.png](https://qiita-image-store.s3.amazonaws.com/0/102664/5d571bae-97aa-a780-6fee-a418a07298f2.png)

- Script上からは以下のように変更する

```csharp
ParticleSystem particleSystem = GetComponent<ParticleSystem>();
particleSystem.renderer.sortingLayerName = "Particle";
```

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

## 参考
- [UnityのSpriteとパーティクルとかモデルの描画順番について - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2015/01/05/233000)