Browse Source

Gonna move to server authority

warlock 3 years ago
parent
commit
7368968176
100 changed files with 4693 additions and 44 deletions
  1. 0 0
      Assembly-CSharp-Editor.csproj
  2. 0 0
      Assembly-CSharp.csproj
  3. 1 1
      Assets/FirstGearGames.meta
  4. 1 1
      Assets/FirstGearGames/Editor.meta
  5. BIN
      Assets/FirstGearGames/Editor/GearIcon.png
  6. 9 21
      Assets/FirstGearGames/Editor/GearIcon.png.meta
  7. 11 0
      Assets/FirstGearGames/LICENSE.txt
  8. 7 7
      Assets/FirstGearGames/LICENSE.txt.meta
  9. 6 0
      Assets/FirstGearGames/README.txt
  10. 7 0
      Assets/FirstGearGames/README.txt.meta
  11. 1 1
      Assets/FirstGearGames/Scripts.meta
  12. 1 1
      Assets/FirstGearGames/Scripts/Editor.meta
  13. 72 0
      Assets/FirstGearGames/Scripts/Editor/DrawBitMaskField.cs
  14. 1 1
      Assets/FirstGearGames/Scripts/Editor/DrawBitMaskField.cs.meta
  15. 8 0
      Assets/FirstGearGames/Scripts/EditorRuntime.meta
  16. 19 0
      Assets/FirstGearGames/Scripts/EditorRuntime/BitMaskAttribute.cs
  17. 11 0
      Assets/FirstGearGames/Scripts/EditorRuntime/BitMaskAttribute.cs.meta
  18. 8 0
      Assets/FirstGearGames/Scripts/Utilities.meta
  19. 80 0
      Assets/FirstGearGames/Scripts/Utilities/Arrays.cs
  20. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Arrays.cs.meta
  21. 31 0
      Assets/FirstGearGames/Scripts/Utilities/Canvases.cs
  22. 1 1
      Assets/FirstGearGames/Scripts/Utilities/Canvases.cs.meta
  23. 32 0
      Assets/FirstGearGames/Scripts/Utilities/DisplayFPS.cs
  24. 11 0
      Assets/FirstGearGames/Scripts/Utilities/DisplayFPS.cs.meta
  25. 109 0
      Assets/FirstGearGames/Scripts/Utilities/Enums.cs
  26. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Enums.cs.meta
  27. 132 0
      Assets/FirstGearGames/Scripts/Utilities/Floats.cs
  28. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Floats.cs.meta
  29. 69 0
      Assets/FirstGearGames/Scripts/Utilities/FrameRateCalculator.cs
  30. 11 0
      Assets/FirstGearGames/Scripts/Utilities/FrameRateCalculator.cs.meta
  31. 91 0
      Assets/FirstGearGames/Scripts/Utilities/Ints.cs
  32. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Ints.cs.meta
  33. 45 0
      Assets/FirstGearGames/Scripts/Utilities/Layers.cs
  34. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Layers.cs.meta
  35. 8 0
      Assets/FirstGearGames/Scripts/Utilities/Network.meta
  36. 33 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Lookups.cs
  37. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Lookups.cs.meta
  38. 36 0
      Assets/FirstGearGames/Scripts/Utilities/Network/MirrorBreaksProjectsEveryRelease_Serializers.cs
  39. 1 1
      Assets/FirstGearGames/Scripts/Utilities/Network/MirrorBreaksProjectsEveryRelease_Serializers.cs.meta
  40. 174 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Platforms.cs
  41. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Platforms.cs.meta
  42. 176 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Quaternions.cs
  43. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Network/Quaternions.cs.meta
  44. 30 0
      Assets/FirstGearGames/Scripts/Utilities/Quaternions.cs
  45. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Quaternions.cs.meta
  46. 8 0
      Assets/FirstGearGames/Scripts/Utilities/Structures.meta
  47. 35 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/FloatRange.cs
  48. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/FloatRange.cs.meta
  49. 43 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/IntRange.cs
  50. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/IntRange.cs.meta
  51. 44 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/Vector2Range.cs
  52. 11 0
      Assets/FirstGearGames/Scripts/Utilities/Structures/Vector2Range.cs.meta
  53. 112 0
      Assets/FirstGearGames/Scripts/Utilities/Transforms.cs
  54. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Transforms.cs.meta
  55. 221 0
      Assets/FirstGearGames/Scripts/Utilities/Vectors.cs
  56. 13 0
      Assets/FirstGearGames/Scripts/Utilities/Vectors.cs.meta
  57. 8 0
      Assets/FirstGearGames/Supporters.meta
  58. 8 0
      Assets/FirstGearGames/Supporters/Assets.meta
  59. 270 0
      Assets/FirstGearGames/Supporters/Assets/ChangeLog.txt
  60. 7 0
      Assets/FirstGearGames/Supporters/Assets/ChangeLog.txt.meta
  61. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker.meta
  62. 1 1
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo.meta
  63. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials.meta
  64. 77 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Cube.mat
  65. 2 2
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Cube.mat.meta
  66. 77 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Ground.mat
  67. 2 2
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Ground.mat.meta
  68. 77 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Player.mat
  69. 2 2
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Player.mat.meta
  70. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab.meta
  71. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC.meta
  72. 118 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube.prefab
  73. 1 1
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube.prefab.meta
  74. 69 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube_NoRender.prefab
  75. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube_NoRender.prefab.meta
  76. 153 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/Player.prefab
  77. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/Player.prefab.meta
  78. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest.meta
  79. 99 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube.prefab
  80. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube.prefab.meta
  81. 50 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube_NoRender.prefab
  82. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube_NoRender.prefab.meta
  83. 134 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementPlayer.prefab
  84. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementPlayer.prefab.meta
  85. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity.meta
  86. 99 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCube.prefab
  87. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCube.prefab.meta
  88. 50 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCubeNoRender.prefab
  89. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCubeNoRender.prefab.meta
  90. 134 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityPlayer.prefab
  91. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityPlayer.prefab.meta
  92. 116 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/RegularProximityCube.prefab
  93. 7 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/RegularProximityCube.prefab.meta
  94. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes.meta
  95. 1039 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes/FastProximityChecker.unity
  96. 1 1
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes/FastProximityChecker.unity.meta
  97. 8 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts.meta
  98. 43 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/AutoMovePlayer.cs
  99. 11 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/AutoMovePlayer.cs.meta
  100. 52 0
      Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/CubeSpawner.cs

File diff suppressed because it is too large
+ 0 - 0
Assembly-CSharp-Editor.csproj


File diff suppressed because it is too large
+ 0 - 0
Assembly-CSharp.csproj


+ 1 - 1
Assets/Ignorance.meta → Assets/FirstGearGames.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 5a7f75edb8db8494a856b560d2bce067
+guid: b0dd742b0d482c7439cfb8a4cb0c4249
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 1 - 1
Assets/Ignorance/Demo/Basic.meta → Assets/FirstGearGames/Editor.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: cd20cf8481e733f42a140665486354bd
+guid: b0652c45d2ff5904b94d732f9bfa7191
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

BIN
Assets/FirstGearGames/Editor/GearIcon.png


+ 9 - 21
Assets/Ignorance/Demo/PongChamp/Textures/PoutRyuu.png.meta → Assets/FirstGearGames/Editor/GearIcon.png.meta

@@ -1,12 +1,12 @@
 fileFormatVersion: 2
-guid: 824ee62c0fc357b4081855e43253a948
+guid: 993fb6faa4b6ea9498bc4cbec51f137a
 TextureImporter:
   internalIDToNameTable: []
   externalObjects: {}
   serializedVersion: 11
   mipmaps:
     mipMapMode: 0
-    enableMipMap: 0
+    enableMipMap: 1
     sRGBTexture: 1
     linearTexture: 0
     fadeOut: 0
@@ -31,16 +31,16 @@ TextureImporter:
   maxTextureSize: 2048
   textureSettings:
     serializedVersion: 2
-    filterMode: 0
+    filterMode: 2
     aniso: -1
     mipBias: -100
-    wrapU: 1
-    wrapV: 1
+    wrapU: -1
+    wrapV: -1
     wrapW: -1
-  nPOTScale: 0
+  nPOTScale: 1
   lightmap: 0
   compressionQuality: 50
-  spriteMode: 1
+  spriteMode: 0
   spriteExtrude: 1
   spriteMeshType: 1
   alignment: 0
@@ -51,7 +51,7 @@ TextureImporter:
   alphaUsage: 1
   alphaIsTransparency: 1
   spriteTessellationDetail: -1
-  textureType: 8
+  textureType: 0
   textureShape: 1
   singleChannelComponent: 0
   maxTextureSizeSet: 0
@@ -83,18 +83,6 @@ TextureImporter:
     overridden: 0
     androidETC2FallbackOverride: 0
     forceMaximumCompressionQuality_BC6H_BC7: 0
-  - serializedVersion: 3
-    buildTarget: iPhone
-    maxTextureSize: 2048
-    resizeAlgorithm: 0
-    textureFormat: -1
-    textureCompression: 0
-    compressionQuality: 50
-    crunchedCompression: 0
-    allowsAlphaSplitting: 0
-    overridden: 0
-    androidETC2FallbackOverride: 0
-    forceMaximumCompressionQuality_BC6H_BC7: 0
   - serializedVersion: 3
     buildTarget: Android
     maxTextureSize: 2048
@@ -113,7 +101,7 @@ TextureImporter:
     outline: []
     physicsShape: []
     bones: []
-    spriteID: 5e97eb03825dee720800000000000000
+    spriteID: 
     internalID: 0
     vertices: []
     indices: 

+ 11 - 0
Assets/FirstGearGames/LICENSE.txt

@@ -0,0 +1,11 @@
+"CONTENT" is all files within this package under the FirstGearGames folder, unless otherwise specified, including but not limited to: source code, images, audio. CONTENT is proprietary and confidential.
+"CREATOR" is FirstGearGames.
+"OWNER" is any individual which has acquired CONTENT through CREATOR or medium of CREATOR.
+
+Copyright (C) FirstGearGames - All Rights Reserved.
+
+CONTENT may not be redistributed. CONTENT or deviations of CONTENT may not be made available to any persons other than OWNER.
+
+Exceptions: CONTENT may be used in closed source applications, personal or commercial, without special permissions.
+
+FirstGearGames <support@firstgeargames.com>

+ 7 - 7
Assets/Mirror/Version.txt.meta → Assets/FirstGearGames/LICENSE.txt.meta

@@ -1,7 +1,7 @@
-fileFormatVersion: 2
-guid: c6b1f72568a9340178b4c34608fbdbc3
-TextScriptImporter:
-  externalObjects: {}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
+fileFormatVersion: 2
+guid: 06247736d7966dd4b9ea6bdc485b4c57
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 6 - 0
Assets/FirstGearGames/README.txt

@@ -0,0 +1,6 @@
+Some scenes may rely upon TextMeshPro being imported.
+
+IMPORTANT: assets or projects may have dependencies. View the README within each assets/projects
+folder to view dependencies. Dependencies can be found in my downloads.
+
+Demo folders may always be excluded or deleted.

+ 7 - 0
Assets/FirstGearGames/README.txt.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 5b92ba9df4ef4984e82fc23fc916d7a2
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Assets/Ignorance/Demo/PongChamp/Scripts.meta → Assets/FirstGearGames/Scripts.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e2898db03f0b9654498df19a98dc9503
+guid: 266fedf81e24e164cbc8fe43a9cf7e76
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 1 - 1
Assets/Ignorance/Demo/PongChamp.meta → Assets/FirstGearGames/Scripts/Editor.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 634f781b33ac69147bff9edd5829cfd6
+guid: c97ecbd54ffa1ea4ab3a0b44ee71de96
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 72 - 0
Assets/FirstGearGames/Scripts/Editor/DrawBitMaskField.cs

@@ -0,0 +1,72 @@
+#if UNITY_EDITOR
+ 
+using UnityEngine;
+using UnityEditor;
+
+namespace FirstGearGames.Utilities.Editors
+{
+
+    /// <summary>
+    /// SOURCE: https://answers.unity.com/questions/1477896/assign-enum-value-from-editorguienumflagsfield.html
+    /// </summary>
+    public static class EditorExtension
+    {
+        public static int DrawBitMaskField(Rect aPosition, int aMask, System.Type aType, GUIContent aLabel)
+        {
+            var itemNames = System.Enum.GetNames(aType);
+            var itemValues = System.Enum.GetValues(aType) as int[];
+
+            int val = aMask;
+            int maskVal = 0;
+            for (int i = 0; i < itemValues.Length; i++)
+            {
+                if (itemValues[i] != 0)
+                {
+                    if ((val & itemValues[i]) == itemValues[i])
+                        maskVal |= 1 << i;
+                }
+                else if (val == 0)
+                    maskVal |= 1 << i;
+            }
+            int newMaskVal = EditorGUI.MaskField(aPosition, aLabel, maskVal, itemNames);
+            int changes = maskVal ^ newMaskVal;
+
+            for (int i = 0; i < itemValues.Length; i++)
+            {
+                if ((changes & (1 << i)) != 0)
+                {
+                    if ((newMaskVal & (1 << i)) != 0)
+                    {
+                        if (itemValues[i] == 0)
+                        {
+                            val = 0;
+                            break;
+                        }
+                        else
+                            val |= itemValues[i];
+                    }
+                    else
+                    {
+                        val &= ~itemValues[i];
+                    }
+                }
+            }
+            return val;
+        }
+    }
+
+    [CustomPropertyDrawer(typeof(BitMaskAttribute))]
+    public class EnumBitMaskPropertyDrawer : PropertyDrawer
+    {
+        public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label)
+        {
+            var typeAttr = attribute as BitMaskAttribute;
+            // Add the actual int value behind the field name
+            label.text = label.text + " (" + prop.intValue + ")";
+            prop.intValue = EditorExtension.DrawBitMaskField(position, prop.intValue, typeAttr.propType, label);
+        }
+    }
+
+}
+
+#endif

