😷 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
{
/// <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));
}
}
参考にさせていただいた記事
- LayerMaskで自身と同じレイヤーを除く - テラシュールブログ
- How to add layer to layer mask? - Unity Answers
- Check if Layer is in Layermask? - Unity Answers
追記
- 22-11-13 追記: エクステンションのコードを修正。layerIdだけではなくlayerNameからも操作できるようにした
Comment
comments powered by Disqus