< Summary

Class:DCL.Helpers.Utils
Assembly:Utils
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/Utils/Utils.cs
Covered lines:123
Uncovered lines:87
Coverable lines:210
Total lines:566
Line coverage:58.5% (123 of 210)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
EnsureResourcesMaterial(...)0%440100%
CleanMaterials(...)0%440100%
FloatArrayToV2List(...)0%220100%
ResetLocalTRS(...)0%110100%
SetToMaxStretch(...)0%110100%
SetToCentered(...)0%2100%
SetToBottomLeft(...)0%2100%
ForceUpdateLayout(...)0%440100%
ForceRebuildLayoutImmediate(...)0%660100%
ForceUpdateLayoutRoutine()0%440100%
InverseTransformChildTraversal[TComponent](...)0%550100%
ForwardTransformChildTraversal[TComponent](...)0%30500%
GetOrCreateComponent[T](...)0%220100%
FetchTexture(...)0%2100%
SafeFromJsonOverwrite(...)0%2100%
FromJsonWithNulls[T](...)0%110100%
SafeFromJson[T](...)0%4.434070%
AttachPlaceholderRendererGameObject(...)0%110100%
SafeDestroy(...)0%4.123050%
GridToWorldPosition(...)0%110100%
WorldToGridPosition(...)0%110100%
WorldToGridPositionUnclamped(...)0%2100%
AproxComparison(...)0%440100%
ParseJsonArray[T](...)0%110100%
Utils()0%110100%
LockedThisFrame()0%2100%
LockCursor()0%220100%
UnlockCursor()0%220100%
BrowserSetCursorState(...)0%12300%
DestroyAllChild(...)0%330100%
GetBottomLeftZoneArray(...)0%12300%
GetCenteredZoneArray(...)0%12300%
DrawRectGizmo(...)0%2100%
ToUpperFirst(...)0%6200%
Sanitize(...)0%770100%
CompareFloats(...)0%2100%
Deconstruct[T1, T2](...)0%110100%
SetLayerRecursively(...)0%330100%
ToVolumeCurve(...)0%2100%
ToAudioMixerGroupVolume(...)0%2100%
Wait()0%5.673033.33%
GetHierarchyPath(...)0%6200%
TryFindChildRecursively(...)0%30500%
IsPointerOverUIElement(...)0%2100%
IsPointerOverUIElement()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Helpers/Utils/Utils.cs