+ 1 - 1
Assets/Ignorance/Demo/PongChamp/Scripts/OnlineTimer.cs.meta → Assets/FirstGearGames/Scripts/Editor/DrawBitMaskField.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d0996ec573094c24890a4d4233ee871e
+guid: 1aa5b3604b2806d43932a7c78d4d287d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 8 - 0
Assets/FirstGearGames/Scripts/EditorRuntime.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9f025f68cfd9ad041a4c846b05c0b460
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 19 - 0
Assets/FirstGearGames/Scripts/EditorRuntime/BitMaskAttribute.cs

@@ -0,0 +1,19 @@
+
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Editors
+{
+
+    /// <summary>
+    /// SOURCE: https://answers.unity.com/questions/1477896/assign-enum-value-from-editorguienumflagsfield.html
+    /// </summary>
+    public class BitMaskAttribute : PropertyAttribute
+    {
+        public System.Type propType;
+        public BitMaskAttribute(System.Type aType)
+        {
+            propType = aType;
+        }
+    }
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/EditorRuntime/BitMaskAttribute.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d29005cecd48ddc4a9017c0db498d576
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Scripts/Utilities.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: be6c6cc6d3c9f2d4e87277f16c002717
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 80 - 0
Assets/FirstGearGames/Scripts/Utilities/Arrays.cs

@@ -0,0 +1,80 @@
+using System.Collections.Generic;
+
+namespace FirstGearGames.Utilities.Objects
+{
+
+    public static class Arrays
+    {
+        /// <summary>
+        /// Randomizer used for shuffling.
+        /// </summary>
+        private static System.Random _random = new System.Random();
+
+        /// <summary>
+        /// Adds an entry to a list if it does not exist already.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name=""></param>
+        /// <param name="value"></param>
+        public static void AddUnique<T>(this List<T> list, object value)
+        {
+            if (!list.Contains((T)value))
+                list.Add((T)value);
+        }
+
+        /// <summary>
+        /// Removes an object from a list through re-ordering. This breaks the order of the list for a faster remove.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="list"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public static bool FastReferenceRemove<T>(this List<T> list, object value)
+        {
+            for (int i = 0; i < list.Count; i++)
+            {
+                if (object.ReferenceEquals(list[i], value))
+                {
+                    FastIndexRemove(list, i);
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// Removes an index from a list through re-ordering. This breaks the order of the list for a faster remove.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="list"></param>
+        /// <param name="index"></param>
+        public static void FastIndexRemove<T>(this List<T> list, int index)
+        {
+            list[index] = list[list.Count - 1];
+            list.RemoveAt(list.Count - 1);
+        }
+
+
+        /// <summary>
+        /// Shuffles an array.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="array"></param>
+        public static void Shuffle<T>(this T[] array)
+        {
+            int n = array.Length;
+            for (int i = 0; i < (n - 1); i++)
+            {
+                int r = i + _random.Next(n - i);
+                T t = array[r];
+                array[r] = array[i];
+                array[i] = t;
+            }
+        }
+
+
+    }
+
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Arrays.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 1b93eae9ff81b3e4b892128ca4b392ed
+timeCreated: 1530140103
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 31 - 0
Assets/FirstGearGames/Scripts/Utilities/Canvases.cs

@@ -0,0 +1,31 @@
+using UnityEngine;
+
+
+
+namespace FirstGearGames.Utilities.Objects
+{
+
+
+    public static class Canvases
+    {
+
+        /// <returns>Returns true part is within whole.</returns>
+        public static void SetActive(this CanvasGroup group, bool active, bool setAlpha)
+        {
+            if (group == null)
+                return;
+
+            if (setAlpha)
+            {
+                if (active)
+                    group.alpha = 1f;
+                else
+                    group.alpha = 0f;
+            }
+
+            group.interactable = active;
+            group.blocksRaycasts = active;
+        }
+    }
+
+}

+ 1 - 1
Assets/Mirror/Editor/Weaver/Log.cs.meta → Assets/FirstGearGames/Scripts/Utilities/Canvases.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 2a21c60c40a4c4d679c2b71a7c40882e
+guid: c0e7937b287d3d24d807a115c1a3a464
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 32 - 0
Assets/FirstGearGames/Scripts/Utilities/DisplayFPS.cs

@@ -0,0 +1,32 @@
+
+using FirstGearGames.Utilities.Maths;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+
+    public class DisplayFPS : MonoBehaviour
+    {
+        [SerializeField]
+        private Text _fpsText = null;
+
+        private FrameRateCalculator _frameRate = new FrameRateCalculator();
+
+
+        private void Update()
+        {
+            UpdateFrameRate();
+        }
+
+        private void UpdateFrameRate()
+        {
+            if (_frameRate.Update(Time.unscaledDeltaTime))
+                _fpsText.text = _frameRate.GetIntFrameRate().ToString();
+        }
+
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/DisplayFPS.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e7b0e7c837ca731478520a11e0201d7b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 109 - 0
Assets/FirstGearGames/Scripts/Utilities/Enums.cs

@@ -0,0 +1,109 @@
+using System;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+
+    public static class Enums
+    {
+        /// <summary>
+        /// Determine an enum value from a given string. This can be an expensive function.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="text">Text of string.</param>
+        /// <param name="defaultValue">Default value if enum couldn't be found.</param>
+        /// <returns>Enum found or default value if no enum is found.</returns>
+        public static T FromString<T>(string text, T defaultValue)
+        {
+            //If string is empty or null return default value.
+            if (string.IsNullOrEmpty(text))
+                return defaultValue;
+            //If enum isn't defined return default value.
+            if (!Enum.IsDefined(typeof(T), (string)text))
+                return defaultValue;
+            //Return parsed value.
+            return (T)Enum.Parse(typeof(T), text, true);
+        }
+
+        /// <summary>
+        /// Returns if whole(extended enum) has any of the part values.
+        /// </summary>
+        /// <param name="whole"></param>
+        /// <param name="part">Values to check for within whole.</param>
+        /// <returns>Returns true part is within whole.</returns>
+        public static bool Contains(this Enum whole, Enum part)
+        {
+            //If not the same type of Enum return false.
+            /* Commented out for performance. Designer
+             * should know better than to compare two different
+             * enums. */
+            //if (!SameType(value, target))
+            //    return false;
+
+            /* Convert enum values to ulong. With so few
+             * values a uint would be safe, but should
+             * the options expand ulong is safer. */
+            ulong wholeNum = Convert.ToUInt64(whole);
+            ulong partNum = Convert.ToUInt64(part);
+
+            return ((wholeNum & partNum) != 0);
+        }
+        /// <summary>
+        /// Returns if part values contains any of whole(extended enum).
+        /// </summary>
+        /// <param name="whole"></param>
+        /// <param name="part"></param>
+        /// <returns>Returns true whole is within part.</returns>
+        public static bool ReverseContains(this Enum whole, Enum part)
+        {
+            //If not the same type of Enum return false.
+            /* Commented out for performance. Designer
+             * should know better than to compare two different
+             * enums. */
+            //if (!SameType(value, target))
+            //    return false;
+
+            /* Convert enum values to ulong. With so few
+             * values a uint would be safe, but should
+             * the options expand ulong is safer. */
+            ulong wholeNum = Convert.ToUInt64(whole);
+            ulong partNum = Convert.ToUInt64(part);
+
+            return ((partNum & wholeNum) != 0);
+        }
+
+        /// <summary>
+        /// Returns if an enum equals a specified value.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <param name="target"></param>
+        /// <returns></returns>
+        public static bool Equals(this Enum value, Enum target)
+        {
+            //If not the same type of Enum return false.
+            /* Commented out for performance. Designer
+             * should know better than to compare two different
+             * enums. */
+            //if (!SameType(value, target))
+            //    return false;
+
+            ulong valueNum = Convert.ToUInt64(value);
+            ulong wholeNum = Convert.ToUInt64(target);
+
+            return (valueNum == wholeNum);
+        }
+
+        /// <summary>
+        /// Returns if a is the same Enum as b.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="target"></param>
+        /// <returns></returns>
+        public static bool SameType(Enum a, Enum b)
+        {
+            return (a.GetType() == b.GetType());
+        }
+    }
+
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Enums.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: e6c66aec505f9254491b2b126a2d4745
+timeCreated: 1522959833
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 132 - 0
Assets/FirstGearGames/Scripts/Utilities/Floats.cs

@@ -0,0 +1,132 @@
+using System;
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+
+    public static class Floats
+    {
+        private static System.Random _random = new System.Random();
+
+        /// <summary>
+        /// Provides a random inclusive int within a given range. Preferred over Unity's Random to eliminate confusion as Unity uses inclusive for floats max, and exclusive for int max. 
+        /// </summary>
+        /// <param name="minimum">Inclusive minimum value.</param>
+        /// <param name="maximum">Inclusive maximum value.</param>
+        /// <returns></returns>
+        public static float RandomInclusiveRange(float minimum, float maximum)
+        {
+            double min = Convert.ToDouble(minimum);
+            double max = Convert.ToDouble(maximum);
+
+            double result = (_random.NextDouble() * (max - min)) + min;
+            return Convert.ToSingle(result);
+        }
+
+        /// <summary>
+        /// Returns a random float between 0f and 1f.
+        /// </summary>
+        /// <returns></returns>
+        public static float Random01()
+        {
+            return RandomInclusiveRange(0f, 1f);
+        }
+
+        /// <summary>
+        /// Returns if a target float is within variance of the source float.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="tolerance"></param>
+        public static bool Near(this float a, float b, float tolerance = 0.01f)
+        {
+            return (Mathf.Abs(a - b) <= tolerance);
+        }
+
+        /// <summary>
+        /// Clamps a float and returns if the float required clamping.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <param name="min"></param>
+        /// <param name="max"></param>
+        /// <param name="clamped"></param>
+        /// <returns></returns>
+        public static float Clamp(float value, float min, float max, ref bool clamped)
+        {
+            clamped = (value < min);
+            if (clamped)
+                return min;
+
+            clamped = (value > min);
+            if (clamped)
+                return max;
+
+            clamped = false;
+            return value;
+        }
+
+        /// <summary>
+        /// Returns a float after being adjusted by the specified variance.
+        /// </summary>
+        /// <param name="source"></param>
+        /// <param name="variance"></param>
+        /// <returns></returns>
+        public static float Variance(this float source, float variance)
+        {
+            float pickedVariance = RandomInclusiveRange(1f - variance, 1f + variance);
+            return (source * pickedVariance);
+        }
+        /// <summary>
+        /// Sets a float value to result after being adjusted by the specified variance.
+        /// </summary>
+        /// <param name="source"></param>
+        /// <param name="variance"></param>
+        /// <returns></returns>
+        public static void Variance(this float source, float variance, ref float result)
+        {
+            float pickedVariance = RandomInclusiveRange(1f - variance, 1f + variance);
+            result = (source * pickedVariance);
+        }
+
+        /// <summary>
+        /// Returns negative-one, zero, or postive-one of a value instead of just negative-one or positive-one.
+        /// </summary>
+        /// <param name="value">Value to sign.</param>
+        /// <returns>Precise sign.</returns>
+        public static float PreciseSign(float value)
+        {
+            if (value == 0f)
+                return 0f;
+            else
+                return (Mathf.Sign(value));
+        }
+
+        /// <summary>
+        /// Returns if a float is within a range.
+        /// </summary>
+        /// <param name="source">Value of float.</param>
+        /// <param name="rangeMin">Minimum of range.</param>
+        /// <param name="rangeMax">Maximum of range.</param>
+        /// <returns></returns>
+        public static bool InRange(this float source, float rangeMin, float rangeMax)
+        {
+            return (source >= rangeMin && source <= rangeMax);
+        }
+
+        /// <summary>
+        /// Randomly flips a float value.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public static float RandomlyFlip(float value)
+        {
+            if (Ints.RandomInclusiveRange(0, 1) == 0)
+                return value;
+            else
+                return (value *= -1f);
+        }
+    }
+
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Floats.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 4ab517aa5c3b6e34ca20461339adda04
+timeCreated: 1526172456
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 69 - 0
Assets/FirstGearGames/Scripts/Utilities/FrameRateCalculator.cs

@@ -0,0 +1,69 @@
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+    public class FrameRateCalculator
+    {
+        #region Private.
+        /// <summary>
+        /// Time used to generate Frames.
+        /// </summary>
+        private float _timePassed = 0f;
+        /// <summary>
+        /// Frames performed in TimePassed. Float is used to reduce casting.
+        /// </summary>
+        private float _frames = 0;
+        #endregion
+
+        #region Const.
+        /// <summary>
+        /// How many frames to pass before slicing calculation values.
+        /// </summary>
+        private const int RESET_FRAME_COUNT = 60;
+        /// <summary>
+        /// Percentage to slice calculation values by. Higher percentages result in smoother frame rate adjustments.
+        /// </summary>
+        private const float CALCULATION_SLICE_PERCENT = 0.7f;
+        #endregion
+
+        /// <summary>
+        /// Gets the current frame rate.
+        /// </summary>
+        /// <returns></returns>
+        public int GetIntFrameRate()
+        {
+            return Mathf.CeilToInt((_frames / _timePassed));
+        }
+        /// <summary>
+        /// Gets the current frame rate.
+        /// </summary>
+        /// <returns></returns>
+        public float GetFloatFrameRate()
+        {
+            return (_frames / _timePassed);
+        }
+
+        /// <summary>
+        /// Updates frame count and time passed.
+        /// </summary>
+        public bool Update(float unscaledDeltaTime)
+        {
+            _timePassed += unscaledDeltaTime;
+            _frames++;
+
+            if (_frames > RESET_FRAME_COUNT)
+            {
+                _frames *= CALCULATION_SLICE_PERCENT;
+                _timePassed *= CALCULATION_SLICE_PERCENT;
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/FrameRateCalculator.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1ac3c952f0a6d254aa92271c95a633ff
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 91 - 0
Assets/FirstGearGames/Scripts/Utilities/Ints.cs

@@ -0,0 +1,91 @@
+
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+    /// <summary>
+    /// Various utility classes relating to floats.
+    /// </summary>
+    public static class Ints
+    {
+        private static System.Random _random = new System.Random();
+
+        /// <summary>
+        /// Pads an index a specified value. Preferred over typical padding so that pad values used with skins can be easily found in the code.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <param name="padding"></param>
+        /// <returns></returns>
+        public static string PadInt(int value, int padding)
+        {
+            return value.ToString().PadLeft(padding, '0');
+        }
+
+        /// <summary>
+        /// Provides a random inclusive int within a given range. Preferred over Unity's Random to eliminate confusion as Unity uses inclusive for floats max, and exclusive for int max. 
+        /// </summary>
+        /// <param name="minimum">Inclusive minimum value.</param>
+        /// <param name="maximum">Inclusive maximum value.</param>
+        /// <returns></returns>
+        public static int RandomInclusiveRange(int minimum, int maximum)
+        {
+            return _random.Next(minimum, maximum + 1);
+        }
+        /// <summary>
+        /// Provides a random exclusive int within a given range. Preferred over Unity's Random to eliminate confusion as Unity uses inclusive for floats max, and exclusive for int max. 
+        /// </summary>
+        /// <param name="minimum">Inclusive minimum value.</param>
+        /// <param name="maximum">Exclusive maximum value.</param>
+        /// <returns></returns>
+        public static int RandomExclusiveRange(int minimum, int maximum)
+        {
+            return _random.Next(minimum, maximum);
+        }
+
+        /// <summary>
+        /// Returns a clamped int within a specified range.
+        /// </summary>
+        /// <param name="value">Value to clamp.</param>
+        /// <param name="minimum">Minimum value.</param>
+        /// <param name="maximum">Maximum value.</param>
+        /// <returns></returns>
+        public static int Clamp(int value, int minimum, int maximum)
+        {
+            if (value < minimum)
+                value = minimum;
+            else if (value > maximum)
+                value = maximum;
+
+            return value;
+        }
+
+        /// <summary>
+        /// Determins if all values passed in are the same.
+        /// </summary>
+        /// <param name="values">Values to check.</param>
+        /// <returns>True if all values are the same.</returns>
+        public static bool ValuesMatch(params int[] values)
+        {
+            if (values.Length == 0)
+            {
+                Debug.Log("Ints -> ValuesMatch -> values array is empty.");
+                return false;
+            }
+
+            //Assign first value as element in first array.
+            int firstValue = values[0];
+            //Check all values.
+            for (int i = 1; i < values.Length; i++)
+            {
+                //If any value doesn't match first value return false.
+                if (firstValue != values[i])
+                    return false;
+            }
+
+            //If this far all values match.
+            return true;
+        }
+    }
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Ints.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: c673118198f5c4b41986d52762828363
+timeCreated: 1527268448
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 45 - 0
Assets/FirstGearGames/Scripts/Utilities/Layers.cs

@@ -0,0 +1,45 @@
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Objects
+{
+
+    public static class Layers
+    {
+        /// <summary>
+        /// Converts a layer mask to a layer number.
+        /// </summary>
+        /// <param name="mask"></param>
+        /// <returns></returns>
+        public static int LayerMaskToLayerNumber(LayerMask mask)
+        {
+            return LayerValueToLayerNumber(mask.value);
+        }
+        /// <summary>
+        /// Converts a layer value int to a layer int.
+        /// </summary>
+        /// <param name="bitmask"></param>
+        /// <returns></returns>
+        public static int LayerValueToLayerNumber(int bitmask)
+        {
+            int result = bitmask > 0 ? 0 : 31;
+            while (bitmask > 1)
+            {
+                bitmask = bitmask >> 1;
+                result++;
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// Returns if a LayerMask contains a specified layer.
+        /// </summary>
+        /// <param name="layerMask">LayerMask to check for layer in.</param>
+        /// <param name="layer">Layer to check within LayerMask.</param>
+        /// <returns></returns>
+        public static bool ContainsLayer(LayerMask layerMask, int layer)
+        {
+            return (layerMask == (layerMask | (1 << layer)));
+        }
+    }
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Layers.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 1c18e15e44d21a94d8919f4b6b125a1f
+timeCreated: 1522349045
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Scripts/Utilities/Network.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 678a49d369214664ea78fa2a77fa89c8
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 33 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Lookups.cs

@@ -0,0 +1,33 @@
+using Mirror;
+using System.Runtime.CompilerServices;
+
+
+namespace FirstGearGames.Utilities.Networks
+{
+
+
+    public static class Lookups
+    {
+        /// <summary>
+        /// Returns the NetworkBehaviour for the specified NetworkIdentity and component index.
+        /// </summary>
+        /// <param name="componentIndex"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static NetworkBehaviour ReturnNetworkBehaviour(NetworkIdentity netIdentity, byte componentIndex)
+        {
+            if (netIdentity == null)
+                return null;
+            /* Networkbehaviours within the collection are the same order as compenent indexes.
+            * I can save several iterations by simply grabbing the index from the networkbehaviours collection rather than iterating
+            * it. */
+            //A network behaviour was removed or added at runtime, component counts don't match up.
+            if (componentIndex >= netIdentity.NetworkBehaviours.Length)
+                return null;
+
+            return netIdentity.NetworkBehaviours[componentIndex];
+        }
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Lookups.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f1a6decfc27380c41a81236da459c9a1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 36 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/MirrorBreaksProjectsEveryRelease_Serializers.cs

@@ -0,0 +1,36 @@
+//#if MIRROR_53_0_OR_NEWER
+
+using Mirror;
+
+namespace FirstGearGames.Utilities.Networks
+{
+
+    public static class MirrorBreaksProjectsEveryRelease_Serializers
+    {
+        public static void WriteBoolean(this NetworkWriter writer, bool value) => writer.WriteBool(value);
+        public static bool ReadBoolean(this NetworkReader reader) => reader.ReadBool();
+
+        public static void WriteInt64(this NetworkWriter writer, long value) => writer.WriteLong(value);
+        public static long ReadInt64(this NetworkReader reader) => reader.ReadLong();
+        public static void WriteUInt64(this NetworkWriter writer, ulong value) => writer.WriteULong(value);
+        public static ulong ReadUInt64(this NetworkReader reader) => reader.ReadULong();
+
+        public static void WriteInt32(this NetworkWriter writer, int value) => writer.WriteInt(value);
+        public static int ReadInt32(this NetworkReader reader) => reader.ReadInt();
+        public static void WriteUInt32(this NetworkWriter writer, uint value) => writer.WriteUInt(value);
+        public static uint ReadUInt32(this NetworkReader reader) => reader.ReadUInt();
+
+        public static void WriteInt16(this NetworkWriter writer, short value) => writer.WriteShort(value);
+        public static short ReadInt16(this NetworkReader reader) => reader.ReadShort();
+        public static void WriteUInt16(this NetworkWriter writer, ushort value) => writer.WriteUShort(value);
+        public static ushort ReadUInt16(this NetworkReader reader) => reader.ReadUShort();
+
+        public static void WriteSingle(this NetworkWriter writer, float value) => writer.WriteFloat(value);
+        public static float ReadSingle(this NetworkReader reader) => reader.ReadFloat();
+
+    }
+
+
+}
+
+//#endif

+ 1 - 1
Assets/Mirror/Editor/Weaver/Processors/PropertySiteProcessor.cs.meta → Assets/FirstGearGames/Scripts/Utilities/Network/MirrorBreaksProjectsEveryRelease_Serializers.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d48f1ab125e9940a995603796bccc59e
+guid: edbcfa33993d4e0479acaeaebbedf609
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 174 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Platforms.cs

@@ -0,0 +1,174 @@
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using UnityEngine;
+using Mirror;
+
+
+namespace FirstGearGames.Utilities.Networks
+{
+
+    public static class Platforms
+    {
+        /// <summary>
+        /// Returns the NetworkId for a NetworkIdentity.
+        /// </summary>
+        /// <param name="ni"></param>
+        /// <returns></returns>
+        public static uint ReturnNetworkId(this NetworkIdentity ni)
+        {
+            return ni.netId;
+        }
+        /// <summary>
+        /// Sends a message to the server.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="nm"></param>
+        /// <param name="msg"></param>
+        /// <param name="channel"></param>
+        public static void ClientSend<T>(NetworkManager nm, T msg, int channel) where T : struct, NetworkMessage
+        {
+            NetworkClient.Send(msg, channel);
+        }
+
+        /// <summary>
+        /// Sends a message to all clients.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="nm"></param>
+        /// <param name="msg"></param>
+        /// <param name="channel"></param>
+        public static void ServerSendToAll<T>(NetworkManager nm, T msg, int channel) where T : struct, NetworkMessage
+        {
+            NetworkServer.SendToAll(msg, channel, true);
+        }
+
+        /// <summary>
+        /// Returns true if object has an owner.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnHasOwner(this NetworkBehaviour nb)
+        {
+            return (nb.connectionToClient != null);
+        }
+
+        /// <summary>
+        /// Returns the networkId for the networkIdentity.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static uint ReturnNetId(this NetworkBehaviour nb)
+        {
+            return nb.netIdentity.netId;
+        }
+        /// <summary>
+        /// Returns current owner of this object.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static NetworkConnection ReturnOwner(this NetworkBehaviour nb)
+        {
+            return nb.connectionToClient;
+        }
+
+        /// <summary>
+        /// Returns if current client has authority.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnHasAuthority(this NetworkBehaviour nb)
+        {
+            return nb.hasAuthority;
+        }
+        /// <summary>
+        /// Returns if is server.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnIsServer(this NetworkBehaviour nb)
+        {
+            return nb.isServer;
+        }
+        /// <summary>
+        /// Returns if is server only.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnIsServerOnly(this NetworkBehaviour nb)
+        {
+            return nb.isServerOnly;
+        }
+        /// <summary>
+        /// Returns if is client.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnIsClient(this NetworkBehaviour nb)
+        {
+            return nb.isClient;
+        }
+
+        /// <summary>
+        /// Returns if client is active.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnServerActive(NetworkManager nm)
+        {
+            return NetworkServer.active;
+        }
+        /// <summary>
+        /// Returns if client is active.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool ReturnClientActive(NetworkManager nm)
+        {
+            return NetworkClient.active;
+        }
+
+        /// <summary>
+        /// Returns if a connection is ready.
+        /// </summary>
+        /// <param name="nc"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool IsReady(this NetworkConnection nc)
+        {
+            return nc.isReady;
+        }
+
+        /// <summary>
+        /// Returns currently spawned NetworkIdentities.
+        /// </summary>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static Dictionary<uint, NetworkIdentity> ReturnSpawned(NetworkManager nm)
+        {
+            return NetworkIdentity.spawned;
+        }
+
+        /// <summary>
+        /// Sets MTU values.
+        /// </summary>
+        /// <param name="reliable"></param>
+        /// <param name="unreliable"></param>
+        /// <returns></returns>
+        public static void SetMTU(ref int reliable, ref int unreliable, int maxPacketSize)
+        {
+            if (Transport.activeTransport != null)
+            {
+                reliable = Mathf.Min(maxPacketSize, Transport.activeTransport.GetMaxPacketSize(0));
+                unreliable = Mathf.Min(maxPacketSize, Transport.activeTransport.GetMaxPacketSize(1));
+            }
+
+            //If packet sizes are not calculated then use max.
+            if (reliable == -1)
+                reliable = maxPacketSize;
+            if (unreliable == -1)
+                unreliable = maxPacketSize;
+        }  
+
+    }
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Platforms.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2796339eb81e2bd479d19627da52ff03
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 176 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Quaternions.cs

@@ -0,0 +1,176 @@
+using System;
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Networks
+{
+    public static class Quaternions
+    {
+
+        /// <summary>
+        ///     Credit to this man for converting gaffer games c code to c#
+        ///     https://gist.github.com/fversnel/0497ad7ab3b81e0dc1dd
+        /// </summary>
+        private enum ComponentType : uint
+        {
+            X = 0,
+            Y = 1,
+            Z = 2,
+            W = 3
+        }
+
+        // note: 1.0f / sqrt(2)
+        private const float Maximum = +1.0f / 1.414214f;
+
+        private const int BitsPerAxis = 10;
+        private const int LargestComponentShift = BitsPerAxis * 3;
+        private const int AShift = BitsPerAxis * 2;
+        private const int BShift = BitsPerAxis * 1;
+        private const int IntScale = (1 << (BitsPerAxis - 1)) - 1;
+        private const int IntMask = (1 << BitsPerAxis) - 1;
+
+        internal static uint Compress(Quaternion quaternion)
+        {
+            float absX = Mathf.Abs(quaternion.x);
+            float absY = Mathf.Abs(quaternion.y);
+            float absZ = Mathf.Abs(quaternion.z);
+            float absW = Mathf.Abs(quaternion.w);
+
+            ComponentType largestComponent = ComponentType.X;
+            float largestAbs = absX;
+            float largest = quaternion.x;
+
+            if (absY > largestAbs)
+            {
+                largestAbs = absY;
+                largestComponent = ComponentType.Y;
+                largest = quaternion.y;
+            }
+            if (absZ > largestAbs)
+            {
+                largestAbs = absZ;
+                largestComponent = ComponentType.Z;
+                largest = quaternion.z;
+            }
+            if (absW > largestAbs)
+            {
+                largestComponent = ComponentType.W;
+                largest = quaternion.w;
+            }
+
+            float a = 0;
+            float b = 0;
+            float c = 0;
+            switch (largestComponent)
+            {
+                case ComponentType.X:
+                    a = quaternion.y;
+                    b = quaternion.z;
+                    c = quaternion.w;
+                    break;
+                case ComponentType.Y:
+                    a = quaternion.x;
+                    b = quaternion.z;
+                    c = quaternion.w;
+                    break;
+                case ComponentType.Z:
+                    a = quaternion.x;
+                    b = quaternion.y;
+                    c = quaternion.w;
+                    break;
+                case ComponentType.W:
+                    a = quaternion.x;
+                    b = quaternion.y;
+                    c = quaternion.z;
+                    break;
+            }
+
+            if (largest < 0)
+            {
+                a = -a;
+                b = -b;
+                c = -c;
+            }
+
+            uint integerA = ScaleToUint(a);
+            uint integerB = ScaleToUint(b);
+            uint integerC = ScaleToUint(c);
+
+            return (((uint)largestComponent) << LargestComponentShift) | (integerA << AShift) | (integerB << BShift) | integerC;
+        }
+
+        private static uint ScaleToUint(float v)
+        {
+            float normalized = v / Maximum;
+            return (uint)Mathf.RoundToInt(normalized * IntScale) & IntMask;
+        }
+
+        private static float ScaleToFloat(uint v)
+        {
+            float unscaled = v * Maximum / IntScale;
+
+            if (unscaled > Maximum)
+                unscaled -= Maximum * 2;
+            return unscaled;
+        }
+
+        internal static Quaternion Decompress(uint compressed)
+        {
+            var largestComponentType = (ComponentType)(compressed >> LargestComponentShift);
+            uint integerA = (compressed >> AShift) & IntMask;
+            uint integerB = (compressed >> BShift) & IntMask;
+            uint integerC = compressed & IntMask;
+
+            float a = ScaleToFloat(integerA);
+            float b = ScaleToFloat(integerB);
+            float c = ScaleToFloat(integerC);
+
+            Quaternion rotation;
+            switch (largestComponentType)
+            {
+                case ComponentType.X:
+                    // (?) y z w
+                    rotation.y = a;
+                    rotation.z = b;
+                    rotation.w = c;
+                    rotation.x = Mathf.Sqrt(1 - rotation.y * rotation.y
+                                               - rotation.z * rotation.z
+                                               - rotation.w * rotation.w);
+                    break;
+                case ComponentType.Y:
+                    // x (?) z w
+                    rotation.x = a;
+                    rotation.z = b;
+                    rotation.w = c;
+                    rotation.y = Mathf.Sqrt(1 - rotation.x * rotation.x
+                                               - rotation.z * rotation.z
+                                               - rotation.w * rotation.w);
+                    break;
+                case ComponentType.Z:
+                    // x y (?) w
+                    rotation.x = a;
+                    rotation.y = b;
+                    rotation.w = c;
+                    rotation.z = Mathf.Sqrt(1 - rotation.x * rotation.x
+                                               - rotation.y * rotation.y
+                                               - rotation.w * rotation.w);
+                    break;
+                case ComponentType.W:
+                    // x y z (?)
+                    rotation.x = a;
+                    rotation.y = b;
+                    rotation.z = c;
+                    rotation.w = Mathf.Sqrt(1 - rotation.x * rotation.x
+                                               - rotation.y * rotation.y
+                                               - rotation.z * rotation.z);
+                    break;
+                default:
+                    // Should never happen!
+                    throw new ArgumentOutOfRangeException("Unknown rotation component type: " +
+                                                          largestComponentType);
+            }
+
+            return rotation;
+        }
+
+    }
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Network/Quaternions.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 610d5b62062eff04dac0100a5acb6f00
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 30 - 0
Assets/FirstGearGames/Scripts/Utilities/Quaternions.cs

@@ -0,0 +1,30 @@
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+    public static class Quaternions
+    {
+
+        /// <summary>
+        /// Returns if a rotational value matches another. This method is preferred over Equals or == since those variations allow larger differences before returning false.
+        /// </summary>
+        /// <param name="r"></param>
+        /// <param name="target"></param>
+        /// <param name="distance"></param>
+        /// <returns></returns>
+        public static bool Matches(this Quaternion r, Quaternion target, float? distance = null)
+        {
+            if (distance == null)
+            {
+                return (r.w == target.w && r.x == target.x && r.y == target.y && r.z == target.z);
+            }
+            else
+            {
+                float a = Vector3.SqrMagnitude(r.eulerAngles - target.eulerAngles);
+                return (a <= (distance * distance));
+            }
+        }
+    }
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Quaternions.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 02a9084f4f788cd4293cdff56a49b5dd
+timeCreated: 1522043602
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a29cd7621a70a044bb205cc8cfd96b3c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 35 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/FloatRange.cs

@@ -0,0 +1,35 @@
+using FirstGearGames.Utilities.Maths;
+
+namespace FirstGearGames.Utilities.Structures
+{
+
+
+    [System.Serializable]
+    public struct FloatRange
+    {
+        public FloatRange(float minimum, float maximum)
+        {
+            Minimum = minimum;
+            Maximum = maximum;
+        }
+        /// <summary>
+        /// Minimum range.
+        /// </summary>
+        public float Minimum;
+        /// <summary>
+        /// Maximum range.
+        /// </summary>
+        public float Maximum;
+
+        /// <summary>
+        /// Returns a random value between Minimum and Maximum.
+        /// </summary>
+        /// <returns></returns>
+        public float RandomInclusive()
+        {
+            return Floats.RandomInclusiveRange(Minimum, Maximum);
+        }
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/FloatRange.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35d4414338c0ab248a1b838402887ac0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 43 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/IntRange.cs

@@ -0,0 +1,43 @@
+using FirstGearGames.Utilities.Maths;
+
+namespace FirstGearGames.Utilities.Structures
+{
+
+
+    [System.Serializable]
+    public struct IntRange
+    {
+        public IntRange(int minimum, int maximum)
+        {
+            Minimum = minimum;
+            Maximum = maximum;
+        }
+        /// <summary>
+        /// Minimum range.
+        /// </summary>
+        public int Minimum;
+        /// <summary>
+        /// Maximum range.
+        /// </summary>
+        public int Maximum;
+
+        /// <summary>
+        /// Returns an exclusive random value between Minimum and Maximum.
+        /// </summary>
+        /// <returns></returns>
+        public float RandomExclusive()
+        {
+            return Ints.RandomExclusiveRange(Minimum, Maximum);
+        }
+        /// <summary>
+        /// Returns an inclusive random value between Minimum and Maximum.
+        /// </summary>
+        /// <returns></returns>
+        public float RandomInclusive()
+        {
+            return Ints.RandomInclusiveRange(Minimum, Maximum);
+        }
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/IntRange.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 16f03af589a154c47bcbcc3f82b710a6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 44 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/Vector2Range.cs

@@ -0,0 +1,44 @@
+using FirstGearGames.Utilities.Maths;
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Structures
+{
+
+
+    [System.Serializable]
+    public struct Vector2Range
+    {
+        public Vector2Range(Vector2 minimum, Vector2 maximum)
+        {
+            X = new FloatRange(minimum.x, maximum.x);
+            Y = new FloatRange(minimum.y, maximum.y);
+        }
+        public Vector2Range(FloatRange minimum, FloatRange maximum)
+        {
+            X = minimum;
+            Y = maximum;
+        }
+        /// <summary>
+        /// Minimum range.
+        /// </summary>
+        public FloatRange X;
+        /// <summary>
+        /// Maximum range.
+        /// </summary>
+        public FloatRange Y;
+
+        /// <summary>
+        /// Returns a random value between Minimum and Maximum.
+        /// </summary>
+        /// <returns></returns>
+        public Vector2 RandomInclusive()
+        {
+            return new Vector2(
+                Floats.RandomInclusiveRange(X.Minimum, X.Maximum),
+                Floats.RandomInclusiveRange(Y.Minimum, Y.Maximum)
+                );
+        }
+    }
+
+
+}

+ 11 - 0
Assets/FirstGearGames/Scripts/Utilities/Structures/Vector2Range.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1b1d5cb52def18c46a0c1e71b5f1245f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 112 - 0
Assets/FirstGearGames/Scripts/Utilities/Transforms.cs

@@ -0,0 +1,112 @@
+
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Objects
+{
+
+    public static class Transforms
+    {
+        /// <summary>
+        /// Destroys all children under the specified transform.
+        /// </summary>
+        /// <param name="t"></param>
+        public static void DestroyChildren(this Transform t, bool destroyImmediately = false)
+        {
+            foreach (Transform child in t)
+            {
+                if (destroyImmediately)
+                    MonoBehaviour.DestroyImmediate(child.gameObject);
+                else
+                    MonoBehaviour.Destroy(child.gameObject);
+            }
+        }
+
+        /// <summary>
+        /// Gets components in children and optionally parent.
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="results"></param>
+        /// <param name="parent"></param>
+        /// <param name="includeParent"></param>
+        /// <param name="includeInactive"></param>
+        public static void GetComponentsInChildren<T>(Transform parent, List<T> results, bool includeParent = true, bool includeInactive = false) where T : Component
+        {
+            if (!includeParent)
+            {
+                List<T> current = new List<T>();
+                for (int i = 0; i < parent.childCount; i++)
+                {
+                    parent.GetChild(i).GetComponentsInChildren(includeInactive, current);
+                    results.AddRange(current);
+                }
+            }
+            else
+            {
+                parent.GetComponentsInChildren(includeInactive, results);
+            }
+        }
+
+        /// <summary>
+        /// Returns the position of this transform.
+        /// </summary>
+        public static Vector3 GetPosition(this Transform t, bool localSpace)
+        {
+            return (localSpace) ? t.localPosition : t.position;
+        }
+        /// <summary>
+        /// Returns the rotation of this transform.
+        /// </summary>
+        public static Quaternion GetRotation(this Transform t, bool localSpace)
+        {
+            return (localSpace) ? t.localRotation : t.rotation;
+        }
+        /// <summary>
+        /// Returns the scale of this transform.
+        /// </summary>
+        public static Vector3 GetScale(this Transform t)
+        {
+            return t.localScale;
+        }
+
+        /// <summary>
+        /// Sets the position of this transform.
+        /// </summary>
+        /// <param name="t"></param>
+        /// <param name="localSpace"></param>
+        public static void SetPosition(this Transform t, bool localSpace, Vector3 pos)
+        {
+            if (localSpace)
+                t.localPosition = pos;
+            else
+                t.position = pos;
+        }
+        /// <summary>
+        /// Sets the position of this transform.
+        /// </summary>
+        /// <param name="t"></param>
+        /// <param name="localSpace"></param>
+        public static void SetRotation(this Transform t, bool localSpace, Quaternion rot)
+        {
+            if (localSpace)
+                t.localRotation = rot;
+            else
+                t.rotation = rot;
+        }
+        /// <summary>
+        /// Sets the position of this transform.
+        /// </summary>
+        /// <param name="t"></param>
+        /// <param name="localSpace"></param>
+        public static void SetScale(this Transform t, Vector3 scale)
+        {
+            t.localScale = scale;
+        }
+
+
+
+    }
+
+
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Transforms.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: a182a44e1d830d94589cb57b7a25cc1f
+timeCreated: 1525202965
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 221 - 0
Assets/FirstGearGames/Scripts/Utilities/Vectors.cs

@@ -0,0 +1,221 @@
+using System;
+using System.Runtime.CompilerServices;
+using UnityEngine;
+
+namespace FirstGearGames.Utilities.Maths
+{
+
+    public static class Vectors
+    {
+        /// <summary>
+        /// Vector3.zero.
+        /// </summary>
+        private static readonly Vector3 VECTOR3_ZERO = new Vector3(0.0f, 0.0f, 0.0f);
+        /// <summary>
+        /// Float epislon.
+        /// </summary>
+        private const float FLOAT_EPSILON = 0.00001f;
+        /// <summary>
+        /// Float square epislon.
+        /// </summary>
+        private const float FLOAT_SQR_EPSILON = 1e-15f;
+
+        #region Vector3.
+        /// <summary>
+        /// Calculates the linear parameter t that produces the interpolant value within the range [a, b].
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public static float InverseLerp(Vector3 a, Vector3 b, Vector3 value)
+        {
+            Vector3 ab = b - a;
+            Vector3 av = value - a;
+            return Mathf.Clamp01(Vector3.Dot(av, ab) / Vector3.Dot(ab, ab));
+        }
+
+        /// <summary>
+        /// Returns if the target Vector3 is within variance of the source Vector3.
+        /// </summary>
+        /// <param name="a">Source vector.</param>
+        /// <param name="b">Target vector.</param>
+        /// <param name="tolerance">How close the target vector must be to be considered close.</param>
+        /// <returns></returns>
+        public static bool Near(this Vector3 a, Vector3 b, float tolerance = 0.01f)
+        {
+            return (Vector3.Distance(a, b) <= tolerance);
+        }
+
+        /// <summary>
+        /// Returns if any values within a Vector3 are NaN.
+        /// </summary>
+        /// <param name="source"></param>
+        /// <returns></returns>
+        public static bool IsNan(this Vector3 source)
+        {
+            return (float.IsNaN(source.x) || float.IsNaN(source.y) || float.IsNaN(source.z));
+        }
+
+        /// <summary>
+        /// Lerp between three Vector3 values.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="c"></param>
+        /// <param name="percent"></param>
+        /// <returns></returns>
+        public static Vector3 Lerp3(Vector3 a, Vector3 b, Vector3 c, float percent)
+        {
+            Vector3 r0 = Vector3.Lerp(a, b, percent);
+            Vector3 r1 = Vector3.Lerp(b, c, percent);
+            return Vector3.Lerp(r0, r1, percent);
+        }
+
+        /// <summary>
+        /// Lerp between three Vector3 values.
+        /// </summary>
+        /// <param name="vectors"></param>
+        /// <param name="percent"></param>
+        /// <returns></returns>
+        public static Vector3 Lerp3(Vector3[] vectors, float percent)
+        {
+            if (vectors.Length < 3)
+            {
+                Debug.LogWarning("Vectors -> Lerp3 -> Vectors length must be 3.");
+                return Vector3.zero;
+            }
+
+            return Lerp3(vectors[0], vectors[1], vectors[2], percent);
+        }
+
+        /// <summary>
+        /// Multiplies a Vector3 by another.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="multiplier"></param>
+        /// <returns></returns>
+        public static Vector3 Multiply(this Vector3 src, Vector3 multiplier)
+        {
+            return new Vector3(src.x * multiplier.x, src.y * multiplier.y, src.z * multiplier.z);
+        }
+
+        #region Fast.
+        /* Fast checks are property of:
+        *  Copyright (c) 2020 Maxim Munnig Schmidt
+        *
+        *  Permission is hereby granted, free of charge, to any person obtaining a copy
+        *  of this software and associated documentation files (the "Software"), to deal
+        *  in the Software without restriction, including without limitation the rights
+        *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+        *  copies of the Software, and to permit persons to whom the Software is
+        *  furnished to do so, subject to the following conditions:
+        *
+        *  The above copyright notice and this permission notice shall be included in all
+        *  copies or substantial portions of the Software.
+        *
+        *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+        *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+        *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+        *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+        *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+        *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+        *  SOFTWARE.
+        */
+        /// <summary>
+        /// Fast Distance.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static float FastDistance(Vector3 a, Vector3 b)
+        {
+            var distx = a.x - b.x;
+            var disty = a.y - b.y;
+            var distz = a.z - b.z;
+            return (float)Math.Sqrt(distx * distx + disty * disty + distz * distz);
+        }
+        /// <summary>
+        /// Fast SqrMagnitude.
+        /// </summary>
+        /// <param name="vector"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static float FastSqrMagnitude(Vector3 vector)
+        {
+            return vector.x * vector.x + vector.y * vector.y + vector.z * vector.z;
+        }
+        /// <summary>
+        /// Fast Normalize.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static Vector3 FastNormalize(Vector3 value)
+        {
+            float mag = (float)Math.Sqrt(value.x * value.x + value.y * value.y + value.z * value.z); //Magnitude(value);
+            if (mag > FLOAT_EPSILON)
+            {
+                Vector3 result;
+                result.x = value.x / mag;
+                result.y = value.y / mag;
+                result.z = value.z / mag;
+                return result;// value / mag;
+            }
+            else
+                return VECTOR3_ZERO;
+        }
+        #endregion
+        #endregion
+
+        #region Vector2.
+
+        /// <summary>
+        /// Lerp between three Vector2 values.
+        /// </summary>
+        /// <param name="a"></param>
+        /// <param name="b"></param>
+        /// <param name="c"></param>
+        /// <param name="percent"></param>
+        /// <returns></returns>
+        public static Vector2 Lerp3(Vector2 a, Vector2 b, Vector2 c, float percent)
+        {
+            Vector2 r0 = Vector2.Lerp(a, b, percent);
+            Vector2 r1 = Vector2.Lerp(b, c, percent);
+            return Vector2.Lerp(r0, r1, percent);
+        }
+
+        /// <summary>
+        /// Lerp between three Vector2 values.
+        /// </summary>
+        /// <param name="vectors"></param>
+        /// <param name="percent"></param>
+        /// <returns></returns>
+        public static Vector2 Lerp2(Vector2[] vectors, float percent)
+        {
+            if (vectors.Length < 3)
+            {
+                Debug.LogWarning("Vectors -> Lerp3 -> Vectors length must be 3.");
+                return Vector2.zero;
+            }
+
+            return Lerp3(vectors[0], vectors[1], vectors[2], percent);
+        }
+
+
+        /// <summary>
+        /// Multiplies a Vector2 by another.
+        /// </summary>
+        /// <param name="src"></param>
+        /// <param name="multiplier"></param>
+        /// <returns></returns>
+        public static Vector2 Multiply(this Vector2 src, Vector2 multiplier)
+        {
+            return new Vector2(src.x * multiplier.x, src.y * multiplier.y);
+        }
+        #endregion
+
+    }
+
+}

+ 13 - 0
Assets/FirstGearGames/Scripts/Utilities/Vectors.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 6bf25d6d9fa7a754b85a60006db774c4
+timeCreated: 1522043602
+licenseType: Free
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b9483163c86d6624c98523ce3405e0a8
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fb94be6339038d44aa8d11c809a589d9
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 270 - 0
Assets/FirstGearGames/Supporters/Assets/ChangeLog.txt

@@ -0,0 +1,270 @@
+2021/10/23
+	- General
+		+ Fixed breaks caused by Mirror update 53x.
+
+2021/09/11
+	- Flex Network Transform
+		+ Removed Reliable and Resend Unreliable options. Component now always uses unreliable. This will not affect anyone's project.
+		+ Can now enable/disable synchronization for properties at runtime. Must be called from the authoritative side. Used by calling fntReference.SetSynchronizePosition ect).
+	
+	- Flex Network Animator
+		+ Added sendImmediately parameter to SetTrigger. This is generally not needed but can be useful if you wish to send the trigger as animator parameters are currently rather than what they may be next interval.
+
+2021/07/14
+	- Flex Network Animator
+		+ Fixed client authoritative throwing end of stream when a client would send data at irregular intervals to server.
+
+2021/07/08
+	- Flex Network Animator
+	- Flex Network Transform
+		+ Moved a section of code away from using NetworkWriter/Readers. Mirror was unexpectedly trying to use empty Writers previously used in these components causing problems within Mirror.
+
+2021/07/01
+	- Flex Network Animator
+		+ Fixed break caused by Mirror update. Method not found WriteBool.
+
+	-Flex Network Transform
+		+ Last release no longer experimental.
+		+ Fixed extrapolation sometimes not resetting in server authoritative environment.
+		
+2021/06/13
+	- Flex Network Animator
+		+ Fixed Crossfade API regularly being one animation behind.
+		+ PlayInFixedTime API actually takes a time argument now; guess no one was using this!
+
+2021/06/09
+	- All
+		+ Mirage support officially removed.
+		+ Suppressed obsolete warnings for NetworkVisibility.
+		+ Fixed Length errors caused by most recent Mirror changes.
+		+ Fixed warning spam caused by most recent Mirror changes in addition to NetworkVisibility warnings.
+
+	- Flex Network Transform
+		+ Performance drastically increased, and scales considerably better than any other transform component. Flex Network Transform is over 15 times faster than Network Transform with 200 clients.
+		+ Extrapolation now works on platforms.
+		+ Added ForceSendTransform API, allowing you to force transform updates which are guaranteed to replicate accurately on observers. This is useful if you want to send slower updates but ensure certain actions are replicated, such as the peak of a jump or double jumps.
+		+ Added demo for ForceSendTransform API.
+
+	- Flex Network Animator
+		+ If received client updates become excessive then they are no longer sent in order to observers, now only current values are under this condition.
+		+ A few extra sanity checks for unusual circumstances. Nothing to see here.
+		+ Minor performance boost when using client authoritative.
+
+2021/05/17
+	- Fast Proximity Checker
+		+ Added some catches for invalid user input.
+
+2021/04/25
+	- Flex Network Animator
+		+ Added Crossfade API support.
+		+ Mirage information removed from README since it's no longer supported at this time.
+
+	- Flex Network Transform
+		+ Mirage information removed from README since it's no longer supported at this time.
+
+2021/04/23
+	- All
+		+ Separated required packages.
+
+	- Reactive Physics Object
+		+ Updated API to use latest Fundamental package.
+
+2021/04/20
+	- Fast Proximity Checker
+		+ Fixed bug with more recent mirror releases that would cause objects to flicker in and out.
+
+	- Reactive Physics Object
+		+ Fixed bug which could possibly cause jitter while being used for 2D.
+
+2021/04/14
+	- Fast Proximity Checker
+		+ Made faster. Mirror's spatial hashing didn't stand a chance.
+
+2021/04/06
+	- Flex Network Transform
+		+ Fixed transforms sometimes being out of synchronization until they move again after spawning in while falling at an accelerated rate, while also experiencing very low frames per second.
+
+2021/03/25
+    - Flex Network Transform
+        + Added Smoothing Loop option. Smoothing can now optionally be performed in LateUpdate.
+        + Massive performance update. FlexNetworkTransform now has virtually no impact from it's operations. These changes resulted in roughly a 15% performance boost while under load and a 200-300% boost under normal conditions. More refactoring is expected but nothing that would risk stability or need testing.
+
+2021/02/26
+    - Flex Network Animator
+        + Zero garbage collection release! FlexNetworkAnimator is roughly 2X faster than NetworkAnimator now.
+        + Bandwidth usage improvements; now uses about 4.5% the bandwidth of NetworkAnimator.
+        + Better client authoritative animations, and protections. Like NetworkAnimator, previously animations from clients could be missed if the client sent too many animations too quickly. FlexNetworkAnimator now has protection against excessive animations from clients and ensures proper replication, so long as client isn't abusing the network.
+
+2021/02/05
+	- Flex Network Transform
+		+ Zero garbage collection release! Performance improved by a minimum of 17%.
+		+ Bandwidth usage scales better. 500 objects now use roughly 4% less bandwidth.
+		+ MirrorNG officially supported again.
+
+	- Flex Network Animator
+		+ Fixed NRE related to compressing large values.
+		+ Fixed not all cached data being reset when changing animator or controller.
+		+ MirrorNG officially supported again.
+		+ Garbage collection is still present in this release; FNA is receiving the same optimizations as FNT next release.
+
+2021/01/29
+	- Flex Network Transform
+		+ SetPlatform renamed to SetAttached; SetPlatform marked obsolete.
+		+ SetAttached can now be used to attach to child objects, such as picking up world objects in your players hand! View READ ME for more information.
+
+2021/01/17
+	- Flex Network Transform
+		+ Fixed server not sending updates when running as a server build while using timed interval while having a low tick rate.
+
+2021/01/09
+	- Improvements
+		+ Component scripts now have the FirstGearGames icon on them.
+
+	- Flex Network Transform
+		+ Improved tooltip text.
+	
+	- Flex Network Animator
+		+ You may now set the animator and controller at runtime. You must manually synchronize these changes.
+		+ Added README for new API.
+
+2021/01/02
+	- Flex Network Transform
+		+ Set maximum MTU to 1200 for manager.
+		+ No longer experimental!
+		+ Renamed 'stable' package to 'old'.
+
+	- Flex Network Animator
+		+ Fixed a typo on a file name.
+		+ Set maximum MTU to 1200 for manager.
+
+2020/12/31
+	- Flex Network Transform
+		+ Backported 'precise synchronization' fixes to stable.
+
+	- Flex Network Animator
+		+ Built from the ground up! Previously FlexNetworkAnimator was using code from NetworkAnimator; that is no more! FlexNetworkAnimator now only uses 11-13% the bandwidth of NetworkAnimator and has a scaling 200% FPS gain over NetworkAnimator.
+
+2020/12/24
+	- Flex Network Transform
+		+ Fixed transforms not synchronizing when having more than one FlexNetworkTransform on an object, whether it be a child FlexNetworkTransform, or FlexNetworkTransform on a child object.
+		+ Reduced chances of extrapolation overshooting when using client authoritative movement on poor connections.
+		+ Added back in sequence checking for unreliable packets when sending from client to server. This was intentionally removed with intentions to be added back in after testing recent changes.
+		+ Fixed possibility of some packets being ignored when they shouldn't be when synchronizing hundreds of objects.
+		+ Clients now use recent optimizations when sending to server; in the previous update only server was using the optimizations.
+		+ Fixed extrapolation regularly overshooting and not properly expiring.
+
+2020/12/18
+	- Flex Network Transform
+		+ Made Compress Small Values enabled by default.
+		+ Massive performance improvements. FlexNetworkTransform does substantially better with bandwidth and frame rate compared to competitors.
+
+	- Flex Network Animator
+		+ Fixed breaks caused by Mirror upgrade.
+
+2020/12/17
+	- Flex Network Transform
+		+ Removed precise synchronization option, it's now always on.
+		+ Reduced bandwidth usage by 10%; more drastic reductions under investigation.
+		+ Improved performance by 15%.
+		+ Added Compress Small Values option. When enabled will compress small values to the 100th decimal place; this saves additional bandwidth at the cost of precision.
+
+	- Reactive Physics Object
+		+ Removed precise synchronization option, it's now always on.
+
+2020/12/05
+	- Flex Network Transform
+		+ Fixed data sending excessively due to failed transform changes.
+		+ Unreliable sends can now optionally resend data. True to resend transform data with every unreliable packet. At the cost of bandwidth this will ensure smoother movement on very unstable connections but generally is not needed.
+		+ Added Favor Performance option while using timed intervals. While true FlexNetworkTransform will favor performance over update frequency. This is ideal when transform updates can be delayed very slightly.
+		+ More bandwidth saved by limiting who can receive remote actions.
+
+2020/12/01
+	- Flex Network Transform
+		+ Platform support improved; transforms previously struggled to stay synchronized with rotating platforms, or very long platforms. Transforms now stay in perfect synchronization under all conditions.
+		+ More rotation compression; reduced rotation sends by 2 bytes.
+
+2020/11/18
+	- Flex Network Transform
+		+ Added the ability to synchronize to networked platforms using FlexNetworkTransform.SetPlatform(platformNetworkIdentity). View FlexNetworkTransform README for more information.
+
+	- Flex Network Animator
+		+ Fixed animations not going back to owner when using Synchronize To Owner.
+		+ Fixed client authoritative animations not working on client host. (regression from synchronize to owner fix 2020/11/18)
+
+2020/11/01
+	- Flex Network Transform
+		+ Transforms are no longer forced into their last properties when synchronization for the property is disabled.
+
+2020/10/29
+	- Flex Network Transform
+		+ Fixed server sometimes not sending latest transform data while running as client host, while trading authority on scene objects.
+
+2020/10/07
+	- Flex Network Transform
+		+ Added Teleport Threshold. Transform will teleport if threshold value is not 0, and if distance between current position and target position is greater than value.
+		+ New compression on rotation for better accuracy.
+		+ FlexNetworkTransform and FlexNetworkTransformChild will now immediately synchronize current transform properties for new clients. This change addresses a bug where FlexNetworkTransformChild would not have correct transform properties if the object has moved prior to the player joining, but not after. This also adds support for using FlexNetworkTransform directly on children objects when the networking solution allows child networked objects.
+		+ MirrorNG support added. Also the start of allowing support for even more networking platforms.
+		+ You can now hook into FlexNetworkTransform/Child to validate data received from clients when using Client Authority. See README in FlexNetworkTransform folder.
+		+ SequenceId is now a uint, resulting in less bandwidth used for UDP/Unreliable.
+		+ Objects can no longer be moved by clients while server has not yet sent data. This is most commonly seen when a player spawns in and transforms haven't yet changed.
+
+2020/10/01
+	- Flex Network Animator
+		+ Initial release.
+
+2020/09/27
+	- Flex Network Transform
+		+ Fixed FlexNetworkTransformChild not sending transform properties to late joiners until the child object has moved.
+		+ Automatic Interpolation and Interpolation strength have been removed. Use Interpolation Fallbehind instead. This is how far the transform will stay behind it's actual position to compensate for packet loss and throttle.
+		+ Extrapolation is back, and better than ever. Extrapolation Span is how long the transform can extrapolate for when a new packet is expected but does not arrive. This can be combined with a low Interpolation Fallbehind value for near real-time accuracy.
+		+ Fixed properties sometimes not updating to spectators when server was running as client host, while another client was also client authoritative.
+		+ Fixed properties sometimes sending even when they have not changed; no visual disturbance could be seen but this was incuring bandwidth cost.
+		+ Updated inspector to be more helpful.
+
+2020/09/02
+	- Flex Network Transform:
+		+ Fixed transforms not moving to a rotation if the change was very small; most commonly seen in 2D games. This was due to Unity incorrectly reporting that rotation values were matching.
+		+ Fixed extrapolation being applied to a transforms position even when a position update did not occur. This could be seen when rotating or scaling while not moving.
+
+2020/08/27
+	- Flex Network Transform:
+		+ Fixed data sending excessively when synchronizing rotation while using world space.
+
+2020/08/23
+	- Flex Network Transform:
+		+ Fixed position snapping being applied to scale.
+		+ Improvements to performance.
+
+2020/08/19    
+	- Flex Network Transform:
+        + Minor improvements to extrapolation.
+
+2020/08/09
+	- Fast Proximity Checker:
+		+ There is now a `Continuous` option, which is the default behavior. When enabled FastProximityChecker will regularly perform visibility checks. When false visibility checks will only occur on start, and when called manually. This change is useful if you know the object and other objects will always be in range on spawn, such as for a card or board game.
+
+	- Flex Network Transform:
+		+ Can now choose between Interval and FixedUpdate for when data is synchronized.
+		+ Supports reliable and unreliable synchronization methods. For best results use Unreliable with a UDP transport.
+		+ Removed ability to disable Enforce Results.
+		+ Added extrapolation to help predict movement when network traffic becomes unsteady.
+		+ Added UseLocalSpace. True by default to synchronize using localSpace values. False to use world space. Can be useful if you have a habbit of making child networked objects.
+		+ PreciseSynchronization is now false by default.
+
+	- Reactive Physics Object:
+		+ Can now choose between Interval and FixedUpdate for when data is synchronized.
+		+ Supports reliable and unreliable synchronization methods. For best results use Unreliable with a UDP transport.
+		+ Added PreciseSynchronization. True to synchronize data anytime it has changed. False to allow greater differences before synchronizing. Given that rigidbodies often shift continuously it's recommended to leave this false to not flood the network.
+		+ Added UseLocalSpace. True by default to synchronize using localSpace values. False to use world space. Can be useful if you have a habbit of making child networked objects.
+		+ Objects now snap into place when unable to meet synchronization goal after a duration. This effect often goes unnoticed as the difference is minuscule due to floating point imprecisions.
+		+ Added "AllowTeleport()" method. Calling the method clears the data to synchronize to, until another is received. This can be useful to call before teleporting an object locally, so it doesn't snap back to it's synchronized data. You would also want to move the same on the server.
+		+ Added "ReduceAggressiveness()" method. This method temporarily reduces how aggressive the gameObject will move towards the last received synchronization data. Ideally you will call this method every time your controller moves your object.
+
+2020/07/26
+	- Organized files. It's much more clear now what is demo code, and actual content.
+	- Fixed bug in FastProximityChecker that would sometimes cause objects to not unhide when in range.
+
+2020/07/12
+	- Reactive Physics Object now automatically determines if a controller or not. You must only set if object is 2D or 3D.
+	- Flex Network Transform and ReactivePhysicsObject can now synchronize using world space values rather than the default local space. Although not recommended, this can be useful if you need to child a networked object.

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/ChangeLog.txt.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7e91602fd4f14714796bc5677d18e7ee
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ec43183f1463cfa409514b876093e7ee
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 1
Assets/Ignorance/Demo.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0f3dc386b0074be4caf7b858e3189529
+guid: 3fd0b4d5ecd6ec146875ac30118232da
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 740388848fbb37645acc07da45c09317
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 77 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Cube.mat

@@ -0,0 +1,77 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Cube
+  m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _BumpScale: 1
+    - _Cutoff: 0.5
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _UVSec: 0
+    - _ZWrite: 1
+    m_Colors:
+    - _Color: {r: 0.990566, g: 0.4625756, b: 0.4625756, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

+ 2 - 2
Assets/Ignorance/Demo/PongChamp/AtariBall.prefab.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Cube.mat.meta

@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: da367a4c269be6d4a855ee1a9a68256b
+guid: 0f782465d6fb9ab42b114f8b8f2eca00
 NativeFormatImporter:
   externalObjects: {}
-  mainObjectFileID: 100100000
+  mainObjectFileID: 0
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 77 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Ground.mat

@@ -0,0 +1,77 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Ground
+  m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _BumpScale: 1
+    - _Cutoff: 0.5
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _UVSec: 0
+    - _ZWrite: 1
+    m_Colors:
+    - _Color: {r: 0, g: 0.5660378, b: 0.14346087, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

+ 2 - 2
Assets/Ignorance/Demo/PongChamp/AtariRacket.prefab.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Ground.mat.meta

@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: a85b24263182aae4bbc1829bb2b73d7a
+guid: e834ef8b48b5fa1468dca88672040b52
 NativeFormatImporter:
   externalObjects: {}
-  mainObjectFileID: 100100000
+  mainObjectFileID: 0
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 77 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Player.mat

@@ -0,0 +1,77 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Player
+  m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _BumpScale: 1
+    - _Cutoff: 0.5
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _UVSec: 0
+    - _ZWrite: 1
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

+ 2 - 2
Assets/Ignorance/Demo/Basic/BasicWithIgnoranceSettings.lighting.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Materials/Player.mat.meta

@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: f34de581ee6ab3743844c33f257a03c2
+guid: d1e1fda763d09b74689b8c61324658c5
 NativeFormatImporter:
   externalObjects: {}
-  mainObjectFileID: 4890085278179872738
+  mainObjectFileID: 0
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2ff7097e8b8c486439e3769916070649
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e9427f1df281f294b9261d1ba5b2e3f4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 118 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube.prefab

@@ -0,0 +1,118 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 1065620569622945201}
+  - component: {fileID: 1065620569622945202}
+  - component: {fileID: 8736983630549506798}
+  - component: {fileID: 114960909682353454}
+  m_Layer: 0
+  m_Name: FastProximityCube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1065620569622945201
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1065620569622945202
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 0f782465d6fb9ab42b114f8b8f2eca00, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &114960909682353454
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8f1f9d1ccae3c414fa8d1d0758e1c9e2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _continuous: 1
+  _localPlayerOnly: 1
+  _visibilityRange: 20
+  _forceHidden: 0

+ 1 - 1
Assets/Ignorance/Demo/PongChamp/TenryuuBall.prefab.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube.prefab.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 5339554c46006dd4e91cae9ff34c095d
+guid: 70f52d2d172a85c4281b7d4affb8fd4d
 PrefabImporter:
   externalObjects: {}
   userData: 

+ 69 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube_NoRender.prefab

@@ -0,0 +1,69 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 8736983630549506798}
+  - component: {fileID: 114960909682353454}
+  m_Layer: 0
+  m_Name: FastProximityCube_NoRender
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &114960909682353454
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8f1f9d1ccae3c414fa8d1d0758e1c9e2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _continuous: 1
+  _localPlayerOnly: 1
+  _visibilityRange: 20
+  _forceHidden: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/FastProximityCube_NoRender.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3f3971d2ac9356449b583cc70492f674
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 153 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/Player.prefab

@@ -0,0 +1,153 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 1065620569622945201}
+  - component: {fileID: 1065620569622945202}
+  - component: {fileID: 8736983630549506798}
+  - component: {fileID: 114413388656205686}
+  - component: {fileID: 114936428756952280}
+  - component: {fileID: 8072949208442424662}
+  m_Layer: 0
+  m_Name: Player
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 3, y: 3, z: 3}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1065620569622945201
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1065620569622945202
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: d1e1fda763d09b74689b8c61324658c5, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &114413388656205686
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  clientAuthority: 1
+  localPositionSensitivity: 0.01
+  localRotationSensitivity: 0.01
+  localScaleSensitivity: 0.01
+--- !u!114 &114936428756952280
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 09ea08209d91d76468cc974041aa16c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _moveRate: 35
+--- !u!114 &8072949208442424662
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8f1f9d1ccae3c414fa8d1d0758e1c9e2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _continuous: 1
+  _localPlayerOnly: 1
+  _visibilityRange: 20
+  _forceHidden: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/FPC/Player.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8b46c9e343cfd6841a3651e89704a3fa
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b59cf199d2ac80945825ba25432f524c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 99 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube.prefab

@@ -0,0 +1,99 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 1065620569622945201}
+  - component: {fileID: 1065620569622945202}
+  - component: {fileID: 8736983630549506798}
+  m_Layer: 0
+  m_Name: InterestManagementCube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1065620569622945201
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1065620569622945202
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 0f782465d6fb9ab42b114f8b8f2eca00, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 17ae2e3f8e40d5b489a3d499c46472c4
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 50 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube_NoRender.prefab

@@ -0,0 +1,50 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 8736983630549506798}
+  m_Layer: 0
+  m_Name: InterestManagementCube_NoRender
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementCube_NoRender.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 4af99eb1790b48641b3bffb0b5f36f9b
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 134 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementPlayer.prefab

@@ -0,0 +1,134 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3243040657331239809
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3243040657331239820}
+  - component: {fileID: 3243040657331239821}
+  - component: {fileID: 3243040657331239822}
+  - component: {fileID: 6523534819607411922}
+  - component: {fileID: 2476480987580594506}
+  - component: {fileID: 2472500496721920740}
+  m_Layer: 0
+  m_Name: InterestManagementPlayer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3243040657331239820
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 3, y: 3, z: 3}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3243040657331239821
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3243040657331239822
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: d1e1fda763d09b74689b8c61324658c5, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &6523534819607411922
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &2476480987580594506
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  clientAuthority: 1
+  localPositionSensitivity: 0.01
+  localRotationSensitivity: 0.01
+  localScaleSensitivity: 0.01
+--- !u!114 &2472500496721920740
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 09ea08209d91d76468cc974041aa16c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _moveRate: 35

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MInterest/InterestManagementPlayer.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d8b2672636a669148ab969a446be3a8f
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 87b23c7d699569d4db55cd258f93199a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 99 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCube.prefab

@@ -0,0 +1,99 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 1065620569622945201}
+  - component: {fileID: 1065620569622945202}
+  - component: {fileID: 8736983630549506798}
+  m_Layer: 0
+  m_Name: MProximityCube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1065620569622945201
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1065620569622945202
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 0f782465d6fb9ab42b114f8b8f2eca00, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCube.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 07b7106a9279c7e49bb952fc51141d67
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 50 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCubeNoRender.prefab

@@ -0,0 +1,50 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 8736983630549506798}
+  m_Layer: 0
+  m_Name: MProximityCubeNoRender
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityCubeNoRender.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ded9d0ca6494bbd41801d5d80494d832
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 134 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityPlayer.prefab

@@ -0,0 +1,134 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3243040657331239809
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3243040657331239820}
+  - component: {fileID: 3243040657331239821}
+  - component: {fileID: 3243040657331239822}
+  - component: {fileID: 6523534819607411922}
+  - component: {fileID: 2476480987580594506}
+  - component: {fileID: 2472500496721920740}
+  m_Layer: 0
+  m_Name: MProximityPlayer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3243040657331239820
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 3, y: 3, z: 3}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3243040657331239821
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3243040657331239822
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: d1e1fda763d09b74689b8c61324658c5, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &6523534819607411922
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &2476480987580594506
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  clientAuthority: 1
+  localPositionSensitivity: 0.01
+  localRotationSensitivity: 0.01
+  localScaleSensitivity: 0.01
+--- !u!114 &2472500496721920740
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3243040657331239809}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 09ea08209d91d76468cc974041aa16c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  _moveRate: 35

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/MProximity/MProximityPlayer.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: db69567a491fef74e8d3c2f52eb60cb6
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 116 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/RegularProximityCube.prefab

@@ -0,0 +1,116 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1065620569622945213
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065620569622945200}
+  - component: {fileID: 1065620569622945201}
+  - component: {fileID: 1065620569622945202}
+  - component: {fileID: 8736983630549506798}
+  - component: {fileID: 114182890525259188}
+  m_Layer: 0
+  m_Name: RegularProximityCube
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1065620569622945200
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 1, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &1065620569622945201
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1065620569622945202
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 0f782465d6fb9ab42b114f8b8f2eca00, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!114 &8736983630549506798
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 0
+  serverOnly: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &114182890525259188
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065620569622945213}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1731d8de2d0c84333b08ebe1e79f4118, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  syncMode: 0
+  syncInterval: 0.1
+  visRange: 20
+  visUpdateInterval: 1
+  forceHidden: 0

+ 7 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Prefab/RegularProximityCube.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a258a1313607b4c4b9557cd6ad21fecb
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eaeff04b6207226418821839da42a123
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1039 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes/FastProximityChecker.unity

@@ -0,0 +1,1039 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_OcclusionBakeSettings:
+    smallestOccluder: 5
+    smallestHole: 0.25
+    backfaceThreshold: 100
+  m_SceneGUID: 00000000000000000000000000000000
+  m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 9
+  m_Fog: 0
+  m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+  m_FogMode: 3
+  m_FogDensity: 0.01
+  m_LinearFogStart: 0
+  m_LinearFogEnd: 300
+  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+  m_AmbientIntensity: 1
+  m_AmbientMode: 0
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
+  m_HaloStrength: 0.5
+  m_FlareStrength: 1
+  m_FlareFadeSpeed: 3
+  m_HaloTexture: {fileID: 0}
+  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+  m_DefaultReflectionMode: 0
+  m_DefaultReflectionResolution: 128
+  m_ReflectionBounces: 1
+  m_ReflectionIntensity: 1
+  m_CustomReflection: {fileID: 0}
+  m_Sun: {fileID: 0}
+  m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_GIWorkflowMode: 0
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 1
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 40
+    m_AtlasSize: 1024
+    m_AO: 0
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 1
+    m_CompAOExponentDirect: 0
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 1
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 2
+    m_BakeBackend: 1
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 32
+    m_PVRSampleCount: 500
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 500
+    m_PVREnvironmentReferencePointCount: 2048
+    m_PVRFilteringMode: 2
+    m_PVRDenoiserTypeDirect: 0
+    m_PVRDenoiserTypeIndirect: 0
+    m_PVRDenoiserTypeAO: 0
+    m_PVRFilterTypeDirect: 0
+    m_PVRFilterTypeIndirect: 0
+    m_PVRFilterTypeAO: 0
+    m_PVREnvironmentMIS: 0
+    m_PVRCulling: 1
+    m_PVRFilteringGaussRadiusDirect: 1
+    m_PVRFilteringGaussRadiusIndirect: 5
+    m_PVRFilteringGaussRadiusAO: 2
+    m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+    m_PVRFilteringAtrousPositionSigmaIndirect: 2
+    m_PVRFilteringAtrousPositionSigmaAO: 1
+    m_ExportTrainingData: 0
+    m_TrainingDataDestination: TrainingData
+    m_LightProbeSampleCountMultiplier: 4
+  m_LightingDataAsset: {fileID: 0}
+  m_UseShadowmask: 1
+--- !u!196 &4
+NavMeshSettings:
+  serializedVersion: 2
+  m_ObjectHideFlags: 0
+  m_BuildSettings:
+    serializedVersion: 2
+    agentTypeID: 0
+    agentRadius: 0.5
+    agentHeight: 2
+    agentSlope: 45
+    agentClimb: 0.4
+    ledgeDropHeight: 0
+    maxJumpAcrossDistance: 0
+    minRegionArea: 2
+    manualCellSize: 0
+    cellSize: 0.16666667
+    manualTileSize: 0
+    tileSize: 256
+    accuratePlacement: 0
+    debug:
+      m_Flags: 0
+  m_NavMeshData: {fileID: 0}
+--- !u!1 &338463359
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 338463363}
+  - component: {fileID: 338463362}
+  - component: {fileID: 338463361}
+  - component: {fileID: 338463360}
+  m_Layer: 0
+  m_Name: Plane
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!64 &338463360
+MeshCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 338463359}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 4
+  m_Convex: 0
+  m_CookingOptions: 30
+  m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &338463361
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 338463359}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: e834ef8b48b5fa1468dca88672040b52, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 0
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+--- !u!33 &338463362
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 338463359}
+  m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &338463363
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 338463359}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 100, y: 1, z: 100}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &882388589
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 882388590}
+  m_Layer: 0
+  m_Name: MirrorProximity
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &882388590
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 882388589}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 1.2785045, y: -1.4053105, z: -0.7444663}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1515788685}
+  - {fileID: 1009059301}
+  m_Father: {fileID: 0}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1009059300
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1009059301}
+  - component: {fileID: 1009059303}
+  - component: {fileID: 1009059302}
+  m_Layer: 0
+  m_Name: CubeSpawner
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!4 &1009059301
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1009059300}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -1.2785045, y: 3.4053106, z: 0.7444663}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 882388590}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1009059302
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1009059300}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 1832562733
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &1009059303
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1009059300}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c51ea269827fc454bb8a545939b32964, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _networkSpawn: 1
+  _spawnCount: 300
+  _rollableCubePrefab: {fileID: 1065620569622945213, guid: 07b7106a9279c7e49bb952fc51141d67,
+    type: 3}
+  _originArea: {x: 75, y: 1, z: 20}
+--- !u!1 &1236116990
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1236116993}
+  - component: {fileID: 1236116992}
+  - component: {fileID: 1236116991}
+  m_Layer: 0
+  m_Name: Main Camera
+  m_TagString: MainCamera
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!81 &1236116991
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1236116990}
+  m_Enabled: 1
+--- !u!20 &1236116992
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1236116990}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+  m_projectionMatrixMode: 1
+  m_GateFitMode: 2
+  m_FOVAxisMode: 0
+  m_SensorSize: {x: 36, y: 24}
+  m_LensShift: {x: 0, y: 0}
+  m_FocalLength: 50
+  m_NormalizedViewPortRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+  near clip plane: 0.3
+  far clip plane: 1000
+  field of view: 60
+  orthographic: 0
+  orthographic size: 5
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 1
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &1236116993
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1236116990}
+  m_LocalRotation: {x: 0.17364816, y: 0, z: 0, w: 0.9848078}
+  m_LocalPosition: {x: 0, y: 16.27, z: -55.21}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 20, y: 0, z: 0}
+--- !u!1 &1461467836
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1461467837}
+  m_Layer: 0
+  m_Name: FPC
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!4 &1461467837
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1461467836}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -14.962408, y: 9.345955, z: -2.3412132}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 2059542256}
+  - {fileID: 2072360821}
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1515788684
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1515788685}
+  - component: {fileID: 1515788688}
+  - component: {fileID: 1515788687}
+  - component: {fileID: 1515788686}
+  - component: {fileID: 1515788689}
+  m_Layer: 0
+  m_Name: NetworkManager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1515788685
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1515788684}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 3.3669958, y: -26.58159, z: 53.757122}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 882388590}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1515788686
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1515788684}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  showGUI: 1
+  offsetX: 0
+  offsetY: 0
+--- !u!114 &1515788687
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1515788684}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c7424c1070fad4ba2a7a96b02fbeb4bb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  port: 7777
+  NoDelay: 1
+  SendTimeout: 5000
+  ReceiveTimeout: 30000
+  serverMaxMessageSize: 16384
+  serverMaxReceivesPerTick: 10000
+  serverSendQueueLimitPerConnection: 10000
+  serverReceiveQueueLimitPerConnection: 10000
+  clientMaxMessageSize: 16384
+  clientMaxReceivesPerTick: 1000
+  clientSendQueueLimit: 10000
+  clientReceiveQueueLimit: 10000
+--- !u!114 &1515788688
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1515788684}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  dontDestroyOnLoad: 1
+  PersistNetworkManagerToOfflineScene: 0
+  runInBackground: 1
+  autoStartServerBuild: 1
+  serverTickRate: 30
+  serverBatching: 0
+  serverBatchInterval: 0
+  offlineScene: 
+  onlineScene: 
+  transport: {fileID: 1515788687}
+  networkAddress: localhost
+  maxConnections: 4
+  disconnectInactiveConnections: 0
+  disconnectInactiveTimeout: 60
+  authenticator: {fileID: 0}
+  playerPrefab: {fileID: 3243040657331239809, guid: db69567a491fef74e8d3c2f52eb60cb6,
+    type: 3}
+  autoCreatePlayer: 1
+  playerSpawnMethod: 0
+  spawnPrefabs:
+  - {fileID: 1065620569622945213, guid: 07b7106a9279c7e49bb952fc51141d67, type: 3}
+  - {fileID: 3243040657331239809, guid: db69567a491fef74e8d3c2f52eb60cb6, type: 3}
+  - {fileID: 1065620569622945213, guid: ded9d0ca6494bbd41801d5d80494d832, type: 3}
+--- !u!114 &1515788689
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1515788684}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8f60becab051427fbdd3c8ac9ab4712b, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  visRange: 20
+  rebuildInterval: 2
+--- !u!1 &1655311893
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1655311894}
+  m_Layer: 0
+  m_Name: MirrorInterest (broken....)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!4 &1655311894
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1655311893}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 1.2785045, y: -1.4053105, z: -0.7444663}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3403582363303346213}
+  - {fileID: 2080864848}
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1749773918
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1749773920}
+  - component: {fileID: 1749773919}
+  m_Layer: 0
+  m_Name: Directional Light
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!108 &1749773919
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1749773918}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
+  m_Intensity: 0.35
+  m_Range: 10
+  m_SpotAngle: 30
+  m_InnerSpotAngle: 21.80208
+  m_CookieSize: 10
+  m_Shadows:
+    m_Type: 2
+    m_Resolution: -1
+    m_CustomResolution: -1
+    m_Strength: 1
+    m_Bias: 0.05
+    m_NormalBias: 0.4
+    m_NearPlane: 0.2
+    m_CullingMatrixOverride:
+      e00: 1
+      e01: 0
+      e02: 0
+      e03: 0
+      e10: 0
+      e11: 1
+      e12: 0
+      e13: 0
+      e20: 0
+      e21: 0
+      e22: 1
+      e23: 0
+      e30: 0
+      e31: 0
+      e32: 0
+      e33: 1
+    m_UseCullingMatrixOverride: 0
+  m_Cookie: {fileID: 0}
+  m_DrawHalo: 0
+  m_Flare: {fileID: 0}
+  m_RenderMode: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingLayerMask: 1
+  m_Lightmapping: 4
+  m_LightShadowCasterMode: 0
+  m_AreaSize: {x: 1, y: 1}
+  m_BounceIntensity: 1
+  m_ColorTemperature: 6570
+  m_UseColorTemperature: 0
+  m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_UseBoundingSphereOverride: 0
+  m_ShadowRadius: 0
+  m_ShadowAngle: 0
+--- !u!4 &1749773920
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1749773918}
+  m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
+  m_LocalPosition: {x: 0, y: 3, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
+--- !u!1 &2059542251
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2059542256}
+  - component: {fileID: 2059542255}
+  - component: {fileID: 2059542254}
+  - component: {fileID: 2059542253}
+  m_Layer: 0
+  m_Name: NetworkManager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &2059542253
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2059542251}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  showGUI: 1
+  offsetX: 0
+  offsetY: 0
+--- !u!114 &2059542254
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2059542251}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c7424c1070fad4ba2a7a96b02fbeb4bb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  port: 7777
+  NoDelay: 1
+  SendTimeout: 5000
+  ReceiveTimeout: 30000
+  serverMaxMessageSize: 16384
+  serverMaxReceivesPerTick: 10000
+  serverSendQueueLimitPerConnection: 10000
+  serverReceiveQueueLimitPerConnection: 10000
+  clientMaxMessageSize: 16384
+  clientMaxReceivesPerTick: 1000
+  clientSendQueueLimit: 10000
+  clientReceiveQueueLimit: 10000
+--- !u!114 &2059542255
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2059542251}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  dontDestroyOnLoad: 1
+  PersistNetworkManagerToOfflineScene: 0
+  runInBackground: 1
+  autoStartServerBuild: 1
+  serverTickRate: 30
+  serverBatching: 0
+  serverBatchInterval: 0
+  offlineScene: 
+  onlineScene: 
+  transport: {fileID: 2059542254}
+  networkAddress: localhost
+  maxConnections: 4
+  disconnectInactiveConnections: 0
+  disconnectInactiveTimeout: 60
+  authenticator: {fileID: 0}
+  playerPrefab: {fileID: 1065620569622945213, guid: 8b46c9e343cfd6841a3651e89704a3fa,
+    type: 3}
+  autoCreatePlayer: 1
+  playerSpawnMethod: 0
+  spawnPrefabs:
+  - {fileID: 1065620569622945213, guid: 70f52d2d172a85c4281b7d4affb8fd4d, type: 3}
+  - {fileID: 1065620569622945213, guid: 3f3971d2ac9356449b583cc70492f674, type: 3}
+  - {fileID: 1065620569622945213, guid: 8b46c9e343cfd6841a3651e89704a3fa, type: 3}
+--- !u!4 &2059542256
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2059542251}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 19.607908, y: -37.332855, z: 55.35387}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1461467837}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2072360818
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2072360821}
+  - component: {fileID: 2072360820}
+  - component: {fileID: 2072360819}
+  m_Layer: 0
+  m_Name: CubeSpawner
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!114 &2072360819
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2072360818}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 4079923908
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &2072360820
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2072360818}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c51ea269827fc454bb8a545939b32964, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _networkSpawn: 1
+  _spawnCount: 300
+  _rollableCubePrefab: {fileID: 1065620569622945213, guid: 70f52d2d172a85c4281b7d4affb8fd4d,
+    type: 3}
+  _originArea: {x: 75, y: 1, z: 20}
+--- !u!4 &2072360821
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2072360818}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 14.962408, y: -7.345955, z: 2.3412132}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1461467837}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2080864845
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2080864848}
+  - component: {fileID: 2080864847}
+  - component: {fileID: 2080864846}
+  m_Layer: 0
+  m_Name: CubeSpawner
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!114 &2080864846
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2080864845}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9b91ecbcc199f4492b9a91e820070131, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sceneId: 3392415150
+  serverOnly: 0
+  visible: 0
+  m_AssetId: 
+  hasSpawned: 0
+--- !u!114 &2080864847
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2080864845}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c51ea269827fc454bb8a545939b32964, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  _networkSpawn: 0
+  _spawnCount: 300
+  _rollableCubePrefab: {fileID: 1065620569622945213, guid: 17ae2e3f8e40d5b489a3d499c46472c4,
+    type: 3}
+  _originArea: {x: 75, y: 1, z: 20}
+--- !u!4 &2080864848
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2080864845}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -1.2785045, y: 3.4053106, z: 0.7444663}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1655311894}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &3403582363303346209
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3403582363303346213}
+  - component: {fileID: 3403582363303346212}
+  - component: {fileID: 3403582363303346211}
+  - component: {fileID: 3403582363303346210}
+  - component: {fileID: 3403582363303346214}
+  m_Layer: 0
+  m_Name: NetworkManager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &3403582363303346210
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3403582363303346209}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6442dc8070ceb41f094e44de0bf87274, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  showGUI: 1
+  offsetX: 0
+  offsetY: 0
+--- !u!114 &3403582363303346211
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3403582363303346209}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c7424c1070fad4ba2a7a96b02fbeb4bb, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  port: 7777
+  NoDelay: 1
+  SendTimeout: 5000
+  ReceiveTimeout: 30000
+  serverMaxMessageSize: 16384
+  serverMaxReceivesPerTick: 10000
+  serverSendQueueLimitPerConnection: 10000
+  serverReceiveQueueLimitPerConnection: 10000
+  clientMaxMessageSize: 16384
+  clientMaxReceivesPerTick: 1000
+  clientSendQueueLimit: 10000
+  clientReceiveQueueLimit: 10000
+--- !u!114 &3403582363303346212
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3403582363303346209}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8aab4c8111b7c411b9b92cf3dbc5bd4e, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  dontDestroyOnLoad: 1
+  PersistNetworkManagerToOfflineScene: 0
+  runInBackground: 1
+  autoStartServerBuild: 1
+  serverTickRate: 30
+  serverBatching: 0
+  serverBatchInterval: 0
+  offlineScene: 
+  onlineScene: 
+  transport: {fileID: 3403582363303346211}
+  networkAddress: localhost
+  maxConnections: 4
+  disconnectInactiveConnections: 0
+  disconnectInactiveTimeout: 60
+  authenticator: {fileID: 0}
+  playerPrefab: {fileID: 3243040657331239809, guid: d8b2672636a669148ab969a446be3a8f,
+    type: 3}
+  autoCreatePlayer: 1
+  playerSpawnMethod: 0
+  spawnPrefabs:
+  - {fileID: 1065620569622945213, guid: 17ae2e3f8e40d5b489a3d499c46472c4, type: 3}
+  - {fileID: 1065620569622945213, guid: 4af99eb1790b48641b3bffb0b5f36f9b, type: 3}
+  - {fileID: 3243040657331239809, guid: d8b2672636a669148ab969a446be3a8f, type: 3}
+--- !u!4 &3403582363303346213
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3403582363303346209}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 3.3669958, y: -26.58159, z: 53.757122}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1655311894}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &3403582363303346214
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3403582363303346209}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 39adc6e09d5544ed955a50ce8600355a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  visRange: 40
+  rebuildInterval: 0.01
+  checkMethod: 0
+  showSlider: 0

