😷 UnityでLayerMaskを操作する方法色々
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);
}
}
参考にさせていただいた記事: