using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; namespace GameKit.Dependencies.Utilities { public static class Layers { /* GetInteractableLayer methods is an implementation from this * link: https://forum.unity.com/threads/is-there-a-way-to-get-the-layer-collision-matrix.260744/#post-3483886 */ /// /// Lookup of interactable layers for each layer. /// private static Dictionary _interactablesLayers; /// /// Tries to initializes InteractableLayers. /// private static void TryInitializeInteractableLayers() { if (_interactablesLayers != null) return; _interactablesLayers = new(); for (int i = 0; i < 32; i++) { int mask = 0; for (int j = 0; j < 32; j++) { if (!Physics.GetIgnoreLayerCollision(i, j)) { mask |= 1 << j; } } //Setting without add check is quicker. _interactablesLayers[i] = mask; } } /// /// Returns interactable layers value for layer. /// public static int GetInteractableLayersValue(int layer) { TryInitializeInteractableLayers(); return _interactablesLayers[layer]; } /// /// Returns interactable layers LayerMask for a GameObject. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static LayerMask GetInteractableLayersMask(int layer) => (LayerMask)GetInteractableLayersValue(layer); /// /// Returns interactable layers value for a GameObject. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GetInteractableLayersValue(GameObject go) => GetInteractableLayersValue(go.layer); /// /// Returns interactable layers LayerMask for a GameObject. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static LayerMask GetInteractableLayersMask(GameObject go) => (LayerMask)GetInteractableLayersValue(go.layer); /// /// Converts a layer mask to a layer number. /// /// /// public static int LayerMaskToLayerNumber(LayerMask mask) { return LayerValueToLayerNumber(mask.value); } /// /// Converts a layer value int to a layer int. /// /// /// public static int LayerValueToLayerNumber(int bitmask) { int result = bitmask > 0 ? 0 : 31; while (bitmask > 1) { bitmask = bitmask >> 1; result++; } return result; } /// /// Returns if a LayerMask contains a specified layer. /// /// LayerMask to check for layer in. /// Layer to check within LayerMask. /// public static bool ContainsLayer(LayerMask layerMask, int layer) { return (layerMask == (layerMask | (1 << layer))); } } }