+ 1 - 1
Assets/Ignorance/Demo/PongChamp/Demo.unity.meta → Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scenes/FastProximityChecker.unity.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: c63e1eea85874ae43a7fdd723a38741e
+guid: b66830a6c0668734abcea01166f49ebb
 DefaultImporter:
   externalObjects: {}
   userData: 

+ 8 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: acd68d164845ca94d91f29dba4a3b214
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 43 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/AutoMovePlayer.cs

@@ -0,0 +1,43 @@
+using Mirror;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace FirstGearGames.Mirrors.Assets.NetworkProximities.Demos
+{
+
+
+    public class AutoMovePlayer : NetworkBehaviour
+    {
+        public float _moveRate = 22f;
+
+        private float[] _ranges;
+
+        private bool _movingLeft = true;
+
+        private void Awake()
+        {
+            this.enabled = false;
+        }
+
+        public override void OnStartClient()
+        {
+            base.OnStartClient();
+            _ranges = new float[] { transform.position.z - 50f, transform.position.z + 50f };
+            this.enabled = true;
+        }
+
+        // Update is called once per frame
+        void Update()
+        {
+            if (!base.hasAuthority)
+                return;
+            float x = (_movingLeft) ? _ranges[0] : _ranges[1];
+            Vector3 goal = new Vector3(x, transform.position.y, transform.position.z);
+            transform.position = Vector3.MoveTowards(transform.position, goal, _moveRate * Time.deltaTime);
+            if (transform.position == goal)
+                _movingLeft = !_movingLeft;
+        }
+    }
+
+}

