unity_chan_logo

レイヤー

概要

Unityにはレイヤーと呼ばれるある種のグループ分けの機能が用意されています。
レイヤーは主に描画で使用されており、特定のゲームオブジェクトのみを表示したり、
逆に非表示にしたりできます。
他にもキャラクター、ステージギミックなどのゲームオブジェクトを
グループ単位で分けたい場合などで使用されています。

	unity_0168

表示

Layer情報は以下の方法で表示可能です。
Tags and Layers
Tags and Layersは上段メニューから表示することが可能です。

手順
上段メニュー
Edit
ProjectSettings
Tags and Layers
unity_0169

Edit Layers

UnityEditor右側「Layers」で表示できます。
※Unityのバージョンによって位置が異なる可能性があります。

手順
UnityEditor右側「Layers」
Edit Layers
unity_0170

Add Layers

Inspectorからも表示することができます。

手順
適当なオブジェクトをクリック
Inspector上段
Layerドロップダウン
Add Layers
unity_0171

初期レイヤー

Unityでは最初からいくつかのレイヤーが用意されています。
unity_0178

上の絵の「Builtin Layer 0 ~ 7」まではUnityが用意しているレイヤーです。
空白の部分がありますが、今後設定される可能性があるので、
ここにユーザー用のレイヤーを追加することはできません。

追加

レイヤーを追加するにはUserLayerの8~31のいずれかに
追加するレイヤーの名前を入力するだけで可能です。

unity_0175

上の絵ではUserLayer8に「Characters」というレイヤーを追加しています。

削除

レイヤーの削除は追加済みのレイヤーの入力情報を消すだけです。
	
unity_0176

割り当て

ゲームオブジェクトへのレイヤーの割り当ては
Inspectorの上部にあるLayerのドロップダウンリストから選択します。
※現在割り当て中のレイヤーにはチェックが入っています。
unity_0177

割り当ての注意点

ユーザー登録のレイヤーを割り当てている状態で該当するレイヤーを削除した場合、 割り当てたレイヤーは、割り当てられたままとなります。 unity_0179

スクリプト

ここからはスクリプトでの使用方法を紹介します。

レイヤーの設定

各ゲームオブジェクトのレイヤー情報はgameObjectのlayerが持っています。
layerの値は0~31までの数値が入っており、この値はUnityの「Layer」の
内容とリンクしています。

// レイヤー番号0番を指定
gameObject.layer = 0;

文字列によるレイヤー番号の取得

LayerMaskクラスのNameToLayerメソッドを使用するとレイヤーの番号を
文字列から取得することが可能です。

NameToLayer
内容 引数で指定した文字列と一致する文字列をLayerから探し出し
その結果(成功:0~31、失敗:-1)を返します。
戻り値 成功:0~31
失敗:-1(該当する名前なし)
引数の型 説明
string 取得したい番号の文字列
// Characterをレイヤー番号から探す LayerMask.NameToLayer("Character");

レイヤーを使った描画制限

レイヤーを使用した描画制限はCameraで行います。
CameraにはcullingMaskという変数を持っており、
その値を参照して描画、非描画を決めています。

特性

layerをビット管理しているメンバで、
ビットが立っていれば描画、立っていなければ非描画となります。

if (Input.GetMouseButton(0))
{
	// Characterレイヤーを表示
	GetComponent<Camera>().cullingMask |= 
		1 << LayerMask.NameToLayer("Character");
}
else if (Input.GetMouseButton(1))
{
	// Characterレイヤーを非表示
	GetComponent<Camera>().cullingMask
		&= ~(1 << LayerMask.NameToLayer("Character"));
}

レイヤーのマスク

レイヤーはマスクを作成することができます。
マスクを作成することでRayによる当たり判定の制御などを行うことが可能です。
作成はLayerクラスのGetMaskメソッドで行います。
※RayについてはRay--3D--Ray--2D--にて説明しています。

// Characterのレイヤーのマスクを作る
int layer_mask = LayerMask.GetMask(new string[] { "Character" });

問題

問題をダウンロードして以下の仕様を実装して下さい。

・Zキー
	PlayerLyaerのみ描画

・Xキー
	EnemyLayerのみ描画

・Cキー
	StageLayerのみ描画

※LayerTestはMainCameraに関連付けしています。

解答はここにあります。