You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			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));
 | 
						|
		}
 | 
						|
	}
 | 
						|
} |