MRが楽しい

MRやVRについて学習したことを書き残す

Unityでレイヤー名とレイヤー番号の関連をスクリプトから取得する

本日はUnityの小ネタ枠です。
Unityでレイヤー名とレイヤー番号の関連をスクリプトから取得する方法です。

LayerMask

レイヤー名とレイヤー番号の関連はLayerMaskクラスのLayerToName関数またはNameToLayer関数を使って参照できます。
docs.unity3d.com

[Layers]プルダウンの[Edit Layers]から現在のレイヤー名とレイヤー番号の設定を確認できます。


LayerMask.LayerToName

レイヤー番号からレイヤー名を取得します。
レイヤー名の設定がないレイヤー番号を指定すると空文字が返ります。
docs.unity3d.com

LayerMask.NameToLayer

レイヤー名からレイヤー番号を取得します。
存在しないレイヤー名を指定すると-1が返ります。
docs.unity3d.com

サンプルスクリプト

それぞれの関数を実際に実行する以下のサンプルスクリプトを作成しました。
・LayerTest.cs

using UnityEngine;

public class LayerTest : MonoBehaviour
{
    [ContextMenu("NameToLayerTest")]
    public void NameToLayerTest()
    {
        // レイヤー名からレイヤー番号を取得する
        var layerName = "Ignore Raycast";
        var layerMask = LayerMask.NameToLayer(layerName);
        Debug.Log($"{layerName} is {layerMask}");
        
        // 存在しないレイヤー名の場合は-1が返る
        var invalidLayerName = "Invalid Layer";
        var invalidLayerMask = LayerMask.NameToLayer(invalidLayerName);
        Debug.Log($"{invalidLayerName} is {invalidLayerMask}");
    }
    
    [ContextMenu("LayerToNameTest")]
    public void LayerToNameTest()
    {
        // レイヤー番号からレイヤー名を取得する
        var layerMask = 2;
        var layerName = LayerMask.LayerToName(layerMask);
        Debug.Log($"{layerMask} is {layerName}");
        
        // 存在しないレイヤー番号の場合はエラーログが出力されて空文字が返る
        var invalidLayerMask = -1;
        var invalidLayerName = LayerMask.LayerToName(invalidLayerMask);
        Debug.Log($"{invalidLayerMask} is {invalidLayerName}");
        
        // 名称が設定されていないレイヤー番号の場合は空文字が返るのみ
        var emptyLayerMask = 31;
        var emptyLayerName = LayerMask.LayerToName(emptyLayerMask);
        Debug.Log($"{emptyLayerMask} is {emptyLayerName}");
    }
}