#LineLine coverage
 1#if UNITY_WEBGL && !UNITY_EDITOR
 2#define WEB_PLATFORM
 3#endif
 4
 5using System;
 6using System.Collections;
 7using System.Collections.Generic;
 8using System.Linq;
 9using DCL.Configuration;
 10using Newtonsoft.Json;
 11using TMPro;
 12using UnityEngine;
 13using UnityEngine.Assertions;
 14using UnityEngine.EventSystems;
 15using UnityEngine.Networking;
 16using UnityEngine.UI;
 17using Object = UnityEngine.Object;
 18
 19namespace DCL.Helpers
 20{
 21    public static class Utils
 22    {
 23        public static Dictionary<string, Material> staticMaterials;
 24
 25        public static Material EnsureResourcesMaterial(string path)
 26        {
 64827            if (staticMaterials == null)
 28            {
 129                staticMaterials = new Dictionary<string, Material>();
 30            }
 31
 64832            if (!staticMaterials.ContainsKey(path))
 33            {
 434                Material material = Resources.Load(path) as Material;
 35
 436                if (material != null)
 37                {
 438                    staticMaterials.Add(path, material);
 39                }
 40
 441                return material;
 42            }
 43
 64444            return staticMaterials[path];
 45        }
 46
 47        public static void CleanMaterials(Renderer r)
 48        {
 5249            if (r != null)
 50            {
 20851                foreach (Material m in r.materials)
 52                {
 5253                    if (m != null)
 54                    {
 5255                        Material.Destroy(m);
 56                    }
 57                }
 58            }
 5259        }
 60
 61        public static Vector2[] FloatArrayToV2List(float[] uvs)
 62        {
 663            Vector2[] uvsResult = new Vector2[uvs.Length / 2];
 664            int uvsResultIndex = 0;
 65
 9266            for (int i = 0; i < uvs.Length;)
 67            {
 8068                Vector2 tmpUv = Vector2.zero;
 8069                tmpUv.x = uvs[i++];
 8070                tmpUv.y = uvs[i++];
 71
 8072                uvsResult[uvsResultIndex++] = tmpUv;
 73            }
 74
 675            return uvsResult;
 76        }
 77
 78        public static void ResetLocalTRS(this Transform t)
 79        {
 169980            t.localPosition = Vector3.zero;
 169981            t.localRotation = Quaternion.identity;
 169982            t.localScale = Vector3.one;
 169983        }
 84
 85        public static void SetToMaxStretch(this RectTransform t)
 86        {
 19887            t.anchorMin = Vector2.zero;
 19888            t.offsetMin = Vector2.zero;
 19889            t.anchorMax = Vector2.one;
 19890            t.offsetMax = Vector2.one;
 19891            t.sizeDelta = Vector2.zero;
 19892            t.anchoredPosition = Vector2.zero;
 19893        }
 94
 95        public static void SetToCentered(this RectTransform t)
 96        {
 097            t.anchorMin = Vector2.one * 0.5f;
 098            t.offsetMin = Vector2.one * 0.5f;
 099            t.anchorMax = Vector2.one * 0.5f;
 0100            t.offsetMax = Vector2.one * 0.5f;
 0101            t.sizeDelta = Vector2.one * 100;
 0102        }
 103
 104        public static void SetToBottomLeft(this RectTransform t)
 105        {
 0106            t.anchorMin = Vector2.zero;
 0107            t.offsetMin = Vector2.zero;
 0108            t.anchorMax = Vector2.zero;
 0109            t.offsetMax = Vector2.zero;
 0110            t.sizeDelta = Vector2.one * 100;
 0111        }
 112
 113        public static void ForceUpdateLayout(this RectTransform rt, bool delayed = true)
 114        {
 252115            if (!rt.gameObject.activeInHierarchy)
 14116                return;
 117
 238118            if (delayed)
 156119                CoroutineStarter.Start(ForceUpdateLayoutRoutine(rt));
 120            else
 121            {
 82122                InverseTransformChildTraversal<RectTransform>(
 1884123                    (x) => { ForceRebuildLayoutImmediate(x); },
 124                    rt);
 125            }
 82126        }
 127
 128        /// <summary>
 129        /// Reimplementation of the LayoutRebuilder.ForceRebuildLayoutImmediate() function (Unity UI API) for make it mo
 130        /// </summary>
 131        /// <param name="rectTransformRoot">Root from which to rebuild.</param>
 132        public static void ForceRebuildLayoutImmediate(RectTransform rectTransformRoot)
 133        {
 5369134            if (rectTransformRoot == null)
 3135                return;
 136
 137            // NOTE(Santi): It seems to be very much cheaper to execute the next instructions manually than execute dire
 138            //              'LayoutRebuilder.ForceRebuildLayoutImmediate()', that theorically already contains these ins
 5366139            var layoutElements = rectTransformRoot.GetComponentsInChildren(typeof(ILayoutElement), true).ToList();
 37438140            layoutElements.RemoveAll(e => (e is Behaviour && !((Behaviour) e).isActiveAndEnabled) || e is TextMeshProUGU
 24238141            foreach (var layoutElem in layoutElements)
 142            {
 6753143                (layoutElem as ILayoutElement).CalculateLayoutInputHorizontal();
 6753144                (layoutElem as ILayoutElement).CalculateLayoutInputVertical();
 145            }
 146
 5366147            var layoutControllers = rectTransformRoot.GetComponentsInChildren(typeof(ILayoutController), true).ToList();
 11802148            layoutControllers.RemoveAll(e => e is Behaviour && !((Behaviour) e).isActiveAndEnabled);
 16504149            foreach (var layoutCtrl in layoutControllers)
 150            {
 2886151                (layoutCtrl as ILayoutController).SetLayoutHorizontal();
 2886152                (layoutCtrl as ILayoutController).SetLayoutVertical();
 153            }
 5366154        }
 155
 156        private static IEnumerator ForceUpdateLayoutRoutine(RectTransform rt)
 157        {
 156158            yield return null;
 159
 156160            InverseTransformChildTraversal<RectTransform>(
 7148161                (x) => { ForceRebuildLayoutImmediate(x); },
 162                rt);
 156163        }
 164
 165        public static void InverseTransformChildTraversal<TComponent>(Action<TComponent> action, Transform startTransfor
 166            where TComponent : Component
 167        {
 8883168            if (startTransform == null)
 97169                return;
 170
 34230171            foreach (Transform t in startTransform)
 172            {
 8329173                InverseTransformChildTraversal(action, t);
 174            }
 175
 8786176            var component = startTransform.GetComponent<TComponent>();
 177
 8786178            if (component != null)
 179            {
 5441180                action.Invoke(component);
 181            }
 8786182        }
 183
 184        public static void ForwardTransformChildTraversal<TComponent>(Func<TComponent, bool> action, Transform startTran
 185            where TComponent : Component
 186        {
 0187            Assert.IsTrue(startTransform != null, "startTransform must not be null");
 188
 0189            var component = startTransform.GetComponent<TComponent>();
 190
 0191            if (component != null)
 192            {
 0193                if (!action.Invoke(component))
 0194                    return;
 195            }
 196
 0197            foreach (Transform t in startTransform)
 198            {
 0199                ForwardTransformChildTraversal(action, t);
 200            }
 0201        }
 202
 203        public static T GetOrCreateComponent<T>(this GameObject gameObject) where T : Component
 204        {
 88205            T component = gameObject.GetComponent<T>();
 206
 88207            if (!component)
 208            {
 76209                return gameObject.AddComponent<T>();
 210            }
 211
 12212            return component;
 213        }
 214
 215        public static WebRequestAsyncOperation FetchTexture(string textureURL, bool isReadable, Action<Texture2D> OnSucc
 216        {
 217            //NOTE(Brian): This closure is called when the download is a success.
 0218            void SuccessInternal(IWebRequestAsyncOperation request) { OnSuccess?.Invoke(DownloadHandlerTexture.GetConten
 219
 0220            var asyncOp = Environment.i.platform.webRequest.GetTexture(
 221                url: textureURL,
 222                OnSuccess: SuccessInternal,
 223                OnFail: OnFail,
 224                isReadable: isReadable);
 225
 0226            return asyncOp;
 227        }
 228
 229        public static bool SafeFromJsonOverwrite(string json, object objectToOverwrite)
 230        {
 231            try
 232            {
 0233                JsonUtility.FromJsonOverwrite(json, objectToOverwrite);
 0234            }
 0235            catch (ArgumentException e)
 236            {
 0237                Debug.LogError("ArgumentException Fail!... Json = " + json + " " + e.ToString());
 0238                return false;
 239            }
 240
 0241            return true;
 0242        }
 243
 45244        public static T FromJsonWithNulls<T>(string json) { return JsonConvert.DeserializeObject<T>(json); }
 245
 246        public static T SafeFromJson<T>(string json)
 247        {
 840248            ProfilingEvents.OnMessageDecodeStart?.Invoke("Misc");
 249
 840250            T returningValue = default(T);
 251
 840252            if (!string.IsNullOrEmpty(json))
 253            {
 254                try
 255                {
 839256                    returningValue = JsonUtility.FromJson<T>(json);
 839257                }
 0258                catch (ArgumentException e)
 259                {
 0260                    Debug.LogError("ArgumentException Fail!... Json = " + json + " " + e.ToString());
 0261                }
 262            }
 263
 840264            ProfilingEvents.OnMessageDecodeEnds?.Invoke("Misc");
 265
 840266            return returningValue;
 267        }
 268
 269        public static GameObject AttachPlaceholderRendererGameObject(Transform targetTransform)
 270        {
 1271            var placeholderRenderer = GameObject.CreatePrimitive(PrimitiveType.Cube).GetComponent<MeshRenderer>();
 272
 1273            placeholderRenderer.material = Resources.Load<Material>("Materials/AssetLoading");
 1274            placeholderRenderer.transform.SetParent(targetTransform);
 1275            placeholderRenderer.transform.localPosition = Vector3.zero;
 1276            placeholderRenderer.name = "PlaceholderRenderer";
 277
 1278            return placeholderRenderer.gameObject;
 279        }
 280
 281        public static void SafeDestroy(Object obj)
 282        {
 180283            if (obj is Transform)
 0284                return;
 285
 286#if UNITY_EDITOR
 180287            if (Application.isPlaying)
 180288                Object.Destroy(obj);
 289            else
 0290                Object.DestroyImmediate(obj, false);
 291#else
 292                UnityEngine.Object.Destroy(obj);
 293#endif
 0294        }
 295
 296        /**
 297         * Transforms a grid position into a world-relative 3d position
 298         */
 299        public static Vector3 GridToWorldPosition(float xGridPosition, float yGridPosition)
 300        {
 990301            return new Vector3(
 302                x: xGridPosition * ParcelSettings.PARCEL_SIZE,
 303                y: 0f,
 304                z: yGridPosition * ParcelSettings.PARCEL_SIZE
 305            );
 306        }
 307
 308        /**
 309         * Transforms a world position into a grid position
 310         */
 311        public static Vector2Int WorldToGridPosition(Vector3 worldPosition)
 312        {
 5684313            return new Vector2Int(
 314                (int) Mathf.Floor(worldPosition.x / ParcelSettings.PARCEL_SIZE),
 315                (int) Mathf.Floor(worldPosition.z / ParcelSettings.PARCEL_SIZE)
 316            );
 317        }
 318
 319        public static Vector2 WorldToGridPositionUnclamped(Vector3 worldPosition)
 320        {
 0321            return new Vector2(
 322                worldPosition.x / ParcelSettings.PARCEL_SIZE,
 323                worldPosition.z / ParcelSettings.PARCEL_SIZE
 324            );
 325        }
 326
 327        public static bool AproxComparison(this Color color1, Color color2, float tolerance = 0.01f) // tolerance of rou
 328        {
 3517329            if (Mathf.Abs(color1.r - color2.r) < tolerance
 330                && Mathf.Abs(color1.g - color2.g) < tolerance
 331                && Mathf.Abs(color1.b - color2.b) < tolerance)
 332            {
 340333                return true;
 334            }
 335
 3177336            return false;
 337        }
 338
 5339        public static T ParseJsonArray<T>(string jsonArray) where T : IEnumerable => DummyJsonUtilityFromArray<T>.GetFro
 340
 341        [Serializable]
 342        private class DummyJsonUtilityFromArray<T> where T : IEnumerable //UnityEngine.JsonUtility is really fast but ca
 343        {
 344            [SerializeField]
 345            private T value;
 346
 347            public static T GetFromJsonArray(string jsonArray)
 348            {
 349                string newJson = $"{{ \"value\": {jsonArray}}}";
 350                return JsonUtility.FromJson<DummyJsonUtilityFromArray<T>>(newJson).value;
 351            }
 352        }
 353
 1354        private static int lockedInFrame = -1;
 0355        public static bool LockedThisFrame() => lockedInFrame == Time.frameCount;
 356
 357        private static bool isCursorLocked;
 358        //NOTE(Brian): Made as an independent flag because the CI doesn't work well with the Cursor.lockState check.
 359        public static bool IsCursorLocked
 360        {
 2199361            get => isCursorLocked;
 362            private set
 363            {
 314364                if (isCursorLocked == value) return;
 88365                isCursorLocked = value;
 88366                OnCursorLockChanged?.Invoke(isCursorLocked);
 81367            }
 368        }
 369
 370        public static event Action<bool> OnCursorLockChanged;
 371
 372        public static void LockCursor()
 373        {
 374#if WEB_PLATFORM
 375            //TODO(Brian): Encapsulate all this mechanism to a new MouseLockController and branch
 376            //             behaviour using strategy pattern instead of this.
 377            if (IsCursorLocked)
 378            {
 379                return;
 380            }
 381#endif
 44382            Cursor.visible = false;
 44383            IsCursorLocked = true;
 44384            Cursor.lockState = CursorLockMode.Locked;
 44385            lockedInFrame = Time.frameCount;
 386
 44387            EventSystem.current?.SetSelectedGameObject(null);
 34388        }
 389
 390        public static void UnlockCursor()
 391        {
 392#if WEB_PLATFORM
 393            //TODO(Brian): Encapsulate all this mechanism to a new MouseLockController and branch
 394            //             behaviour using strategy pattern instead of this.
 395            if (!IsCursorLocked)
 396            {
 397                return;
 398            }
 399#endif
 157400            Cursor.visible = true;
 157401            IsCursorLocked = false;
 157402            Cursor.lockState = CursorLockMode.None;
 403
 157404            EventSystem.current?.SetSelectedGameObject(null);
 71405        }
 406
 407        #region BROWSER_ONLY
 408
 409        //TODO(Brian): Encapsulate all this mechanism to a new MouseLockController and branch
 410        //             behaviour using strategy pattern instead of this.
 411        // NOTE: This should come from browser's pointerlockchange callback
 412        public static void BrowserSetCursorState(bool locked)
 413        {
 0414            Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None;
 415
 0416            IsCursorLocked = locked;
 0417            Cursor.visible = !locked;
 0418        }
 419
 420        #endregion
 421
 422        public static void DestroyAllChild(this Transform transform)
 423        {
 82424            foreach (Transform child in transform)
 425            {
 3426                Object.Destroy(child.gameObject);
 427            }
 38428        }
 429
 430        public static List<Vector2Int> GetBottomLeftZoneArray(Vector2Int bottomLeftAnchor, Vector2Int size)
 431        {
 0432            List<Vector2Int> coords = new List<Vector2Int>();
 433
 0434            for (int x = bottomLeftAnchor.x; x < bottomLeftAnchor.x + size.x; x++)
 435            {
 0436                for (int y = bottomLeftAnchor.y; y < bottomLeftAnchor.y + size.y; y++)
 437                {
 0438                    coords.Add(new Vector2Int(x, y));
 439                }
 440            }
 441
 0442            return coords;
 443        }
 444
 445        public static List<Vector2Int> GetCenteredZoneArray(Vector2Int center, Vector2Int size)
 446        {
 0447            List<Vector2Int> coords = new List<Vector2Int>();
 448
 0449            for (int x = center.x - size.x; x < center.x + size.x; x++)
 450            {
 0451                for (int y = center.y - size.y; y < center.y + size.y; y++)
 452                {
 0453                    coords.Add(new Vector2Int(x, y));
 454                }
 455            }
 456
 0457            return coords;
 458        }
 459
 460        public static void DrawRectGizmo(Rect rect, Color color, float duration)
 461        {
 0462            Vector3 tl2 = new Vector3(rect.xMin, rect.yMax, 0);
 0463            Vector3 bl2 = new Vector3(rect.xMin, rect.yMin, 0);
 0464            Vector3 tr2 = new Vector3(rect.xMax, rect.yMax, 0);
 0465            Vector3 br2 = new Vector3(rect.xMax, rect.yMin, 0);
 466
 0467            Debug.DrawLine(tl2, bl2, color, duration);
 0468            Debug.DrawLine(tl2, tr2, color, duration);
 0469            Debug.DrawLine(bl2, br2, color, duration);
 0470            Debug.DrawLine(tr2, br2, color, duration);
 0471        }
 472
 473        public static string ToUpperFirst(this string value)
 474        {
 0475            if (!string.IsNullOrEmpty(value))
 476            {
 0477                var capital = char.ToUpper(value[0]);
 0478                value = capital + value.Substring(1);
 479            }
 480
 0481            return value;
 482        }
 483
 484        public static Vector3 Sanitize(Vector3 value)
 485        {
 266486            float x = float.IsInfinity(value.x) ? 0 : value.x;
 266487            float y = float.IsInfinity(value.y) ? 0 : value.y;
 266488            float z = float.IsInfinity(value.z) ? 0 : value.z;
 489
 266490            return new Vector3(x, y, z);
 491        }
 492
 0493        public static bool CompareFloats( float a, float b, float precision = 0.1f ) { return Mathf.Abs(a - b) < precisi
 494
 495        public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value)
 496        {
 93497            key = tuple.Key;
 93498            value = tuple.Value;
 93499        }
 500
 501        /// <summary>
 502        /// Set a layer to the given transform and its child
 503        /// </summary>
 504        /// <param name="transform"></param>
 505        public static void SetLayerRecursively(Transform transform, int layer)
 506        {
 621507            transform.gameObject.layer = layer;
 2302508            foreach (Transform child in transform)
 509            {
 530510                SetLayerRecursively(child, layer);
 511            }
 621512        }
 513
 514        /// <summary>
 515        /// Converts a linear float (between 0 and 1) into an exponential curve fitting for audio volume.
 516        /// </summary>
 517        /// <param name="volume">Linear volume float</param>
 518        /// <returns>Exponential volume curve float</returns>
 0519        public static float ToVolumeCurve(float volume) { return volume * (2f - volume); }
 520
 521        /// <summary>
 522        /// Takes a linear volume value between 0 and 1, converts to exponential curve and maps to a value fitting for a
 523        /// </summary>
 524        /// <param name="volume">Linear volume (0 to 1)</param>
 525        /// <returns>Value for audio mixer group volume</returns>
 0526        public static float ToAudioMixerGroupVolume(float volume) { return (ToVolumeCurve(volume) * 80f) - 80f; }
 527
 528        public static IEnumerator Wait(float delay, Action onFinishCallback)
 529        {
 4530            yield return new WaitForSeconds(delay);
 0531            onFinishCallback.Invoke();
 0532        }
 533
 534        public static string GetHierarchyPath(this Transform transform)
 535        {
 0536            if (transform.parent == null)
 0537                return transform.name;
 0538            return $"{transform.parent.GetHierarchyPath()}/{transform.name}";
 539        }
 540
 541        public static bool TryFindChildRecursively(this Transform transform, string name, out Transform foundChild)
 542        {
 0543            foundChild = transform.Find(name);
 0544            if (foundChild != null)
 0545                return true;
 546
 0547            foreach (Transform child in transform)
 548            {
 0549                if (TryFindChildRecursively(child, name, out foundChild))
 0550                    return true;
 551            }
 0552            return false;
 0553        }
 554
 555        public static bool IsPointerOverUIElement(Vector3 mousePosition)
 556        {
 0557            var eventData = new PointerEventData(EventSystem.current);
 0558            eventData.position = mousePosition;
 0559            var results = new List<RaycastResult>();
 0560            EventSystem.current.RaycastAll(eventData, results);
 0561            return results.Count > 1;
 562        }
 563
 0564        public static bool IsPointerOverUIElement() { return IsPointerOverUIElement(Input.mousePosition); }
 565    }
 566}

Methods/Properties

EnsureResourcesMaterial(System.String)
CleanMaterials(UnityEngine.Renderer)
FloatArrayToV2List(System.Single[])
ResetLocalTRS(UnityEngine.Transform)
SetToMaxStretch(UnityEngine.RectTransform)
SetToCentered(UnityEngine.RectTransform)
SetToBottomLeft(UnityEngine.RectTransform)
ForceUpdateLayout(UnityEngine.RectTransform, System.Boolean)
ForceRebuildLayoutImmediate(UnityEngine.RectTransform)
ForceUpdateLayoutRoutine()
InverseTransformChildTraversal[TComponent](System.Action[TComponent], UnityEngine.Transform)
ForwardTransformChildTraversal[TComponent](System.Func[TComponent,Boolean], UnityEngine.Transform)
GetOrCreateComponent[T](UnityEngine.GameObject)
FetchTexture(System.String, System.Boolean, System.Action[Texture2D], System.Action[IWebRequestAsyncOperation])
SafeFromJsonOverwrite(System.String, System.Object)
FromJsonWithNulls[T](System.String)
SafeFromJson[T](System.String)
AttachPlaceholderRendererGameObject(UnityEngine.Transform)
SafeDestroy(UnityEngine.Object)
GridToWorldPosition(System.Single, System.Single)
WorldToGridPosition(UnityEngine.Vector3)
WorldToGridPositionUnclamped(UnityEngine.Vector3)
AproxComparison(UnityEngine.Color, UnityEngine.Color, System.Single)
ParseJsonArray[T](System.String)
Utils()
LockedThisFrame()
IsCursorLocked()
IsCursorLocked(System.Boolean)
LockCursor()
UnlockCursor()
BrowserSetCursorState(System.Boolean)
DestroyAllChild(UnityEngine.Transform)
GetBottomLeftZoneArray(UnityEngine.Vector2Int, UnityEngine.Vector2Int)
GetCenteredZoneArray(UnityEngine.Vector2Int, UnityEngine.Vector2Int)
DrawRectGizmo(UnityEngine.Rect, UnityEngine.Color, System.Single)
ToUpperFirst(System.String)
Sanitize(UnityEngine.Vector3)
CompareFloats(System.Single, System.Single, System.Single)
Deconstruct[T1, T2](System.Collections.Generic.KeyValuePair[T1,T2], , )
SetLayerRecursively(UnityEngine.Transform, System.Int32)
ToVolumeCurve(System.Single)
ToAudioMixerGroupVolume(System.Single)
Wait()
GetHierarchyPath(UnityEngine.Transform)
TryFindChildRecursively(UnityEngine.Transform, System.String, UnityEngine.Transform&)
IsPointerOverUIElement(UnityEngine.Vector3)
IsPointerOverUIElement()