142 lines
3.4 KiB
C#
142 lines
3.4 KiB
C#
|
using UnityEngine;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
namespace RootMotion {
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// This class contains tools for working with LayerMasks.
|
|||
|
/// Most of this was copied from Unity Wiki: http://wiki.unity3d.com/index.php?title=LayerMaskExtensions.
|
|||
|
/// </summary>
|
|||
|
public static class LayerMaskExtensions
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Does the LayerMask contain a specific layer index?
|
|||
|
/// </summary>
|
|||
|
public static bool Contains(LayerMask mask, int layer) {
|
|||
|
return mask == (mask | (1 << layer));
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a LayerMask from an array of layer names.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask Create(params string[] layerNames)
|
|||
|
{
|
|||
|
return NamesToMask(layerNames);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a LayerMask from an array of layer indexes.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask Create(params int[] layerNumbers)
|
|||
|
{
|
|||
|
return LayerNumbersToMask(layerNumbers);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a LayerMask from a number of layer names.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask NamesToMask(params string[] layerNames)
|
|||
|
{
|
|||
|
LayerMask ret = (LayerMask)0;
|
|||
|
foreach(var name in layerNames)
|
|||
|
{
|
|||
|
ret |= (1 << LayerMask.NameToLayer(name));
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Creates a LayerMask from a number of layer indexes.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask LayerNumbersToMask(params int[] layerNumbers)
|
|||
|
{
|
|||
|
LayerMask ret = (LayerMask)0;
|
|||
|
foreach(var layer in layerNumbers)
|
|||
|
{
|
|||
|
ret |= (1 << layer);
|
|||
|
}
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Inverts a LayerMask.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask Inverse(this LayerMask original)
|
|||
|
{
|
|||
|
return ~original;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Adds a number of layer names to an existing LayerMask.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask AddToMask(this LayerMask original, params string[] layerNames)
|
|||
|
{
|
|||
|
return original | NamesToMask(layerNames);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Removes a number of layer names from an existing LayerMask.
|
|||
|
/// </summary>
|
|||
|
public static LayerMask RemoveFromMask(this LayerMask original, params string[] layerNames)
|
|||
|
{
|
|||
|
LayerMask invertedOriginal = ~original;
|
|||
|
return ~(invertedOriginal | NamesToMask(layerNames));
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns a string array of layer names from a LayerMask.
|
|||
|
/// </summary>
|
|||
|
public static string[] MaskToNames(this LayerMask original)
|
|||
|
{
|
|||
|
var output = new List<string>();
|
|||
|
|
|||
|
for (int i = 0; i < 32; ++i)
|
|||
|
{
|
|||
|
int shifted = 1 << i;
|
|||
|
if ((original & shifted) == shifted)
|
|||
|
{
|
|||
|
string layerName = LayerMask.LayerToName(i);
|
|||
|
if (!string.IsNullOrEmpty(layerName))
|
|||
|
{
|
|||
|
output.Add(layerName);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return output.ToArray();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns an array of layer indexes from a LayerMask.
|
|||
|
/// </summary>
|
|||
|
public static int[] MaskToNumbers(this LayerMask original)
|
|||
|
{
|
|||
|
var output = new List<int>();
|
|||
|
|
|||
|
for (int i = 0; i < 32; ++i)
|
|||
|
{
|
|||
|
int shifted = 1 << i;
|
|||
|
if ((original & shifted) == shifted)
|
|||
|
{
|
|||
|
output.Add(i);
|
|||
|
}
|
|||
|
}
|
|||
|
return output.ToArray();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Parses a LayerMask to a string.
|
|||
|
/// </summary>
|
|||
|
public static string MaskToString(this LayerMask original)
|
|||
|
{
|
|||
|
return MaskToString(original, ", ");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Parses a LayerMask to a string using the specified delimiter.
|
|||
|
/// </summary>
|
|||
|
public static string MaskToString(this LayerMask original, string delimiter)
|
|||
|
{
|
|||
|
return string.Join(delimiter, MaskToNames(original));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|