レイヤー
概要
Unityにはレイヤーと呼ばれるある種のグループ分けの機能が用意されています。 レイヤーは主に描画で使用されており、特定のゲームオブジェクトのみを表示したり、 逆に非表示にしたりできます。 他にもキャラクター、ステージギミックなどのゲームオブジェクトを グループ単位で分けたい場合などで使用されています。
表示
Layer情報は以下の方法で表示可能です。Tags and Layers
Tags and Layersは上段メニューから表示することが可能です。
① | 上段メニュー |
② | Edit |
③ | ProjectSettings |
④ | Tags and Layers |
Edit Layers
UnityEditor右側「Layers」で表示できます。 ※Unityのバージョンによって位置が異なる可能性があります。
① | UnityEditor右側「Layers」 |
② | Edit Layers |
Add Layers
Inspectorからも表示することができます。
① | 適当なオブジェクトをクリック |
② | Inspector上段 |
③ | Layerドロップダウン |
④ | Add Layers |
初期レイヤー
Unityでは最初からいくつかのレイヤーが用意されています。 上の絵の「Builtin Layer 0 ~ 7」まではUnityが用意しているレイヤーです。 空白の部分がありますが、今後設定される可能性があるので、 ここにユーザー用のレイヤーを追加することはできません。
追加
レイヤーを追加するにはUserLayerの8~31のいずれかに 追加するレイヤーの名前を入力するだけで可能です。 上の絵ではUserLayer8に「Characters」というレイヤーを追加しています。
削除
レイヤーの削除は追加済みのレイヤーの入力情報を消すだけです。
割り当て
ゲームオブジェクトへのレイヤーの割り当ては Inspectorの上部にあるLayerのドロップダウンリストから選択します。 ※現在割り当て中のレイヤーにはチェックが入っています。
割り当ての注意点
ユーザー登録のレイヤーを割り当てている状態で該当するレイヤーを削除した場合、 割り当てたレイヤーは、割り当てられたままとなります。スクリプト
ここからはスクリプトでの使用方法を紹介します。
レイヤーの設定
各ゲームオブジェクトのレイヤー情報はgameObjectのlayerが持っています。
layerの値は0~31までの数値が入っており、この値はUnityの「Layer」の
内容とリンクしています。
// レイヤー番号0番を指定
gameObject.layer = 0;
文字列によるレイヤー番号の取得
LayerMaskクラスの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に関連付けしています。 解答はここにあります。