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

2021-11-26 /Development #Unity

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
{
    public static bool Contains(this LayerMask self, int layerId)
    {
        return ((1 << layerId) & self) != 0;
    }

    public static bool Contains(this LayerMask self, string layerName)
    {
        int layerId = LayerMask.NameToLayer(layerName);
        return ((1 << layerId) & self) != 0;
    }

    public static LayerMask Add(this LayerMask self, LayerMask layerId)
    {
        return self | (1 << layerId);
    }

    public static LayerMask Toggle(this LayerMask self, LayerMask layerId)
    {
        return self ^ (1 << layerId);
    }

    public static LayerMask Remove(this LayerMask self, LayerMask layerId)
    {
        return self & ~(1 << layerId);
    }
}

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

Profile

石原 悠 / Yu Ishihara

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