unity_chan_logo

レイヤー

■概要

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

	unity_0168

■基本

●表示
	Layer情報は以下の方法で表示可能です。

	・上段メニュー => Edit => ProjectSettings => Tags and Layers
		unity_0169
			
	・UnityEditor右側「Layers」=> Edit Layers
	 ※Unityのバージョンによって位置が異なる可能性があります。
		unity_0170

	・適当なゲームオブジェクトクリック => 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

	戻り値:
		成功:0~31
		失敗:-1(該当する名前なし)

	引数:
		string name
			取得したい番号の文字列

	内容:
		引数で指定した文字列と一致する文字列をLayerから探し出し
		その結果(成功:0~31、失敗:-1)を返します。

	例:
		// 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に関連付けしています。

解答はここにあります。