😷 UnityでLayerMaskを操作する方法色々

2021-11-26 (lastmod: 2022-11-13) /Development #Unity 1 user

CullingMaskの操作や衝突の制限なんかに使用する LayerMask の操作はビット演算子や左シフト演算子を使うので難しい…

使う機会もそんなに沢山無くて毎回困るので忘れないようにメモメモ

LayerMaskの情報を取得する

レイヤー名からidを取得

コピーしました
int layerId = LayerMask.NameToLayer(layerName);

idからレイヤー名を取得

コピーしました
string layerName = LayerMask.LayerToName(layerId);

とあるLayerMaskに特定レイヤーがあるかをチェック

コピーしました
bool hasLayer = ((1 << layerId) & targetLayerMask) != 0;

LayerMaskの生成

全て入ったLayerMaskの生成

コピーしました
int layer = -1;

空のLayerMaskの生成

コピーしました
int layer = 1;

特定のレイヤーのみ入ったLayerMask

コピーしました
int layer = 1 << layerId;

特定のレイヤーのみ省いたLayerMask

コピーしました
int layer = ~(1 << layerId);

LayerMaskの操作

すでにあるLayerMaskにレイヤーを追加

コピーしました
int layer = originalLayerMask | (1 << layerId);

すでにあるLayerMaskからレイヤーを削除

コピーしました
int layer = originalLayerMask & ~(1 << layerId);

すでにあるLayerMaskから特定レイヤーをオンオフ切り替え

コピーしました
int layer = originalLayerMask ^ (1 << layerId);

Extensionsに纏めておいた

これで次回は迷わずにササっと実装できるハズ…

コピーしました
public static class LayerMaskExtensions
{
    /// <summary>
    /// LayerMaskに指定したレイヤーが含まれているかどうか
    /// </summary>
    public static bool Contains(this LayerMask self, int layerId)
    {
            return ((1 << layerId) & self) != 0;
    }

    public static bool Contains(this LayerMask self, string layerName)
    {
        return self.Contains(LayerMask.NameToLayer(layerName));
    }

    /// <summary>
    /// LayerMaskに指定したレイヤーを追加
    /// </summary>
    public static LayerMask Add(this LayerMask self, LayerMask layerId)
    {
        return self | (1 << layerId);
    }

    public static LayerMask Add(this LayerMask self, string layerName)
    {
        return self.Add(LayerMask.NameToLayer(layerName));
    }

    /// <summary>
    /// LayerMaskに指定したレイヤーを追加/削除の切り替え
    /// </summary>
    public static LayerMask Toggle(this LayerMask self, LayerMask layerId)
    {
        return self ^ (1 << layerId);
    }

    public static LayerMask Toggle(this LayerMask self, string layerName)
    {
        return self.Toggle(LayerMask.NameToLayer(layerName));
    }

    /// <summary>
    /// LayerMaskに指定したレイヤーを削除
    /// </summary>
    public static LayerMask Remove(this LayerMask self, LayerMask layerId)
    {
        return self & ~(1 << layerId);
    }

    public static LayerMask Remove(this LayerMask self, string layerName)
    {
        return self.Remove(LayerMask.NameToLayer(layerName));
    }
}

参考にさせていただいた記事

追記

  • 22-11-13 追記: エクステンションのコードを修正。layerIdだけではなくlayerNameからも操作できるようにした
Comment
comments powered by Disqus
Profile

石原 悠 / Yu Ishihara

デザインとプログラミングと編み物とヨーグルトが好きです。