+ 11 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/AutoMovePlayer.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 09ea08209d91d76468cc974041aa16c1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 52 - 0
Assets/FirstGearGames/Supporters/Assets/FastProximityChecker/Demo/Scripts/CubeSpawner.cs

@@ -0,0 +1,52 @@
+using Mirror;
+using UnityEngine;
+
+#pragma warning disable CS0618, CS0672, CS0649
+namespace FirstGearGames.Mirrors.Assets.NetworkProximities.Demos
+{
+
+
+    public class CubeSpawner : MonoBehaviour
+    {
+        [SerializeField]
+        private bool _networkSpawn = false;
+        [SerializeField]
+        private int _spawnCount = 100;
+        [SerializeField]
+        private GameObject _rollableCubePrefab;
+        [SerializeField]
+        private Vector3 _originArea;
+
+        private void Awake()
+        {
+            if (!NetworkServer.active && _networkSpawn)
+                return;
+
+            SpawnRollableCubes();
+        }
+
+
+        private void SpawnRollableCubes()
+        {
+            for (int i = 0; i < _spawnCount; i++)
+            {
+                Vector3 offset = new Vector3(
+                    Random.Range(-_originArea.x, _originArea.x),
+                    Random.Range(-_originArea.y, _originArea.y),
+                    Random.Range(-_originArea.z, _originArea.z)
+                    );
+
+                GameObject result = Instantiate(_rollableCubePrefab, transform.position + offset, Quaternion.identity);
+                if (_networkSpawn)
+                    NetworkServer.Spawn(result);
+            }
+        }
+
+        private void OnDrawGizmosSelected()
+        {
+            Gizmos.DrawWireCube(transform.position, _originArea);
+        }
+    }
+
+
+}

Some files were not shown because too many files changed in this diff