Explorar el Código

Inital commit

Axel Nordh hace 3 años
padre
commit
fbea831c30
Se han modificado 100 ficheros con 10143 adiciones y 0 borrados
  1. 156 0
      .gitignore
  2. 100 0
      .vscode/launch.json
  3. 55 0
      .vscode/settings.json
  4. 41 0
      .vscode/tasks.json
  5. 10 0
      Assets/CodeMonkey.meta
  6. 46 0
      Assets/CodeMonkey/Assets.cs
  7. 13 0
      Assets/CodeMonkey/Assets.cs.meta
  8. 10 0
      Assets/CodeMonkey/Assets.meta
  9. BIN
      Assets/CodeMonkey/Assets/Circle.png
  10. 92 0
      Assets/CodeMonkey/Assets/Circle.png.meta
  11. 77 0
      Assets/CodeMonkey/Assets/White_1x1.mat
  12. 10 0
      Assets/CodeMonkey/Assets/White_1x1.mat.meta
  13. BIN
      Assets/CodeMonkey/Assets/White_1x1.png
  14. 104 0
      Assets/CodeMonkey/Assets/White_1x1.png.meta
  15. 173 0
      Assets/CodeMonkey/CMDebug.cs
  16. 13 0
      Assets/CodeMonkey/CMDebug.cs.meta
  17. 10 0
      Assets/CodeMonkey/MonoBehaviours.meta
  18. 117 0
      Assets/CodeMonkey/MonoBehaviours/CameraFollow.cs
  19. 13 0
      Assets/CodeMonkey/MonoBehaviours/CameraFollow.cs.meta
  20. 37 0
      Assets/CodeMonkey/MonoBehaviours/CameraFollowSetup.cs
  21. 13 0
      Assets/CodeMonkey/MonoBehaviours/CameraFollowSetup.cs.meta
  22. 60 0
      Assets/CodeMonkey/MonoBehaviours/ComponentActions.cs
  23. 12 0
      Assets/CodeMonkey/MonoBehaviours/ComponentActions.cs.meta
  24. 51 0
      Assets/CodeMonkey/MonoBehaviours/PositionRendererSorter.cs
  25. 13 0
      Assets/CodeMonkey/MonoBehaviours/PositionRendererSorter.cs.meta
  26. 15 0
      Assets/CodeMonkey/README.txt
  27. 9 0
      Assets/CodeMonkey/README.txt.meta
  28. 10 0
      Assets/CodeMonkey/Resources.meta
  29. 48 0
      Assets/CodeMonkey/Resources/CodeMonkeyAssets.prefab
  30. 10 0
      Assets/CodeMonkey/Resources/CodeMonkeyAssets.prefab.meta
  31. 10 0
      Assets/CodeMonkey/Utils.meta
  32. 212 0
      Assets/CodeMonkey/Utils/Button_Sprite.cs
  33. 12 0
      Assets/CodeMonkey/Utils/Button_Sprite.cs.meta
  34. 228 0
      Assets/CodeMonkey/Utils/Button_UI.cs
  35. 8 0
      Assets/CodeMonkey/Utils/Button_UI.cs.meta
  36. 187 0
      Assets/CodeMonkey/Utils/FunctionPeriodic.cs
  37. 8 0
      Assets/CodeMonkey/Utils/FunctionPeriodic.cs.meta
  38. 183 0
      Assets/CodeMonkey/Utils/FunctionTimer.cs
  39. 8 0
      Assets/CodeMonkey/Utils/FunctionTimer.cs.meta
  40. 157 0
      Assets/CodeMonkey/Utils/FunctionUpdater.cs
  41. 8 0
      Assets/CodeMonkey/Utils/FunctionUpdater.cs.meta
  42. 170 0
      Assets/CodeMonkey/Utils/UI_Bar.cs
  43. 13 0
      Assets/CodeMonkey/Utils/UI_Bar.cs.meta
  44. 104 0
      Assets/CodeMonkey/Utils/UI_BarMultiple.cs
  45. 13 0
      Assets/CodeMonkey/Utils/UI_BarMultiple.cs.meta
  46. 131 0
      Assets/CodeMonkey/Utils/UI_Sprite.cs
  47. 13 0
      Assets/CodeMonkey/Utils/UI_Sprite.cs.meta
  48. 151 0
      Assets/CodeMonkey/Utils/UI_TextComplex.cs
  49. 13 0
      Assets/CodeMonkey/Utils/UI_TextComplex.cs.meta
  50. 1563 0
      Assets/CodeMonkey/Utils/UtilsClass.cs
  51. 13 0
      Assets/CodeMonkey/Utils/UtilsClass.cs.meta
  52. 150 0
      Assets/CodeMonkey/Utils/World_Bar.cs
  53. 13 0
      Assets/CodeMonkey/Utils/World_Bar.cs.meta
  54. 237 0
      Assets/CodeMonkey/Utils/World_Mesh.cs
  55. 13 0
      Assets/CodeMonkey/Utils/World_Mesh.cs.meta
  56. 225 0
      Assets/CodeMonkey/Utils/World_Sprite.cs
  57. 13 0
      Assets/CodeMonkey/Utils/World_Sprite.cs.meta
  58. 8 0
      Assets/Data.meta
  59. 22 0
      Assets/Data/A2D28127-D81C-4749-BA23-1EC1973096E3.asset
  60. 8 0
      Assets/Data/A2D28127-D81C-4749-BA23-1EC1973096E3.asset.meta
  61. 22 0
      Assets/Data/AnotherTestItem.asset
  62. 8 0
      Assets/Data/AnotherTestItem.asset.meta
  63. 22 0
      Assets/Data/TestItem.asset
  64. 8 0
      Assets/Data/TestItem.asset.meta
  65. 8 0
      Assets/Data/UI.meta
  66. 8 0
      Assets/Data/UI/Buildables.meta
  67. 21 0
      Assets/Data/UI/Buildables/Door-1.asset
  68. 8 0
      Assets/Data/UI/Buildables/Door-1.asset.meta
  69. 21 0
      Assets/Data/UI/Buildables/TestDecoration.asset
  70. 8 0
      Assets/Data/UI/Buildables/TestDecoration.asset.meta
  71. 21 0
      Assets/Data/UI/Buildables/TestWall2Size.asset
  72. 8 0
      Assets/Data/UI/Buildables/TestWall2Size.asset.meta
  73. 21 0
      Assets/Data/UI/Buildables/Wall-1.asset
  74. 8 0
      Assets/Data/UI/Buildables/Wall-1.asset.meta
  75. 8 0
      Assets/Data/UI/Menus.meta
  76. 18 0
      Assets/Data/UI/Menus/DecorationsMenu.asset
  77. 8 0
      Assets/Data/UI/Menus/DecorationsMenu.asset.meta
  78. 18 0
      Assets/Data/UI/Menus/WallMenu.asset
  79. 8 0
      Assets/Data/UI/Menus/WallMenu.asset.meta
  80. 8 0
      Assets/GridBuildingSystem.meta
  81. 1748 0
      Assets/GridBuildingSystem/GameScene_GridBuildingSystem2D.unity
  82. 9 0
      Assets/GridBuildingSystem/GameScene_GridBuildingSystem2D.unity.meta
  83. 1659 0
      Assets/GridBuildingSystem/GameScene_GridBuildingSystem3D.unity
  84. 9 0
      Assets/GridBuildingSystem/GameScene_GridBuildingSystem3D.unity.meta
  85. 8 0
      Assets/GridBuildingSystem/Materials.meta
  86. 129 0
      Assets/GridBuildingSystem/Materials/Anchor.mat
  87. 8 0
      Assets/GridBuildingSystem/Materials/Anchor.mat.meta
  88. 129 0
      Assets/GridBuildingSystem/Materials/Ghost.mat
  89. 8 0
      Assets/GridBuildingSystem/Materials/Ghost.mat.meta
  90. 129 0
      Assets/GridBuildingSystem/Materials/Grey.mat
  91. 8 0
      Assets/GridBuildingSystem/Materials/Grey.mat.meta
  92. 129 0
      Assets/GridBuildingSystem/Materials/GreyTransparent.mat
  93. 8 0
      Assets/GridBuildingSystem/Materials/GreyTransparent.mat.meta
  94. 8 0
      Assets/GridBuildingSystem/Prefabs.meta
  95. 8 0
      Assets/GridBuildingSystem/Prefabs/Visuals.meta
  96. 220 0
      Assets/GridBuildingSystem/Prefabs/Visuals/BuildingVisual.prefab
  97. 7 0
      Assets/GridBuildingSystem/Prefabs/Visuals/BuildingVisual.prefab.meta
  98. 220 0
      Assets/GridBuildingSystem/Prefabs/Visuals/FireStationVisual.prefab
  99. 7 0
      Assets/GridBuildingSystem/Prefabs/Visuals/FireStationVisual.prefab.meta
  100. 220 0
      Assets/GridBuildingSystem/Prefabs/Visuals/GasStationVisual.prefab

+ 156 - 0
.gitignore

@@ -0,0 +1,156 @@
+ Axel / RPG-FIGHT
+
+
+.gitignore 1.3 KB
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+# This .gitignore file should be placed at the root of your Unity project directory
+#
+# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
+#
+/[Ll]ibrary/
+/[Tt]emp/
+/[Oo]bj/
+/[Bb]uild/
+/[Bb]uilds/
+/[Ll]ogs/
+/[Uu]ser[Ss]ettings/
+
+# MemoryCaptures can get excessive in size.
+# They also could contain extremely sensitive data
+/[Mm]emoryCaptures/
+
+# Recordings can get excessive in size
+/[Rr]ecordings/
+
+# Uncomment this line if you wish to ignore the asset store tools plugin
+# /[Aa]ssets/AssetStoreTools*
+
+# Autogenerated Jetbrains Rider plugin
+/[Aa]ssets/Plugins/Editor/JetBrains*
+
+# Visual Studio cache directory
+.vs/
+
+# Gradle cache directory
+.gradle/
+
+# Autogenerated VS/MD/Consulo solution and project files
+ExportedObj/
+.consulo/
+*.csproj
+*.unityproj
+*.sln
+*.suo
+*.tmp
+*.user
+*.userprefs
+*.pidb
+*.booproj
+*.svd
+*.pdb
+*.mdb
+*.opendb
+*.VC.db
+
+# Unity3D generated meta files
+*.pidb.meta
+*.pdb.meta
+*.mdb.meta
+
+# Unity3D generated file on crash reports
+sysinfo.txt
+
+# Builds
+*.apk
+*.aab
+*.unitypackage
+*.app
+
+# Crashlytics generated file
+crashlytics-build.properties
+
+# Packed Addressables
+/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
+
+# Temporary auto-generated Android Assets
+/[Aa]ssets/[Ss]treamingAssets/aa.meta
+/[Aa]ssets/[Ss]treamingAssets/aa/*
+
+# SONAR
+.scannerwork/
+© 2022 GogsPage: 27ms Template: 0ms  English Website

+ 100 - 0
.vscode/launch.json

@@ -0,0 +1,100 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Unity Editor",
+            "type": "unity",
+            "path": "/F:/Unity/Projects/RoomBuilder/Library/EditorInstance.json",
+            "request": "launch"
+        },
+        {
+            "name": "Windows Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "OSX Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Linux Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "iOS Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Android Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Xbox One Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "PS4 Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "SwitchPlayer",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Unity Editor",
+            "type": "unity",
+            "path": "/F:/Unity/Projects/RoomBuilder/Library/EditorInstance.json",
+            "request": "launch"
+        },
+        {
+            "name": "Windows Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "OSX Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Linux Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "iOS Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Android Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "Xbox One Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "PS4 Player",
+            "type": "unity",
+            "request": "launch"
+        },
+        {
+            "name": "SwitchPlayer",
+            "type": "unity",
+            "request": "launch"
+        }
+    ]
+}

+ 55 - 0
.vscode/settings.json

@@ -0,0 +1,55 @@
+{
+    "files.exclude":
+    {
+        "**/.DS_Store":true,
+        "**/.git":true,
+        "**/.gitmodules":true,
+        "**/*.booproj":true,
+        "**/*.pidb":true,
+        "**/*.suo":true,
+        "**/*.user":true,
+        "**/*.userprefs":true,
+        "**/*.unityproj":true,
+        "**/*.dll":true,
+        "**/*.exe":true,
+        "**/*.pdf":true,
+        "**/*.mid":true,
+        "**/*.midi":true,
+        "**/*.wav":true,
+        "**/*.gif":true,
+        "**/*.ico":true,
+        "**/*.jpg":true,
+        "**/*.jpeg":true,
+        "**/*.png":true,
+        "**/*.psd":true,
+        "**/*.tga":true,
+        "**/*.tif":true,
+        "**/*.tiff":true,
+        "**/*.3ds":true,
+        "**/*.3DS":true,
+        "**/*.fbx":true,
+        "**/*.FBX":true,
+        "**/*.lxo":true,
+        "**/*.LXO":true,
+        "**/*.ma":true,
+        "**/*.MA":true,
+        "**/*.obj":true,
+        "**/*.OBJ":true,
+        "**/*.asset":true,
+        "**/*.cubemap":true,
+        "**/*.flare":true,
+        "**/*.mat":true,
+        "**/*.meta":true,
+        "**/*.prefab":true,
+        "**/*.unity":true,
+        "build/":true,
+        "Build/":true,
+        "Library/":true,
+        "library/":true,
+        "obj/":true,
+        "Obj/":true,
+        "ProjectSettings/":true,
+        "temp/":true,
+        "Temp/":true
+    }
+}

+ 41 - 0
.vscode/tasks.json

@@ -0,0 +1,41 @@
+{
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "label": "build",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "build",
+                "${workspaceFolder}/Assembly-CSharp.csproj",
+                "/property:GenerateFullPaths=true",
+                "/consoleloggerparameters:NoSummary"
+            ],
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "publish",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "publish",
+                "${workspaceFolder}/Assembly-CSharp.csproj",
+                "/property:GenerateFullPaths=true",
+                "/consoleloggerparameters:NoSummary"
+            ],
+            "problemMatcher": "$msCompile"
+        },
+        {
+            "label": "watch",
+            "command": "dotnet",
+            "type": "process",
+            "args": [
+                "watch",
+                "run",
+                "--project",
+                "${workspaceFolder}/Assembly-CSharp.csproj"
+            ],
+            "problemMatcher": "$msCompile"
+        }
+    ]
+}

+ 10 - 0
Assets/CodeMonkey.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 16b451a71f8c5644886a3d83a5a80de7
+folderAsset: yes
+timeCreated: 1523804043
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 46 - 0
Assets/CodeMonkey/Assets.cs

@@ -0,0 +1,46 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace CodeMonkey {
+
+    /*
+     * Global Asset references
+     * Edit Asset references in the prefab CodeMonkey/Resources/CodeMonkeyAssets
+     * */
+    public class Assets : MonoBehaviour {
+
+        // Internal instance reference
+        private static Assets _i; 
+
+        // Instance reference
+        public static Assets i {
+            get {
+                if (_i == null) _i = Instantiate(Resources.Load<Assets>("CodeMonkeyAssets")); 
+                return _i; 
+            }
+        }
+
+
+        // All references
+        
+        public Sprite s_White;
+        public Sprite s_Circle;
+
+        public Material m_White;
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Assets.cs.meta

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

+ 10 - 0
Assets/CodeMonkey/Assets.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 87d70cfb1e610ac4dadb3551cb1dc28b
+folderAsset: yes
+timeCreated: 1524395615
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/CodeMonkey/Assets/Circle.png


+ 92 - 0
Assets/CodeMonkey/Assets/Circle.png.meta

@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: a0e35f6b808bb7447826cc6c69ffe448
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 77 - 0
Assets/CodeMonkey/Assets/White_1x1.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: White_1x1
+  m_Shader: {fileID: 10752, 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: 2800000, guid: 170577bce7cbda144b82578f81308d23, type: 3}
+        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}

+ 10 - 0
Assets/CodeMonkey/Assets/White_1x1.mat.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 7d5e8e2c082a4c44a9abd7d650cf0a15
+timeCreated: 1527582754
+licenseType: Pro
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/CodeMonkey/Assets/White_1x1.png


+ 104 - 0
Assets/CodeMonkey/Assets/White_1x1.png.meta

@@ -0,0 +1,104 @@
+fileFormatVersion: 2
+guid: 170577bce7cbda144b82578f81308d23
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: -1
+    aniso: -1
+    mipBias: -100
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 0
+  spriteMeshType: 0
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 1
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 173 - 0
Assets/CodeMonkey/CMDebug.cs

@@ -0,0 +1,173 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+using CodeMonkey.Utils;
+
+namespace CodeMonkey {
+
+    /*
+     * Debug Class with various helper functions to quickly create buttons, text, etc
+     * */
+    public static class CMDebug {
+
+        // Creates a Button in the World
+        public static World_Sprite Button(Transform parent, Vector3 localPosition, string text, System.Action ClickFunc, int fontSize = 30, float paddingX = 5, float paddingY = 5) {
+            return World_Sprite.CreateDebugButton(parent, localPosition, text, ClickFunc, fontSize, paddingX, paddingY);
+        }
+
+        // Creates a Button in the UI
+        public static UI_Sprite ButtonUI(Vector2 anchoredPosition, string text, Action ClickFunc) {
+            return UI_Sprite.CreateDebugButton(anchoredPosition, text, ClickFunc);
+        }
+
+        public static UI_Sprite ButtonUI(Transform parent, Vector2 anchoredPosition, string text, Action ClickFunc) {
+            return UI_Sprite.CreateDebugButton(parent, anchoredPosition, text, ClickFunc);
+        }
+
+        // Creates a World Text object at the world position
+        public static void Text(string text, Vector3 localPosition = default(Vector3), Transform parent = null, int fontSize = 40, Color? color = null, TextAnchor textAnchor = TextAnchor.UpperLeft, TextAlignment textAlignment = TextAlignment.Left, int sortingOrder = UtilsClass.sortingOrderDefault) {
+            UtilsClass.CreateWorldText(text, parent, localPosition, fontSize, color, textAnchor, textAlignment, sortingOrder);
+        }
+        
+        // World text pop up at mouse position
+        public static void TextPopupMouse(string text, Vector3? offset = null) {
+            if (offset == null) {
+                offset = Vector3.one;
+            }
+            UtilsClass.CreateWorldTextPopup(text, UtilsClass.GetMouseWorldPosition() + (Vector3)offset);
+        }
+
+        // World text pop up at mouse position
+        public static void TextPopupMouse(object obj, Vector3? offset = null) {
+            TextPopupMouse(obj.ToString(), offset);
+        }
+
+        // Creates a Text pop up at the world position
+        public static void TextPopup(string text, Vector3 position, float popupTime = 1f) {
+            UtilsClass.CreateWorldTextPopup(text, position, popupTime);
+        }
+
+        // Text Updater in World, (parent == null) = world position
+        public static FunctionUpdater TextUpdater(Func<string> GetTextFunc, Vector3 localPosition, Transform parent = null, int fontSize = 40, Color? color = null, TextAnchor textAnchor = TextAnchor.UpperLeft, TextAlignment textAlignment = TextAlignment.Left, int sortingOrder = UtilsClass.sortingOrderDefault) {
+            return UtilsClass.CreateWorldTextUpdater(GetTextFunc, localPosition, parent, fontSize, color, textAnchor, textAlignment, sortingOrder);
+        }
+
+        // Text Updater in UI
+        public static FunctionUpdater TextUpdaterUI(Func<string> GetTextFunc, Vector2 anchoredPosition) {
+            return UtilsClass.CreateUITextUpdater(GetTextFunc, anchoredPosition);
+        }
+
+        // Text Updater always following mouse
+        public static void MouseTextUpdater(Func<string> GetTextFunc, Vector3 positionOffset = default(Vector3)) {
+            GameObject gameObject = new GameObject();
+            FunctionUpdater.Create(() => {
+                gameObject.transform.position = UtilsClass.GetMouseWorldPosition() + positionOffset;
+                return false;
+            });
+            TextUpdater(GetTextFunc, Vector3.zero, gameObject.transform);
+        }
+
+        // Trigger Action on Key
+        public static FunctionUpdater KeyCodeAction(KeyCode keyCode, Action onKeyDown) {
+            return UtilsClass.CreateKeyCodeAction(keyCode, onKeyDown);
+        }
+        
+
+
+        // Debug DrawLine to draw a projectile, turn Gizmos On
+        public static void DebugProjectile(Vector3 from, Vector3 to, float speed, float projectileSize) {
+            Vector3 dir = (to - from).normalized;
+            Vector3 pos = from;
+            FunctionUpdater.Create(() => {
+                Debug.DrawLine(pos, pos + dir * projectileSize);
+                float distanceBefore = Vector3.Distance(pos, to);
+                pos += dir * speed * Time.deltaTime;
+                float distanceAfter = Vector3.Distance(pos, to);
+                if (distanceBefore < distanceAfter) {
+                    return true;
+                }
+                return false;
+            });
+        }
+
+
+
+        public static void SpritePopupMouse(Sprite sprite, float scale = 1f) {
+            SpritePopup(UtilsClass.GetMouseWorldPosition(), sprite, scale);
+        }
+
+
+        public static void SpritePopup(Vector3 position, Sprite sprite, float scale) {
+            float popupTime = 1f;
+            GameObject gameObject = DrawSpriteTimedAlpha(position, sprite, scale, popupTime);
+
+            Vector3 finalPopupPosition = position + new Vector3(0, 1, 0) * 20f;
+            Transform transform = gameObject.transform;
+            Vector3 moveAmount = (finalPopupPosition - position) / popupTime;
+
+            FunctionUpdater.Create(delegate () {
+                if (gameObject == null) {
+                    return true;
+                }
+                transform.position += moveAmount * Time.unscaledDeltaTime;
+                return false;
+            }, "SpritePopup");
+        }
+
+        public static GameObject DrawSpriteTimed(Sprite sprite, float scale, float timer) {
+            return DrawSpriteTimed(UtilsClass.GetMouseWorldPosition(), sprite, scale, timer);
+        }
+
+        public static GameObject DrawSpriteTimed(Vector3 position, Sprite sprite, float scale, float timer) {
+            GameObject gameObject = new GameObject("SpriteTimed", typeof(SpriteRenderer));
+            gameObject.transform.position = position;
+            gameObject.transform.localScale = Vector3.one * scale;
+            gameObject.GetComponent<SpriteRenderer>().sprite = sprite;
+
+            GameObject.Destroy(gameObject, timer);
+
+            return gameObject;
+        }
+
+        public static GameObject DrawSpriteTimedAlpha(Sprite sprite, float scale, float timer, float startDecayTimeNormalized = .8f) {
+            return DrawSpriteTimedAlpha(UtilsClass.GetMouseWorldPosition(), sprite, scale, timer, startDecayTimeNormalized);
+        }
+
+        public static GameObject DrawSpriteTimedAlpha(Vector3 position, Sprite sprite, float scale, float timer, float startDecayTimeNormalized = .8f) {
+            GameObject gameObject = DrawSpriteTimed(position, sprite, scale, timer);
+
+            SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
+
+            float startAlphaDecayTime = timer * startDecayTimeNormalized;
+            float totalAlphaDecayTime = timer - startAlphaDecayTime;
+            float currentTime = 0f;
+
+            FunctionUpdater.Create(() => {
+                if (gameObject == null) {
+                    return true;
+                }
+                currentTime += Time.unscaledDeltaTime;
+                if (currentTime >= startAlphaDecayTime) {
+                    spriteRenderer.color = new Color(1, 1, 1, Mathf.Lerp(1f, 0f, 1 - ((timer - currentTime) / totalAlphaDecayTime)));
+                }
+                return false;
+            });
+
+            return gameObject;
+        }
+
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/CMDebug.cs.meta

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

+ 10 - 0
Assets/CodeMonkey/MonoBehaviours.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 5abf4c77cbf61d94995a40be42eeaee0
+folderAsset: yes
+timeCreated: 1527582733
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 117 - 0
Assets/CodeMonkey/MonoBehaviours/CameraFollow.cs

@@ -0,0 +1,117 @@
+/* 
+    ------------------- Code Monkey -------------------
+    
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+ 
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace CodeMonkey.MonoBehaviours {
+
+    /*
+     * Script to handle Camera Movement and Zoom
+     * Place on Camera GameObject
+     * */
+    public class CameraFollow : MonoBehaviour {
+
+        public static CameraFollow Instance { get; private set; }
+
+        private Camera myCamera;
+        private Func<Vector3> GetCameraFollowPositionFunc;
+        private Func<float> GetCameraZoomFunc;
+
+        public void Setup(Func<Vector3> GetCameraFollowPositionFunc, Func<float> GetCameraZoomFunc, bool teleportToFollowPosition, bool instantZoom) {
+            this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
+            this.GetCameraZoomFunc = GetCameraZoomFunc;
+
+            if (teleportToFollowPosition) {
+                Vector3 cameraFollowPosition = GetCameraFollowPositionFunc();
+                cameraFollowPosition.z = transform.position.z;
+                transform.position = cameraFollowPosition;
+            }
+
+            if (instantZoom) {
+                myCamera.orthographicSize = GetCameraZoomFunc();
+            }
+        }
+
+        private void Awake() {
+            Instance = this;
+            myCamera = transform.GetComponent<Camera>();
+        }
+
+        public void SetCameraFollowPosition(Vector3 cameraFollowPosition) {
+            SetGetCameraFollowPositionFunc(() => cameraFollowPosition);
+        }
+
+        public void SetGetCameraFollowPositionFunc(Func<Vector3> GetCameraFollowPositionFunc) {
+            this.GetCameraFollowPositionFunc = GetCameraFollowPositionFunc;
+        }
+
+        public void SetCameraZoom(float cameraZoom) {
+            SetGetCameraZoomFunc(() => cameraZoom);
+        }
+
+        public void SetGetCameraZoomFunc(Func<float> GetCameraZoomFunc) {
+            this.GetCameraZoomFunc = GetCameraZoomFunc;
+        }
+
+
+        private void Update() {
+            HandleMovement();
+            HandleZoom();
+        }
+
+        private void HandleMovement() {
+            if (GetCameraFollowPositionFunc == null) return;
+            Vector3 cameraFollowPosition = GetCameraFollowPositionFunc();
+            cameraFollowPosition.z = transform.position.z;
+
+            Vector3 cameraMoveDir = (cameraFollowPosition - transform.position).normalized;
+            float distance = Vector3.Distance(cameraFollowPosition, transform.position);
+            float cameraMoveSpeed = 3f;
+
+            if (distance > 0) {
+                Vector3 newCameraPosition = transform.position + cameraMoveDir * distance * cameraMoveSpeed * Time.deltaTime;
+
+                float distanceAfterMoving = Vector3.Distance(newCameraPosition, cameraFollowPosition);
+
+                if (distanceAfterMoving > distance) {
+                    // Overshot the target
+                    newCameraPosition = cameraFollowPosition;
+                }
+
+                transform.position = newCameraPosition;
+            }
+        }
+
+        private void HandleZoom() {
+            if (GetCameraZoomFunc == null) return;
+            float cameraZoom = GetCameraZoomFunc();
+
+            float cameraZoomDifference = cameraZoom - myCamera.orthographicSize;
+            float cameraZoomSpeed = 1f;
+
+            myCamera.orthographicSize += cameraZoomDifference * cameraZoomSpeed * Time.deltaTime;
+
+            if (cameraZoomDifference > 0) {
+                if (myCamera.orthographicSize > cameraZoom) {
+                    myCamera.orthographicSize = cameraZoom;
+                }
+            } else {
+                if (myCamera.orthographicSize < cameraZoom) {
+                    myCamera.orthographicSize = cameraZoom;
+                }
+            }
+        }
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/MonoBehaviours/CameraFollow.cs.meta

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

+ 37 - 0
Assets/CodeMonkey/MonoBehaviours/CameraFollowSetup.cs

@@ -0,0 +1,37 @@
+/* 
+    ------------------- Code Monkey -------------------
+    
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+ 
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace CodeMonkey.MonoBehaviours {
+
+    /*
+     * Easy set up for CameraFollow, it will follow the transform with zoom
+     * */
+    public class CameraFollowSetup : MonoBehaviour {
+
+        [SerializeField] private CameraFollow cameraFollow = null;
+        [SerializeField] private Transform followTransform = null;
+        [SerializeField] private float zoom = 50f;
+
+        private void Start() {
+            if (followTransform == null) {
+                Debug.LogError("followTransform is null! Intended?");
+                cameraFollow.Setup(() => Vector3.zero, () => zoom, true, true);
+            } else {
+                cameraFollow.Setup(() => followTransform.position, () => zoom, true, true);
+            }
+        }
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/MonoBehaviours/CameraFollowSetup.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 31e947e7eb3216d40b72c592fa6847a3
+timeCreated: 1527867131
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 60 - 0
Assets/CodeMonkey/MonoBehaviours/ComponentActions.cs

@@ -0,0 +1,60 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+
+namespace CodeMonkey.MonoBehaviours {
+
+    /*
+     * Trigger Actions on MonoBehaviour Component events
+     * */
+    public class ComponentActions : MonoBehaviour {
+
+        public Action OnDestroyFunc;
+        public Action OnEnableFunc;
+        public Action OnDisableFunc;
+        public Action OnUpdate;
+
+        private void OnDestroy() {
+            if (OnDestroyFunc != null) OnDestroyFunc();
+        }
+
+        private void OnEnable() {
+            if (OnEnableFunc != null) OnEnableFunc();
+        }
+
+        private void OnDisable() {
+            if (OnDisableFunc != null) OnDisableFunc();
+        }
+
+        private void Update() {
+            if (OnUpdate != null) OnUpdate();
+        }
+
+
+        public static void CreateComponent(Action OnDestroyFunc = null, Action OnEnableFunc = null, Action OnDisableFunc = null, Action OnUpdate = null) {
+            GameObject gameObject = new GameObject("ComponentActions");
+            AddComponent(gameObject, OnDestroyFunc, OnEnableFunc, OnDisableFunc, OnUpdate);
+        }
+
+        public static void AddComponent(GameObject gameObject, Action OnDestroyFunc = null, Action OnEnableFunc = null, Action OnDisableFunc = null, Action OnUpdate = null) {
+            ComponentActions componentFuncs = gameObject.AddComponent<ComponentActions>();
+            componentFuncs.OnDestroyFunc = OnDestroyFunc;
+            componentFuncs.OnEnableFunc = OnEnableFunc;
+            componentFuncs.OnDisableFunc = OnDisableFunc;
+            componentFuncs.OnUpdate = OnUpdate;
+        }
+
+    }
+
+}

+ 12 - 0
Assets/CodeMonkey/MonoBehaviours/ComponentActions.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cb3e855e7fda2944b91078893f9e8fd8
+timeCreated: 1511794191
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 51 - 0
Assets/CodeMonkey/MonoBehaviours/PositionRendererSorter.cs

@@ -0,0 +1,51 @@
+/* 
+    ------------------- Code Monkey -------------------
+    
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+ 
+using UnityEngine;
+
+namespace CodeMonkey.MonoBehaviours {
+
+    /*
+     * Automatically sort a Renderer (SpriteRenderer, MeshRenderer) based on his Y position
+     * */
+    public class PositionRendererSorter : MonoBehaviour {
+
+        [SerializeField] private int sortingOrderBase = 5000; // This number should be higher than what any of your sprites will be on the position.y
+        [SerializeField] private int offset = 0;
+        [SerializeField] private bool runOnlyOnce = false;
+
+        private float timer;
+        private float timerMax = .1f;
+        private Renderer myRenderer;
+
+        private void Awake() {
+            myRenderer = gameObject.GetComponent<Renderer>();
+        }
+
+        private void LateUpdate() {
+            timer -= Time.deltaTime;
+            if (timer <= 0f) {
+                timer = timerMax;
+                myRenderer.sortingOrder = (int)(sortingOrderBase - transform.position.y - offset);
+                if (runOnlyOnce) {
+                    Destroy(this);
+                }
+            }
+        }
+
+        public void SetOffset(int offset) {
+            this.offset = offset;
+        }
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/MonoBehaviours/PositionRendererSorter.cs.meta

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

+ 15 - 0
Assets/CodeMonkey/README.txt

@@ -0,0 +1,15 @@
+------------------- Code Monkey -------------------
+
+Thank you for downloading the Code Monkey Utilities
+I hope you find them useful in your projects
+If you have any questions use the contact form
+Cheers!
+
+           unitycodemonkey.com
+--------------------------------------------------
+
+Version: 1.03
+Date: 06-02-2021
+
+Version: 1.02
+Date: 01-06-2018

+ 9 - 0
Assets/CodeMonkey/README.txt.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f59bf2b41588bd44780fc5218f7864e1
+timeCreated: 1526276062
+licenseType: Pro
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 10 - 0
Assets/CodeMonkey/Resources.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 9c480003fd87d3548ae91e921a89a579
+folderAsset: yes
+timeCreated: 1524394058
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 48 - 0
Assets/CodeMonkey/Resources/CodeMonkeyAssets.prefab

@@ -0,0 +1,48 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1010336202903800
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4240258222200348}
+  - component: {fileID: 114165315123428144}
+  m_Layer: 0
+  m_Name: CodeMonkeyAssets
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4240258222200348
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1010336202903800}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 991.20996, y: 137.51582, z: 149.5}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &114165315123428144
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1010336202903800}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: eda7ff5f6e8175c4da119ea9ed256f6d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  s_White: {fileID: 21300000, guid: 170577bce7cbda144b82578f81308d23, type: 3}
+  s_Circle: {fileID: 21300000, guid: a0e35f6b808bb7447826cc6c69ffe448, type: 3}
+  m_White: {fileID: 2100000, guid: 7d5e8e2c082a4c44a9abd7d650cf0a15, type: 2}

+ 10 - 0
Assets/CodeMonkey/Resources/CodeMonkeyAssets.prefab.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 6cb9ffb1fe7e89d4a890b91c62fa7e8b
+timeCreated: 1524393897
+licenseType: Pro
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 100100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 10 - 0
Assets/CodeMonkey/Utils.meta

@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: d900c58c01968cd42bb98e37d8e4d05c
+folderAsset: yes
+timeCreated: 1524300187
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 212 - 0
Assets/CodeMonkey/Utils/Button_Sprite.cs

@@ -0,0 +1,212 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+ 
+//#define SOUND_MANAGER // Has Sound_Manager in project
+//#define CURSOR_MANAGER // Has Cursor_Manager in project
+
+using System;
+using UnityEngine;
+using System.Collections.Generic;
+using UnityEngine.EventSystems;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Button Actions on a World BoxCollider
+     * */
+    public class Button_Sprite : MonoBehaviour {
+
+        private static Func<Camera> GetWorldCamera;
+
+        public static void SetGetWorldCamera(Func<Camera> GetWorldCamera) {
+            Button_Sprite.GetWorldCamera = GetWorldCamera;
+        }
+
+
+
+
+
+        public Action ClickFunc = null;
+        public Action MouseRightDownOnceFunc = null;
+        public Action MouseRightDownFunc = null;
+        public Action MouseRightUpFunc = null;
+        public Action MouseDownOnceFunc = null;
+        public Action MouseUpOnceFunc = null;
+        public Action MouseOverOnceFunc = null;
+        public Action MouseOutOnceFunc = null;
+        public Action MouseOverOnceTooltipFunc = null;
+        public Action MouseOutOnceTooltipFunc = null;
+
+        private bool draggingMouseRight;
+        private Vector3 mouseRightDragStart;
+        public Action<Vector3, Vector3> MouseRightDragFunc = null;
+        public Action<Vector3, Vector3> MouseRightDragUpdateFunc = null;
+        public bool triggerMouseRightDragOnEnter = false;
+
+        public enum HoverBehaviour {
+            Custom,
+            Change_Color,
+            Change_Image,
+            Change_SetActive,
+        }
+        public HoverBehaviour hoverBehaviourType = HoverBehaviour.Custom;
+        private Action hoverBehaviourFunc_Enter, hoverBehaviourFunc_Exit;
+
+        public Color hoverBehaviour_Color_Enter = new Color(1, 1, 1, 1), hoverBehaviour_Color_Exit = new Color(1, 1, 1, 1);
+        public SpriteRenderer hoverBehaviour_Image;
+        public Sprite hoverBehaviour_Sprite_Exit, hoverBehaviour_Sprite_Enter;
+        public bool hoverBehaviour_Move = false;
+        public Vector2 hoverBehaviour_Move_Amount = Vector2.zero;
+        private Vector3 posExit, posEnter;
+        public bool triggerMouseOutFuncOnClick = false;
+        public bool clickThroughUI = false;
+
+        private Action internalOnMouseDownFunc = null, internalOnMouseEnterFunc = null, internalOnMouseExitFunc = null;
+
+#if SOUND_MANAGER
+        public Sound_Manager.Sound mouseOverSound, mouseClickSound;
+#endif
+#if CURSOR_MANAGER
+        public CursorManager.CursorType cursorMouseOver, cursorMouseOut;
+#endif
+
+
+
+
+        public void SetHoverBehaviourChangeColor(Color colorOver, Color colorOut) {
+            hoverBehaviourType = HoverBehaviour.Change_Color;
+            hoverBehaviour_Color_Enter = colorOver;
+            hoverBehaviour_Color_Exit = colorOut;
+            if (hoverBehaviour_Image == null) hoverBehaviour_Image = transform.GetComponent<SpriteRenderer>();
+            hoverBehaviour_Image.color = hoverBehaviour_Color_Exit;
+            SetupHoverBehaviour();
+        }
+        void OnMouseDown() {
+            if (!clickThroughUI && IsPointerOverUI()) return; // Over UI!
+
+            if (internalOnMouseDownFunc != null) internalOnMouseDownFunc();
+            if (ClickFunc != null) ClickFunc();
+            if (MouseDownOnceFunc != null) MouseDownOnceFunc();
+            if (triggerMouseOutFuncOnClick) OnMouseExit();
+        }
+        public void Manual_OnMouseExit() {
+            OnMouseExit();
+        }
+        void OnMouseUp() {
+            if (MouseUpOnceFunc != null) MouseUpOnceFunc();
+        }
+        void OnMouseEnter() {
+            if (!clickThroughUI && IsPointerOverUI()) return; // Over UI!
+            
+            if (internalOnMouseEnterFunc != null) internalOnMouseEnterFunc();
+            if (hoverBehaviour_Move) transform.localPosition = posEnter;
+            if (hoverBehaviourFunc_Enter != null) hoverBehaviourFunc_Enter();
+            if (MouseOverOnceFunc != null) MouseOverOnceFunc();
+            if (MouseOverOnceTooltipFunc != null) MouseOverOnceTooltipFunc();
+        }
+        void OnMouseExit() {
+            if (internalOnMouseExitFunc != null) internalOnMouseExitFunc();
+            if (hoverBehaviour_Move) transform.localPosition = posExit;
+            if (hoverBehaviourFunc_Exit != null) hoverBehaviourFunc_Exit();
+            if (MouseOutOnceFunc != null) MouseOutOnceFunc();
+            if (MouseOutOnceTooltipFunc != null) MouseOutOnceTooltipFunc();
+        }
+
+        void OnMouseOver() {
+            if (!clickThroughUI && IsPointerOverUI()) return; // Over UI!
+
+            if (Input.GetMouseButton(1)) {
+                if (MouseRightDownFunc != null) MouseRightDownFunc();
+                if (!draggingMouseRight && triggerMouseRightDragOnEnter) {
+                    draggingMouseRight = true;
+                    mouseRightDragStart = GetWorldPositionFromUI();
+                }
+            }
+            if (Input.GetMouseButtonDown(1)) {
+                draggingMouseRight = true;
+                mouseRightDragStart = GetWorldPositionFromUI();
+                if (MouseRightDownOnceFunc != null) MouseRightDownOnceFunc();
+            }
+        }
+        void Update() {
+            if (draggingMouseRight) {
+                if (MouseRightDragUpdateFunc != null) MouseRightDragUpdateFunc(mouseRightDragStart, GetWorldPositionFromUI());
+            }
+            if (Input.GetMouseButtonUp(1)) {
+                if (draggingMouseRight) {
+                    draggingMouseRight = false;
+                    if (MouseRightDragFunc != null) MouseRightDragFunc(mouseRightDragStart, GetWorldPositionFromUI());
+                }
+                if (MouseRightUpFunc != null) MouseRightUpFunc();
+            }
+        }
+
+
+        void Awake() {
+            if (GetWorldCamera == null) SetGetWorldCamera(() => Camera.main); // Set default World Camera
+            posExit = transform.localPosition;
+            posEnter = transform.localPosition + (Vector3)hoverBehaviour_Move_Amount;
+            SetupHoverBehaviour();
+
+#if SOUND_MANAGER
+            // Sound Manager
+            internalOnMouseDownFunc += () => { if (mouseClickSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseClickSound); };
+            internalOnMouseEnterFunc += () => { if (mouseOverSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseOverSound); };
+#endif
+
+#if CURSOR_MANAGER
+            // Cursor Manager
+            internalOnMouseExitFunc += () => { if (cursorMouseOut != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOut); };
+            internalOnMouseEnterFunc += () => { if (cursorMouseOver != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOver); };
+#endif
+        }
+        private void SetupHoverBehaviour() {
+            switch (hoverBehaviourType) {
+            case HoverBehaviour.Change_Color:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Enter; };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Exit; };
+                break;
+            case HoverBehaviour.Change_Image:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Enter; };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Exit; };
+                break;
+            case HoverBehaviour.Change_SetActive:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.gameObject.SetActive(true); };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.gameObject.SetActive(false); };
+                break;
+            }
+        }
+
+
+
+
+
+
+
+        private static Vector3 GetWorldPositionFromUI() {
+            Vector3 worldPosition = GetWorldCamera().ScreenToWorldPoint(Input.mousePosition);
+            return worldPosition;
+        }
+        private static bool IsPointerOverUI() {
+            if (EventSystem.current.IsPointerOverGameObject()) {
+                return true;
+            } else {
+                PointerEventData pe = new PointerEventData(EventSystem.current);
+                pe.position = Input.mousePosition;
+                List<RaycastResult> hits = new List<RaycastResult>();
+                EventSystem.current.RaycastAll(pe, hits);
+                return hits.Count > 0;
+            }
+        }
+    }
+
+}

+ 12 - 0
Assets/CodeMonkey/Utils/Button_Sprite.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4771330f098d1db4898ad07204154d04
+timeCreated: 1513255758
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 228 - 0
Assets/CodeMonkey/Utils/Button_UI.cs

@@ -0,0 +1,228 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+ 
+//#define SOUND_MANAGER // Has Sound_Manager in project
+//#define CURSOR_MANAGER // Has Cursor_Manager in project
+
+using System;
+using UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.EventSystems;
+
+namespace CodeMonkey.Utils {
+    
+    /*
+     * Button in the UI
+     * */
+    public class Button_UI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler {
+
+        public Action ClickFunc = null;
+        public Action MouseRightClickFunc = null;
+        public Action MouseMiddleClickFunc = null;
+        public Action MouseDownOnceFunc = null;
+        public Action MouseUpFunc = null;
+        public Action MouseOverOnceTooltipFunc = null;
+        public Action MouseOutOnceTooltipFunc = null;
+        public Action MouseOverOnceFunc = null;
+        public Action MouseOutOnceFunc = null;
+        public Action MouseOverFunc = null;
+        public Action MouseOverPerSecFunc = null; //Triggers every sec if mouseOver
+        public Action MouseUpdate = null;
+        public Action<PointerEventData> OnPointerClickFunc;
+
+        public enum HoverBehaviour {
+            Custom,
+            Change_Color,
+            Change_Color_Auto,
+            Change_Image,
+            Change_SetActive,
+        }
+        public HoverBehaviour hoverBehaviourType = HoverBehaviour.Custom;
+        private Action hoverBehaviourFunc_Enter, hoverBehaviourFunc_Exit;
+
+        public Color hoverBehaviour_Color_Enter, hoverBehaviour_Color_Exit;
+        public Image hoverBehaviour_Image;
+        public Sprite hoverBehaviour_Sprite_Exit, hoverBehaviour_Sprite_Enter;
+        public bool hoverBehaviour_Move = false;
+        public Vector2 hoverBehaviour_Move_Amount = Vector2.zero;
+        private Vector2 posExit, posEnter;
+        public bool triggerMouseOutFuncOnClick = false;
+        private bool mouseOver;
+        private float mouseOverPerSecFuncTimer;
+
+        private Action internalOnPointerEnterFunc = null, internalOnPointerExitFunc = null, internalOnPointerClickFunc = null;
+
+#if SOUND_MANAGER
+        public Sound_Manager.Sound mouseOverSound, mouseClickSound;
+#endif
+#if CURSOR_MANAGER
+        public CursorManager.CursorType cursorMouseOver, cursorMouseOut;
+#endif
+
+
+        public virtual void OnPointerEnter(PointerEventData eventData) {
+            if (internalOnPointerEnterFunc != null) internalOnPointerEnterFunc();
+            if (hoverBehaviour_Move) transform.GetComponent<RectTransform>().anchoredPosition = posEnter;
+            if (hoverBehaviourFunc_Enter != null) hoverBehaviourFunc_Enter();
+            if (MouseOverOnceFunc != null) MouseOverOnceFunc();
+            if (MouseOverOnceTooltipFunc != null) MouseOverOnceTooltipFunc();
+            mouseOver = true;
+            mouseOverPerSecFuncTimer = 0f;
+        }
+
+        public virtual void OnPointerExit(PointerEventData eventData) {
+            if (internalOnPointerExitFunc != null) internalOnPointerExitFunc();
+            if (hoverBehaviour_Move) transform.GetComponent<RectTransform>().anchoredPosition = posExit;
+            if (hoverBehaviourFunc_Exit != null) hoverBehaviourFunc_Exit();
+            if (MouseOutOnceFunc != null) MouseOutOnceFunc();
+            if (MouseOutOnceTooltipFunc != null) MouseOutOnceTooltipFunc();
+            mouseOver = false;
+        }
+
+        public virtual void OnPointerClick(PointerEventData eventData) {
+            if (internalOnPointerClickFunc != null) internalOnPointerClickFunc();
+            if (OnPointerClickFunc != null) OnPointerClickFunc(eventData);
+            if (eventData.button == PointerEventData.InputButton.Left) {
+                if (triggerMouseOutFuncOnClick) {
+                    OnPointerExit(eventData);
+                }
+                if (ClickFunc != null) ClickFunc();
+            }
+            if (eventData.button == PointerEventData.InputButton.Right)
+                if (MouseRightClickFunc != null) MouseRightClickFunc();
+            if (eventData.button == PointerEventData.InputButton.Middle)
+                if (MouseMiddleClickFunc != null) MouseMiddleClickFunc();
+        }
+
+        public void Manual_OnPointerExit() {
+            OnPointerExit(null);
+        }
+
+        public bool IsMouseOver() {
+            return mouseOver;
+        }
+
+        public void OnPointerDown(PointerEventData eventData) {
+            if (MouseDownOnceFunc != null) MouseDownOnceFunc();
+        }
+
+        public void OnPointerUp(PointerEventData eventData) {
+            if (MouseUpFunc != null) MouseUpFunc();
+        }
+
+        private void Update() {
+            if (mouseOver) {
+                if (MouseOverFunc != null) MouseOverFunc();
+                mouseOverPerSecFuncTimer -= Time.unscaledDeltaTime;
+                if (mouseOverPerSecFuncTimer <= 0) {
+                    mouseOverPerSecFuncTimer += 1f;
+                    if (MouseOverPerSecFunc != null) MouseOverPerSecFunc();
+                }
+            }
+            if (MouseUpdate != null) MouseUpdate();
+
+        }
+
+        private void Awake() {
+            posExit = transform.GetComponent<RectTransform>().anchoredPosition;
+            posEnter = transform.GetComponent<RectTransform>().anchoredPosition + hoverBehaviour_Move_Amount;
+            SetHoverBehaviourType(hoverBehaviourType);
+
+#if SOUND_MANAGER
+            // Sound Manager
+            internalOnPointerEnterFunc += () => { if (mouseOverSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseOverSound); };
+            internalOnPointerClickFunc += () => { if (mouseClickSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseClickSound); };
+#endif
+
+#if CURSOR_MANAGER
+            // Cursor Manager
+            internalOnPointerEnterFunc += () => { if (cursorMouseOver != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOver); };
+            internalOnPointerExitFunc += () => { if (cursorMouseOut != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOut); };
+#endif
+        }
+
+        public void SetHoverBehaviourType(HoverBehaviour hoverBehaviourType) {
+            this.hoverBehaviourType = hoverBehaviourType;
+            switch (hoverBehaviourType) {
+            case HoverBehaviour.Change_Color:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Enter; };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Exit; };
+                break;
+            case HoverBehaviour.Change_Image:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Enter; };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Exit; };
+                break;
+            case HoverBehaviour.Change_SetActive:
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.gameObject.SetActive(true); };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.gameObject.SetActive(false); };
+                break;
+            case HoverBehaviour.Change_Color_Auto:
+                Color color = hoverBehaviour_Image.color;
+                if (color.r >= 1f) color.r = .9f;
+                if (color.g >= 1f) color.g = .9f;
+                if (color.b >= 1f) color.b = .9f;
+                Color colorOver = color * 1.3f; // Over color lighter
+                hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = colorOver; };
+                hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = color; };
+                break;
+            }
+        }
+
+        public void RefreshHoverBehaviourType() {
+            SetHoverBehaviourType(hoverBehaviourType);
+        }
+            
+
+
+
+
+
+
+
+
+
+        /*
+         * Class for temporarily intercepting a button action
+         * Useful for Tutorial disabling specific buttons
+         * */
+        public class InterceptActionHandler {
+
+            private Action removeInterceptFunc;
+
+            public InterceptActionHandler(Action removeInterceptFunc) {
+                this.removeInterceptFunc = removeInterceptFunc;
+            }
+            public void RemoveIntercept() {
+                removeInterceptFunc();
+            }
+        }
+        public InterceptActionHandler InterceptActionClick(Func<bool> testPassthroughFunc) {
+            return InterceptAction("ClickFunc", testPassthroughFunc);
+        }
+        public InterceptActionHandler InterceptAction(string fieldName, Func<bool> testPassthroughFunc) {
+            return InterceptAction(GetType().GetField(fieldName), testPassthroughFunc);
+        }
+        public InterceptActionHandler InterceptAction(System.Reflection.FieldInfo fieldInfo, Func<bool> testPassthroughFunc) {
+            Action backFunc = fieldInfo.GetValue(this) as Action;
+            InterceptActionHandler interceptActionHandler = new InterceptActionHandler(() => fieldInfo.SetValue(this, backFunc));
+            fieldInfo.SetValue(this, (Action)delegate () {
+                if (testPassthroughFunc()) {
+                    // Passthrough
+                    interceptActionHandler.RemoveIntercept();
+                    backFunc();
+                }
+            });
+
+            return interceptActionHandler;
+        }
+    }
+}

+ 8 - 0
Assets/CodeMonkey/Utils/Button_UI.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 602f74cbbbd80034b96f88091a8e7c1d
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 187 - 0
Assets/CodeMonkey/Utils/FunctionPeriodic.cs

@@ -0,0 +1,187 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Executes a Function periodically
+     * */
+    public class FunctionPeriodic {
+
+        /*
+         * Class to hook Actions into MonoBehaviour
+         * */
+        private class MonoBehaviourHook : MonoBehaviour {
+
+            public Action OnUpdate;
+
+            private void Update() {
+                if (OnUpdate != null) OnUpdate();
+            }
+
+        }
+
+
+        private static List<FunctionPeriodic> funcList; // Holds a reference to all active timers
+        private static GameObject initGameObject; // Global game object used for initializing class, is destroyed on scene change
+
+        private static void InitIfNeeded() {
+            if (initGameObject == null) {
+                initGameObject = new GameObject("FunctionPeriodic_Global");
+                funcList = new List<FunctionPeriodic>();
+            }
+        }
+
+
+
+        // Persist through scene loads
+        public static FunctionPeriodic Create_Global(Action action, Func<bool> testDestroy, float timer) {
+            FunctionPeriodic functionPeriodic = Create(action, testDestroy, timer, "", false, false, false);
+            MonoBehaviour.DontDestroyOnLoad(functionPeriodic.gameObject);
+            return functionPeriodic;
+        }
+
+
+        // Trigger [action] every [timer], execute [testDestroy] after triggering action, destroy if returns true
+        public static FunctionPeriodic Create(Action action, Func<bool> testDestroy, float timer) {
+            return Create(action, testDestroy, timer, "", false);
+        }
+
+        public static FunctionPeriodic Create(Action action, float timer) {
+            return Create(action, null, timer, "", false, false, false);
+        }
+
+        public static FunctionPeriodic Create(Action action, float timer, string functionName) {
+            return Create(action, null, timer, functionName, false, false, false);
+        }
+
+        public static FunctionPeriodic Create(Action callback, Func<bool> testDestroy, float timer, string functionName, bool stopAllWithSameName) {
+            return Create(callback, testDestroy, timer, functionName, false, false, stopAllWithSameName);
+        }
+
+        public static FunctionPeriodic Create(Action action, Func<bool> testDestroy, float timer, string functionName, bool useUnscaledDeltaTime, bool triggerImmediately, bool stopAllWithSameName) {
+            InitIfNeeded();
+
+            if (stopAllWithSameName) {
+                StopAllFunc(functionName);
+            }
+
+            GameObject gameObject = new GameObject("FunctionPeriodic Object " + functionName, typeof(MonoBehaviourHook));
+            FunctionPeriodic functionPeriodic = new FunctionPeriodic(gameObject, action, timer, testDestroy, functionName, useUnscaledDeltaTime);
+            gameObject.GetComponent<MonoBehaviourHook>().OnUpdate = functionPeriodic.Update;
+
+            funcList.Add(functionPeriodic);
+
+            if (triggerImmediately) action();
+
+            return functionPeriodic;
+        }
+
+
+
+
+        public static void RemoveTimer(FunctionPeriodic funcTimer) {
+            InitIfNeeded();
+            funcList.Remove(funcTimer);
+        }
+        public static void StopTimer(string _name) {
+            InitIfNeeded();
+            for (int i = 0; i < funcList.Count; i++) {
+                if (funcList[i].functionName == _name) {
+                    funcList[i].DestroySelf();
+                    return;
+                }
+            }
+        }
+        public static void StopAllFunc(string _name) {
+            InitIfNeeded();
+            for (int i = 0; i < funcList.Count; i++) {
+                if (funcList[i].functionName == _name) {
+                    funcList[i].DestroySelf();
+                    i--;
+                }
+            }
+        }
+        public static bool IsFuncActive(string name) {
+            InitIfNeeded();
+            for (int i = 0; i < funcList.Count; i++) {
+                if (funcList[i].functionName == name) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+
+
+
+        private GameObject gameObject;
+        private float timer;
+        private float baseTimer;
+        private bool useUnscaledDeltaTime;
+        private string functionName;
+        public Action action;
+        public Func<bool> testDestroy;
+
+
+        private FunctionPeriodic(GameObject gameObject, Action action, float timer, Func<bool> testDestroy, string functionName, bool useUnscaledDeltaTime) {
+            this.gameObject = gameObject;
+            this.action = action;
+            this.timer = timer;
+            this.testDestroy = testDestroy;
+            this.functionName = functionName;
+            this.useUnscaledDeltaTime = useUnscaledDeltaTime;
+            baseTimer = timer;
+        }
+
+        public void SkipTimerTo(float timer) {
+            this.timer = timer;
+        }
+
+        public void SetBaseTimer(float baseTimer) {
+            this.baseTimer = baseTimer;
+        }
+
+        public float GetBaseTimer() {
+            return baseTimer;
+        }
+
+        private void Update() {
+            if (useUnscaledDeltaTime) {
+                timer -= Time.unscaledDeltaTime;
+            } else {
+                timer -= Time.deltaTime;
+            }
+            if (timer <= 0) {
+                action();
+                if (testDestroy != null && testDestroy()) {
+                    //Destroy
+                    DestroySelf();
+                } else {
+                    //Repeat
+                    timer += baseTimer;
+                }
+            }
+        }
+
+        public void DestroySelf() {
+            RemoveTimer(this);
+            if (gameObject != null) {
+                UnityEngine.Object.Destroy(gameObject);
+            }
+        }
+    }
+}

+ 8 - 0
Assets/CodeMonkey/Utils/FunctionPeriodic.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f522bd6f08a5c984a9512bb60ebc1818
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 183 - 0
Assets/CodeMonkey/Utils/FunctionTimer.cs

@@ -0,0 +1,183 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+using System.Collections.Generic;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Triggers a Action after a certain time 
+     * */
+    public class FunctionTimer {
+
+        /*
+         * Class to hook Actions into MonoBehaviour
+         * */
+        private class MonoBehaviourHook : MonoBehaviour {
+
+            public Action OnUpdate;
+
+            private void Update() {
+                if (OnUpdate != null) OnUpdate();
+            }
+
+        }
+
+
+        private static List<FunctionTimer> timerList; // Holds a reference to all active timers
+        private static GameObject initGameObject; // Global game object used for initializing class, is destroyed on scene change
+
+        private static void InitIfNeeded() {
+            if (initGameObject == null) {
+                initGameObject = new GameObject("FunctionTimer_Global");
+                timerList = new List<FunctionTimer>();
+            }
+        }
+
+
+
+
+        public static FunctionTimer Create(Action action, float timer) {
+            return Create(action, timer, "", false, false);
+        }
+
+        public static FunctionTimer Create(Action action, float timer, string functionName) {
+            return Create(action, timer, functionName, false, false);
+        }
+
+        public static FunctionTimer Create(Action action, float timer, string functionName, bool useUnscaledDeltaTime) {
+            return Create(action, timer, functionName, useUnscaledDeltaTime, false);
+        }
+
+        public static FunctionTimer Create(Action action, float timer, string functionName, bool useUnscaledDeltaTime, bool stopAllWithSameName) {
+            InitIfNeeded();
+
+            if (stopAllWithSameName) {
+                StopAllTimersWithName(functionName);
+            }
+
+            GameObject obj = new GameObject("FunctionTimer Object "+functionName, typeof(MonoBehaviourHook));
+            FunctionTimer funcTimer = new FunctionTimer(obj, action, timer, functionName, useUnscaledDeltaTime);
+            obj.GetComponent<MonoBehaviourHook>().OnUpdate = funcTimer.Update;
+
+            timerList.Add(funcTimer);
+
+            return funcTimer;
+        }
+
+        public static void RemoveTimer(FunctionTimer funcTimer) {
+            InitIfNeeded();
+            timerList.Remove(funcTimer);
+        }
+
+        public static void StopAllTimersWithName(string functionName) {
+            InitIfNeeded();
+            for (int i = 0; i < timerList.Count; i++) {
+                if (timerList[i].functionName == functionName) {
+                    timerList[i].DestroySelf();
+                    i--;
+                }
+            }
+        }
+
+        public static void StopFirstTimerWithName(string functionName) {
+            InitIfNeeded();
+            for (int i = 0; i < timerList.Count; i++) {
+                if (timerList[i].functionName == functionName) {
+                    timerList[i].DestroySelf();
+                    return;
+                }
+            }
+        }
+
+
+
+
+
+        private GameObject gameObject;
+        private float timer;
+        private string functionName;
+        private bool active;
+        private bool useUnscaledDeltaTime;
+        private Action action;
+
+
+
+        public FunctionTimer(GameObject gameObject, Action action, float timer, string functionName, bool useUnscaledDeltaTime) {
+            this.gameObject = gameObject;
+            this.action = action;
+            this.timer = timer;
+            this.functionName = functionName;
+            this.useUnscaledDeltaTime = useUnscaledDeltaTime;
+        }
+
+        private void Update() {
+            if (useUnscaledDeltaTime) {
+                timer -= Time.unscaledDeltaTime;
+            } else {
+                timer -= Time.deltaTime;
+            }
+            if (timer <= 0) {
+                // Timer complete, trigger Action
+                action();
+                DestroySelf();
+            }
+        }
+
+        private void DestroySelf() {
+            RemoveTimer(this);
+            if (gameObject != null) {
+                UnityEngine.Object.Destroy(gameObject);
+            }
+        }
+
+
+
+
+        /*
+         * Class to trigger Actions manually without creating a GameObject
+         * */
+        public class FunctionTimerObject {
+
+            private float timer;
+            private Action callback;
+
+            public FunctionTimerObject(Action callback, float timer) {
+                this.callback = callback;
+                this.timer = timer;
+            }
+
+            public bool Update() {
+                return Update(Time.deltaTime);
+            }
+
+            public bool Update(float deltaTime) {
+                timer -= deltaTime;
+                if (timer <= 0) {
+                    callback();
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        }
+
+        // Create a Object that must be manually updated through Update();
+        public static FunctionTimerObject CreateObject(Action callback, float timer) {
+            return new FunctionTimerObject(callback, timer);
+        }
+
+    }
+
+}

+ 8 - 0
Assets/CodeMonkey/Utils/FunctionTimer.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9c8b5f0217e73fa47827cf77f22c2f8d
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 157 - 0
Assets/CodeMonkey/Utils/FunctionUpdater.cs

@@ -0,0 +1,157 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+using System.Collections.Generic;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Calls function on every Update until it returns true
+     * */
+    public class FunctionUpdater {
+
+        /*
+         * Class to hook Actions into MonoBehaviour
+         * */
+        private class MonoBehaviourHook : MonoBehaviour {
+
+            public Action OnUpdate;
+
+            private void Update() {
+                if (OnUpdate != null) OnUpdate();
+            }
+
+        }
+
+        private static List<FunctionUpdater> updaterList; // Holds a reference to all active updaters
+        private static GameObject initGameObject; // Global game object used for initializing class, is destroyed on scene change
+
+        private static void InitIfNeeded() {
+            if (initGameObject == null) {
+                initGameObject = new GameObject("FunctionUpdater_Global");
+                updaterList = new List<FunctionUpdater>();
+            }
+        }
+
+
+
+        
+        public static FunctionUpdater Create(Action updateFunc) {
+            return Create(() => { updateFunc(); return false; }, "", true, false);
+        }
+
+        public static FunctionUpdater Create(Action updateFunc, string functionName) {
+            return Create(() => { updateFunc(); return false; }, functionName, true, false);
+        }
+
+        public static FunctionUpdater Create(Func<bool> updateFunc) {
+            return Create(updateFunc, "", true, false);
+        }
+
+        public static FunctionUpdater Create(Func<bool> updateFunc, string functionName) {
+            return Create(updateFunc, functionName, true, false);
+        }
+
+        public static FunctionUpdater Create(Func<bool> updateFunc, string functionName, bool active) {
+            return Create(updateFunc, functionName, active, false);
+        }
+
+        public static FunctionUpdater Create(Func<bool> updateFunc, string functionName, bool active, bool stopAllWithSameName) {
+            InitIfNeeded();
+
+            if (stopAllWithSameName) {
+                StopAllUpdatersWithName(functionName);
+            }
+
+            GameObject gameObject = new GameObject("FunctionUpdater Object " + functionName, typeof(MonoBehaviourHook));
+            FunctionUpdater functionUpdater = new FunctionUpdater(gameObject, updateFunc, functionName, active);
+            gameObject.GetComponent<MonoBehaviourHook>().OnUpdate = functionUpdater.Update;
+
+            updaterList.Add(functionUpdater);
+            return functionUpdater;
+        }
+
+        private static void RemoveUpdater(FunctionUpdater funcUpdater) {
+            InitIfNeeded();
+            updaterList.Remove(funcUpdater);
+        }
+
+        public static void DestroyUpdater(FunctionUpdater funcUpdater) {
+            InitIfNeeded();
+            if (funcUpdater != null) {
+                funcUpdater.DestroySelf();
+            }
+        }
+
+        public static void StopUpdaterWithName(string functionName) {
+            InitIfNeeded();
+            for (int i = 0; i < updaterList.Count; i++) {
+                if (updaterList[i].functionName == functionName) {
+                    updaterList[i].DestroySelf();
+                    return;
+                }
+            }
+        }
+
+        public static void StopAllUpdatersWithName(string functionName) {
+            InitIfNeeded();
+            for (int i = 0; i < updaterList.Count; i++) {
+                if (updaterList[i].functionName == functionName) {
+                    updaterList[i].DestroySelf();
+                    i--;
+                }
+            }
+        }
+
+
+
+
+
+        private GameObject gameObject;
+        private string functionName;
+        private bool active;
+        private Func<bool> updateFunc; // Destroy Updater if return true;
+
+        public FunctionUpdater(GameObject gameObject, Func<bool> updateFunc, string functionName, bool active) {
+            this.gameObject = gameObject;
+            this.updateFunc = updateFunc;
+            this.functionName = functionName;
+            this.active = active;
+        }
+
+        public void Pause() {
+            active = false;
+        }
+
+        public void Resume() {
+            active = true;
+        }
+
+        private void Update() {
+            if (!active) return;
+            if (updateFunc()) {
+                DestroySelf();
+            }
+        }
+
+        public void DestroySelf() {
+            RemoveUpdater(this);
+            if (gameObject != null) {
+                UnityEngine.Object.Destroy(gameObject);
+            }
+        }
+
+    }
+
+}

+ 8 - 0
Assets/CodeMonkey/Utils/FunctionUpdater.cs.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7eacfbf662ad34e46932f36084c15e11
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 

+ 170 - 0
Assets/CodeMonkey/Utils/UI_Bar.cs

@@ -0,0 +1,170 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Bar in the UI with scaleable Bar and Background
+     * */
+    public class UI_Bar {
+        
+        public GameObject gameObject;
+        private RectTransform rectTransform;
+        private RectTransform background;
+        private RectTransform bar;
+        private Vector2 size;
+        
+        /* 
+         * Outline into for Bar
+         * */
+        public class Outline {
+            public float size = 1f;
+            public Color color = Color.black;
+            public Outline(float size, Color color) {
+                this.size = size;
+                this.color = color;
+            }
+        }
+
+        public UI_Bar(GameObject gameObject, RectTransform background, RectTransform bar) {
+            this.gameObject = gameObject;
+            rectTransform = gameObject.GetComponent<RectTransform>();
+            this.background = background;
+            this.bar = bar;
+            size = background.GetComponent<RectTransform>().sizeDelta;
+        }
+
+        public UI_Bar(GameObject gameObject, Transform background, Transform bar) {
+            this.gameObject = gameObject;
+            rectTransform = gameObject.GetComponent<RectTransform>();
+            this.background = background.GetComponent<RectTransform>();
+            this.bar = bar.GetComponent<RectTransform>();
+            size = background.GetComponent<RectTransform>().sizeDelta;
+        }
+
+        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color barColor, float sizeRatio) {
+            SetupParent(parent, anchoredPosition, size);
+            SetupBar(barColor);
+            SetSize(sizeRatio);
+        }
+
+        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color barColor, float sizeRatio, Outline outline) {
+            SetupParent(parent, anchoredPosition, size);
+            if (outline != null) SetupOutline(outline, size);
+            SetupBar(barColor);
+            SetSize(sizeRatio);
+        }
+
+        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color backgroundColor, Color barColor, float sizeRatio) {
+            SetupParent(parent, anchoredPosition, size);
+            SetupBackground(backgroundColor);
+            SetupBar(barColor);
+            SetSize(sizeRatio);
+        }
+
+        public UI_Bar(Transform parent, Vector2 anchoredPosition, Vector2 size, Color backgroundColor, Color barColor, float sizeRatio, Outline outline) {
+            SetupParent(parent, anchoredPosition, size);
+            if (outline != null) SetupOutline(outline, size);
+            SetupBackground(backgroundColor);
+            SetupBar(barColor);
+            SetSize(sizeRatio);
+        }
+
+        private void SetupParent(Transform parent, Vector2 anchoredPosition, Vector2 size) {
+            this.size = size;
+            gameObject = new GameObject("UI_Bar", typeof(RectTransform));
+            rectTransform = gameObject.GetComponent<RectTransform>();
+            rectTransform.SetParent(parent, false);
+            rectTransform.sizeDelta = size;
+            rectTransform.anchorMin = new Vector2(0, .5f);
+            rectTransform.anchorMax = new Vector2(0, .5f);
+            rectTransform.pivot = new Vector2(0, .5f);
+            rectTransform.anchoredPosition = anchoredPosition;
+        }
+
+        private RectTransform SetupOutline(Outline outline, Vector2 size) {
+            return UtilsClass.DrawSprite(outline.color, gameObject.transform, Vector2.zero, size + new Vector2(outline.size, outline.size), "Outline");
+        }
+
+        private void SetupBackground(Color backgroundColor) {
+            background = UtilsClass.DrawSprite(backgroundColor, gameObject.transform, Vector2.zero, Vector2.zero, "Background");
+            background.anchorMin = new Vector2(0,0);
+            background.anchorMax = new Vector2(1,1);
+        }
+
+        private void SetupBar(Color barColor) {
+            bar = UtilsClass.DrawSprite(barColor, gameObject.transform, Vector2.zero, Vector2.zero, "Bar");
+            bar.anchorMin = new Vector2(0,0);
+            bar.anchorMax = new Vector2(0,1f);
+            bar.pivot = new Vector2(0,.5f);
+        }
+
+        public void SetSize(float sizeRatio) {
+            bar.sizeDelta = new Vector2(sizeRatio * size.x, 0f);
+        }
+
+        public void SetColor(Color color) {
+            bar.GetComponent<Image>().color = color;
+        }
+
+        public void SetActive(bool active) {
+            gameObject.SetActive(active);
+        }
+
+        public Vector2 GetAnchoredPosition() {
+            return rectTransform.anchoredPosition;
+        }
+
+        public Vector2 GetSize() {
+            return rectTransform.sizeDelta;
+        }
+
+        public void AddOutline(Outline outline) {
+            RectTransform outlineRectTransform = SetupOutline(outline, size);
+            outlineRectTransform.transform.SetAsFirstSibling();
+        }
+
+        public void SetRaycastTarget(bool set) {
+            foreach (Transform trans in gameObject.transform) {
+                if (trans.GetComponent<Image>() != null) {
+                    trans.GetComponent<Image>().raycastTarget = set;
+                }
+            }
+        }
+
+        public void DestroySelf() {
+            UnityEngine.Object.Destroy(gameObject);
+        }
+
+        public Button_UI AddButton() {
+            return AddButton(null, null, null);
+        }
+
+        public Button_UI AddButton(Action ClickFunc, Action MouseOverOnceFunc, Action MouseOutOnceFunc) {
+            Button_UI buttonUI = gameObject.AddComponent<Button_UI>();
+            if (ClickFunc != null)
+                buttonUI.ClickFunc = ClickFunc;
+            if (MouseOverOnceFunc != null)
+                buttonUI.MouseOverOnceFunc = MouseOverOnceFunc;
+            if (MouseOutOnceFunc != null)
+                buttonUI.MouseOutOnceFunc = MouseOutOnceFunc;
+            return buttonUI;
+        }
+
+    }
+
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/UI_Bar.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 49ffd25ff4b0ca3429d1b1e2dc0ff037
+timeCreated: 1524300423
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 104 - 0
Assets/CodeMonkey/Utils/UI_BarMultiple.cs

@@ -0,0 +1,104 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace CodeMonkey.Utils {
+    
+    /*
+     * UI Container with multiple bars, useful for displaying one bar with multiple inner bars like success chance and failure chance
+     * */
+    public class UI_BarMultiple {
+        
+        private GameObject gameObject;
+        private RectTransform rectTransform;
+        private RectTransform[] barArr;
+        private Image[] barImageArr;
+        private Vector2 size;
+        
+        public class Outline {
+            public float size = 1f;
+            public Color color = Color.black;
+            public Outline(float size, Color color) {
+                this.size = size;
+                this.color = color;
+            }
+        }
+
+        public UI_BarMultiple(Transform parent, Vector2 anchoredPosition, Vector2 size, Color[] barColorArr, Outline outline) {
+            this.size = size;
+            SetupParent(parent, anchoredPosition, size);
+            if (outline != null) SetupOutline(outline, size);
+            List<RectTransform> barList = new List<RectTransform>();
+            List<Image> barImageList = new List<Image>();
+            List<float> defaultSizeList = new List<float>();
+            foreach (Color color in barColorArr) {
+                barList.Add(SetupBar(color));
+                defaultSizeList.Add(1f / barColorArr.Length);
+            }
+            barArr = barList.ToArray();
+            barImageArr = barImageList.ToArray();
+            SetSizes(defaultSizeList.ToArray());
+        }
+
+        private void SetupParent(Transform parent, Vector2 anchoredPosition, Vector2 size) {
+            gameObject = new GameObject("UI_BarMultiple", typeof(RectTransform));
+            rectTransform = gameObject.GetComponent<RectTransform>();
+            rectTransform.SetParent(parent, false);
+            rectTransform.sizeDelta = size;
+            rectTransform.anchorMin = new Vector2(0, .5f);
+            rectTransform.anchorMax = new Vector2(0, .5f);
+            rectTransform.pivot = new Vector2(0, .5f);
+            rectTransform.anchoredPosition = anchoredPosition;
+        }
+
+        private void SetupOutline(Outline outline, Vector2 size) {
+            UtilsClass.DrawSprite(outline.color, gameObject.transform, Vector2.zero, size + new Vector2(outline.size, outline.size), "Outline");
+        }
+
+        private RectTransform SetupBar(Color barColor) {
+            RectTransform bar = UtilsClass.DrawSprite(barColor, gameObject.transform, Vector2.zero, Vector2.zero, "Bar");
+            bar.anchorMin = new Vector2(0,0);
+            bar.anchorMax = new Vector2(0,1f);
+            bar.pivot = new Vector2(0,.5f);
+            return bar;
+        }
+
+        public void SetSizes(float[] sizeArr) {
+            if (sizeArr.Length != barArr.Length) {
+                throw new System.Exception("Length doesn't match!");
+            }
+            Vector2 pos = Vector2.zero;
+            for (int i=0; i<sizeArr.Length; i++) {
+                float scaledSize = sizeArr[i] * size.x;
+                barArr[i].anchoredPosition = pos;
+                barArr[i].sizeDelta = new Vector2(scaledSize, 0f);
+                pos.x += scaledSize;
+            }
+        }
+
+        public RectTransform GetBar(int index) {
+            return barArr[index];
+        }
+
+        public Vector2 GetSize() {
+            return size;
+        }
+
+        public void DestroySelf() {
+            UnityEngine.Object.Destroy(gameObject);
+        }
+
+    }
+}

+ 13 - 0
Assets/CodeMonkey/Utils/UI_BarMultiple.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 9cf7b152002fbca49b6a1a4623f200a7
+timeCreated: 1524300429
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 131 - 0
Assets/CodeMonkey/Utils/UI_Sprite.cs

@@ -0,0 +1,131 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Sprite in the UI
+     * */
+    public class UI_Sprite {
+
+        private static Transform GetCanvasTransform() {
+            return UtilsClass.GetCanvasTransform();
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, Vector2 size, Action ClickFunc) {
+            return CreateDebugButton(anchoredPosition, size, ClickFunc, Color.green);
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, Vector2 size, Action ClickFunc, Color color) {
+            UI_Sprite uiSprite = new UI_Sprite(GetCanvasTransform(), Assets.i.s_White, anchoredPosition, size, color);
+            uiSprite.AddButton(ClickFunc, null, null);
+            return uiSprite;
+        }
+
+        public static UI_Sprite CreateDebugButton(Transform parent, Vector2 anchoredPosition, string text, Action ClickFunc) {
+            return CreateDebugButton(parent, anchoredPosition, text, ClickFunc, Color.green);
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, string text, Action ClickFunc) {
+            return CreateDebugButton(anchoredPosition, text, ClickFunc, Color.green);
+        }
+
+        public static UI_Sprite CreateDebugButton(Transform parent, Vector2 anchoredPosition, string text, Action ClickFunc, Color color) {
+            return CreateDebugButton(parent, anchoredPosition, text, ClickFunc, color, new Vector2(30, 20));
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, string text, Action ClickFunc, Color color) {
+            return CreateDebugButton(GetCanvasTransform(), anchoredPosition, text, ClickFunc, color, new Vector2(30, 20));
+        }
+
+        public static UI_Sprite CreateDebugButton(Transform parent, Vector2 anchoredPosition, string text, Action ClickFunc, Color color, Vector2 padding) {
+            UI_TextComplex uiTextComplex;
+            UI_Sprite uiSprite = CreateDebugButton(parent, anchoredPosition, Vector2.zero, ClickFunc, color, text, out uiTextComplex);
+            uiSprite.SetSize(new Vector2(uiTextComplex.GetTotalWidth(), uiTextComplex.GetTotalHeight()) + padding);
+            return uiSprite;
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, Vector2 size, Action ClickFunc, Color color, string text) {
+            UI_TextComplex uiTextComplex;
+            return CreateDebugButton(anchoredPosition, size, ClickFunc, color, text, out uiTextComplex);
+        }
+
+        public static UI_Sprite CreateDebugButton(Vector2 anchoredPosition, Vector2 size, Action ClickFunc, Color color, string text, out UI_TextComplex uiTextComplex) {
+            return CreateDebugButton(GetCanvasTransform(), anchoredPosition, size, ClickFunc, color, text, out uiTextComplex);
+        }
+
+        public static UI_Sprite CreateDebugButton(Transform parent, Vector2 anchoredPosition, Vector2 size, Action ClickFunc, Color color, string text, out UI_TextComplex uiTextComplex) {
+            if (color.r >= 1f) color.r = .9f;
+            if (color.g >= 1f) color.g = .9f;
+            if (color.b >= 1f) color.b = .9f;
+            Color colorOver = color * 1.1f; // button over color lighter
+            UI_Sprite uiSprite = new UI_Sprite(parent, Assets.i.s_White, anchoredPosition, size, color);
+            uiSprite.AddButton(ClickFunc, () => uiSprite.SetColor(colorOver), () => uiSprite.SetColor(color));
+            uiTextComplex = new UI_TextComplex(uiSprite.gameObject.transform, Vector2.zero, 12, '#', text, null, null);
+            uiTextComplex.SetTextColor(Color.black);
+            uiTextComplex.SetAnchorMiddle();
+            uiTextComplex.CenterOnPosition(Vector2.zero);
+            return uiSprite;
+        }
+        
+
+
+        public GameObject gameObject;
+        public Image image;
+        public RectTransform rectTransform;
+
+
+        public UI_Sprite(Transform parent, Sprite sprite, Vector2 anchoredPosition, Vector2 size, Color color) {
+            rectTransform = UtilsClass.DrawSprite(sprite, parent, anchoredPosition, size, "UI_Sprite");
+            gameObject = rectTransform.gameObject;
+            image = gameObject.GetComponent<Image>();
+            image.color = color;
+        }
+
+        public void SetColor(Color color) {
+            image.color = color;
+        }
+
+        public void SetSprite(Sprite sprite) {
+            image.sprite = sprite;
+        }
+
+        public void SetSize(Vector2 size) {
+            rectTransform.sizeDelta = size;
+        }
+
+        public void SetAnchoredPosition(Vector2 anchoredPosition) {
+            rectTransform.anchoredPosition = anchoredPosition;
+        }
+
+        public Button_UI AddButton(Action ClickFunc, Action MouseOverOnceFunc, Action MouseOutOnceFunc) {
+            Button_UI buttonUI = gameObject.AddComponent<Button_UI>();
+            if (ClickFunc != null)
+                buttonUI.ClickFunc = ClickFunc;
+            if (MouseOverOnceFunc != null)
+                buttonUI.MouseOverOnceFunc = MouseOverOnceFunc;
+            if (MouseOutOnceFunc != null)
+                buttonUI.MouseOutOnceFunc = MouseOutOnceFunc;
+            return buttonUI;
+        }
+
+        public void DestroySelf() {
+            UnityEngine.Object.Destroy(gameObject);
+        }
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/UI_Sprite.cs.meta

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

+ 151 - 0
Assets/CodeMonkey/Utils/UI_TextComplex.cs

@@ -0,0 +1,151 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace CodeMonkey.Utils {
+    
+    /*
+     * Displays text with icons in between the text
+     * */
+    public class UI_TextComplex {
+        
+        private static Transform GetCanvasTransform() {
+            return UtilsClass.GetCanvasTransform();
+        }
+
+        public struct Icon {
+            public Sprite sprite;
+            public Vector2 size;
+            public Color color;
+            public Icon(Sprite sprite, Vector2 size, Color? color = null) {
+                this.sprite = sprite;
+                this.size = size;
+                if (color == null) {
+                    this.color = Color.white;
+                } else {
+                    this.color = (Color) color;
+                }
+            }
+        }
+
+        public  GameObject gameObject;
+        private Transform transform;
+        private RectTransform rectTransform;
+
+        // iconChar prepends the iconArr index; 
+        // Example using iconChar '#': 
+        //      test #0 asdf
+        // Displays "test [iconArr[0]] asdf"
+        public UI_TextComplex(Transform parent, Vector2 anchoredPosition, int fontSize, char iconChar, string text, Icon[] iconArr, Font font) {
+            SetupParent(parent, anchoredPosition);
+            string tmp = text;
+            float textPosition = 0f;
+            while (tmp.IndexOf(iconChar) != -1) {
+                string untilTmp = tmp.Substring(0, tmp.IndexOf(iconChar));
+                string iconNumber = tmp.Substring(tmp.IndexOf(iconChar)+1);
+                int indexOfSpaceAfterIconNumber = iconNumber.IndexOf(" ");
+                if (indexOfSpaceAfterIconNumber != -1) {
+                    // Still has more space after iconNumber
+                    iconNumber = iconNumber.Substring(0, indexOfSpaceAfterIconNumber);
+                } else {
+                    // No more space after iconNumber
+                }
+                tmp = tmp.Substring(tmp.IndexOf(iconChar+iconNumber) + (iconChar+iconNumber).Length);
+                if (untilTmp.Trim() != "") {
+                    Text uiText = UtilsClass.DrawTextUI(untilTmp, transform, new Vector2(textPosition,0), fontSize, font);
+                    textPosition += uiText.preferredWidth;
+                }
+                // Draw Icon
+                int iconIndex = UtilsClass.Parse_Int(iconNumber, 0);
+                Icon icon = iconArr[iconIndex];
+                UtilsClass.DrawSprite(icon.sprite, transform, new Vector2(textPosition + icon.size.x / 2f, 0), icon.size);
+                textPosition += icon.size.x;
+            }
+            if (tmp.Trim() != "") {
+                UtilsClass.DrawTextUI(tmp, transform, new Vector2(textPosition,0), fontSize, font);
+            }
+        }
+
+        private void SetupParent(Transform parent, Vector2 anchoredPosition) {
+            gameObject = new GameObject("UI_TextComplex", typeof(RectTransform));
+            transform = gameObject.transform;
+            rectTransform = gameObject.GetComponent<RectTransform>();
+            rectTransform.SetParent(parent, false);
+            rectTransform.sizeDelta = new Vector2(0, 0);
+            rectTransform.anchorMin = new Vector2(0, .5f);
+            rectTransform.anchorMax = new Vector2(0, .5f);
+            rectTransform.pivot = new Vector2(0, .5f);
+            rectTransform.anchoredPosition = anchoredPosition;
+        }
+
+        public void SetTextColor(Color color) {
+            foreach (Transform trans in transform) {
+                Text text = trans.GetComponent<Text>();
+                if (text != null) {
+                    text.color = color;
+                }
+            }
+        }
+
+        public float GetTotalWidth() {
+            float textPosition = 0f;
+            foreach (Transform trans in transform) {
+                Text text = trans.GetComponent<Text>();
+                if (text != null) {
+                    textPosition += text.preferredWidth;
+                }
+                Image image = trans.GetComponent<Image>();
+                if (image != null) {
+                    textPosition += image.GetComponent<RectTransform>().sizeDelta.x;
+                }
+            }
+            return textPosition;
+        }
+
+        public float GetTotalHeight() {
+            foreach (Transform trans in transform) {
+                Text text = trans.GetComponent<Text>();
+                if (text != null) {
+                    return text.preferredHeight;
+                }
+            }
+            return 0f;
+        }
+
+        public void AddTextOutline(Color color, float size) {
+            foreach (Transform textComplexTrans in transform) {
+                if (textComplexTrans.GetComponent<Text>() != null) {
+                    Outline outline = textComplexTrans.gameObject.AddComponent<Outline>();
+                    outline.effectColor = color;
+                    outline.effectDistance = new Vector2(size, size);
+                }
+            }
+        }
+
+        public void SetAnchorMiddle() {
+            rectTransform.anchorMin = new Vector2(.5f, .5f);
+            rectTransform.anchorMax = new Vector2(.5f, .5f);
+        }
+
+        public void CenterOnPosition(Vector2 position) {
+            rectTransform.anchoredPosition = position + new Vector2(-GetTotalWidth() / 2f, 0);
+        }
+
+        public void DestroySelf() {
+            Object.Destroy(gameObject);
+        }
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/UI_TextComplex.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 8ba4b604c0e9db241bb3d130165415cd
+timeCreated: 1524300347
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1563 - 0
Assets/CodeMonkey/Utils/UtilsClass.cs

@@ -0,0 +1,1563 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.EventSystems;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Various assorted utilities functions
+     * */
+    public static class UtilsClass {
+        
+        private static readonly Vector3 Vector3zero = Vector3.zero;
+        private static readonly Vector3 Vector3one = Vector3.one;
+        private static readonly Vector3 Vector3yDown = new Vector3(0,-1);
+
+        public const int sortingOrderDefault = 5000;
+        
+        // Get Sorting order to set SpriteRenderer sortingOrder, higher position = lower sortingOrder
+        public static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) {
+            return (int)(baseSortingOrder - position.y) + offset;
+        }
+
+
+        // Get Main Canvas Transform
+        private static Transform cachedCanvasTransform;
+        public static Transform GetCanvasTransform() {
+            if (cachedCanvasTransform == null) {
+                Canvas canvas = MonoBehaviour.FindObjectOfType<Canvas>();
+                if (canvas != null) {
+                    cachedCanvasTransform = canvas.transform;
+                }
+            }
+            return cachedCanvasTransform;
+        }
+
+        // Get Default Unity Font, used in text objects if no font given
+        public static Font GetDefaultFont() {
+            return Resources.GetBuiltinResource<Font>("Arial.ttf");
+        }
+
+
+        // Create a Sprite in the World, no parent
+        public static GameObject CreateWorldSprite(string name, Sprite sprite, Vector3 position, Vector3 localScale, int sortingOrder, Color color) {
+            return CreateWorldSprite(null, name, sprite, position, localScale, sortingOrder, color);
+        }
+        
+        // Create a Sprite in the World
+        public static GameObject CreateWorldSprite(Transform parent, string name, Sprite sprite, Vector3 localPosition, Vector3 localScale, int sortingOrder, Color color) {
+            GameObject gameObject = new GameObject(name, typeof(SpriteRenderer));
+            Transform transform = gameObject.transform;
+            transform.SetParent(parent, false);
+            transform.localPosition = localPosition;
+            transform.localScale = localScale;
+            SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
+            spriteRenderer.sprite = sprite;
+            spriteRenderer.sortingOrder = sortingOrder;
+            spriteRenderer.color = color;
+            return gameObject;
+        }
+
+        // Create a Sprite in the World with Button_Sprite, no parent
+        public static Button_Sprite CreateWorldSpriteButton(string name, Sprite sprite, Vector3 localPosition, Vector3 localScale, int sortingOrder, Color color) {
+            return CreateWorldSpriteButton(null, name, sprite, localPosition, localScale, sortingOrder, color);
+        }
+
+        // Create a Sprite in the World with Button_Sprite
+        public static Button_Sprite CreateWorldSpriteButton(Transform parent, string name, Sprite sprite, Vector3 localPosition, Vector3 localScale, int sortingOrder, Color color) {
+            GameObject gameObject = CreateWorldSprite(parent, name, sprite, localPosition, localScale, sortingOrder, color);
+            gameObject.AddComponent<BoxCollider2D>();
+            Button_Sprite buttonSprite = gameObject.AddComponent<Button_Sprite>();
+            return buttonSprite;
+        }
+
+        // Creates a Text Mesh in the World and constantly updates it
+        public static FunctionUpdater CreateWorldTextUpdater(Func<string> GetTextFunc, Vector3 localPosition, Transform parent = null, int fontSize = 40, Color? color = null, TextAnchor textAnchor = TextAnchor.UpperLeft, TextAlignment textAlignment = TextAlignment.Left, int sortingOrder = sortingOrderDefault) {
+            TextMesh textMesh = CreateWorldText(GetTextFunc(), parent, localPosition, fontSize, color, textAnchor, textAlignment, sortingOrder);
+            return FunctionUpdater.Create(() => {
+                textMesh.text = GetTextFunc();
+                return false;
+            }, "WorldTextUpdater");
+        }
+
+        // Create Text in the World
+        public static TextMesh CreateWorldText(string text, Transform parent = null, Vector3 localPosition = default(Vector3), int fontSize = 40, Color? color = null, TextAnchor textAnchor = TextAnchor.UpperLeft, TextAlignment textAlignment = TextAlignment.Left, int sortingOrder = sortingOrderDefault) {
+            if (color == null) color = Color.white;
+            return CreateWorldText(parent, text, localPosition, fontSize, (Color)color, textAnchor, textAlignment, sortingOrder);
+        }
+        
+        // Create Text in the World
+        public static TextMesh CreateWorldText(Transform parent, string text, Vector3 localPosition, int fontSize, Color color, TextAnchor textAnchor, TextAlignment textAlignment, int sortingOrder) {
+            GameObject gameObject = new GameObject("World_Text", typeof(TextMesh));
+            Transform transform = gameObject.transform;
+            transform.SetParent(parent, false);
+            transform.localPosition = localPosition;
+            TextMesh textMesh = gameObject.GetComponent<TextMesh>();
+            textMesh.anchor = textAnchor;
+            textMesh.alignment = textAlignment;
+            textMesh.text = text;
+            textMesh.fontSize = fontSize;
+            textMesh.color = color;
+            textMesh.GetComponent<MeshRenderer>().sortingOrder = sortingOrder;
+            return textMesh;
+        }
+
+
+        // Create a Text Popup in the World, no parent
+        public static void CreateWorldTextPopup(string text, Vector3 localPosition, float popupTime = 1f) {
+            CreateWorldTextPopup(null, text, localPosition, 40, Color.white, localPosition + new Vector3(0, 20), popupTime);
+        }
+        
+        // Create a Text Popup in the World
+        public static void CreateWorldTextPopup(Transform parent, string text, Vector3 localPosition, int fontSize, Color color, Vector3 finalPopupPosition, float popupTime) {
+            TextMesh textMesh = CreateWorldText(parent, text, localPosition, fontSize, color, TextAnchor.LowerLeft, TextAlignment.Left, sortingOrderDefault);
+            Transform transform = textMesh.transform;
+            Vector3 moveAmount = (finalPopupPosition - localPosition) / popupTime;
+            FunctionUpdater.Create(delegate () {
+                transform.position += moveAmount * Time.unscaledDeltaTime;
+                popupTime -= Time.unscaledDeltaTime;
+                if (popupTime <= 0f) {
+                    UnityEngine.Object.Destroy(transform.gameObject);
+                    return true;
+                } else {
+                    return false;
+                }
+            }, "WorldTextPopup");
+        }
+
+        // Create Text Updater in UI
+        public static FunctionUpdater CreateUITextUpdater(Func<string> GetTextFunc, Vector2 anchoredPosition) {
+            Text text = DrawTextUI(GetTextFunc(), anchoredPosition,  20, GetDefaultFont());
+            return FunctionUpdater.Create(() => {
+                text.text = GetTextFunc();
+                return false;
+            }, "UITextUpdater");
+        }
+
+
+        // Draw a UI Sprite
+        public static RectTransform DrawSprite(Color color, Transform parent, Vector2 pos, Vector2 size, string name = null) {
+            RectTransform rectTransform = DrawSprite(null, color, parent, pos, size, name);
+            return rectTransform;
+        }
+        
+        // Draw a UI Sprite
+        public static RectTransform DrawSprite(Sprite sprite, Transform parent, Vector2 pos, Vector2 size, string name = null) {
+            RectTransform rectTransform = DrawSprite(sprite, Color.white, parent, pos, size, name);
+            return rectTransform;
+        }
+        
+        // Draw a UI Sprite
+        public static RectTransform DrawSprite(Sprite sprite, Color color, Transform parent, Vector2 pos, Vector2 size, string name = null) {
+            // Setup icon
+            if (name == null || name == "") name = "Sprite";
+            GameObject go = new GameObject(name, typeof(RectTransform), typeof(Image));
+            RectTransform goRectTransform = go.GetComponent<RectTransform>();
+            goRectTransform.SetParent(parent, false);
+            goRectTransform.sizeDelta = size;
+            goRectTransform.anchoredPosition = pos;
+
+            Image image = go.GetComponent<Image>();
+            image.sprite = sprite;
+            image.color = color;
+
+            return goRectTransform;
+        }
+
+        public static Text DrawTextUI(string textString, Vector2 anchoredPosition, int fontSize, Font font) {
+            return DrawTextUI(textString, GetCanvasTransform(), anchoredPosition, fontSize, font);
+        }
+
+        public static Text DrawTextUI(string textString, Transform parent, Vector2 anchoredPosition, int fontSize, Font font) {
+            GameObject textGo = new GameObject("Text", typeof(RectTransform), typeof(Text));
+            textGo.transform.SetParent(parent, false);
+            Transform textGoTrans = textGo.transform;
+            textGoTrans.SetParent(parent, false);
+            textGoTrans.localPosition = Vector3zero;
+            textGoTrans.localScale = Vector3one;
+
+            RectTransform textGoRectTransform = textGo.GetComponent<RectTransform>();
+            textGoRectTransform.sizeDelta = new Vector2(0,0);
+            textGoRectTransform.anchoredPosition = anchoredPosition;
+
+            Text text = textGo.GetComponent<Text>();
+            text.text = textString;
+            text.verticalOverflow = VerticalWrapMode.Overflow;
+            text.horizontalOverflow = HorizontalWrapMode.Overflow;
+            text.alignment = TextAnchor.MiddleLeft;
+            if (font == null) font = GetDefaultFont();
+            text.font = font;
+            text.fontSize = fontSize;
+
+            return text;
+        }
+
+
+        // Parse a float, return default if failed
+	    public static float Parse_Float(string txt, float _default) {
+		    float f;
+		    if (!float.TryParse(txt, out f)) {
+			    f = _default;
+		    }
+		    return f;
+	    }
+        
+        // Parse a int, return default if failed
+	    public static int Parse_Int(string txt, int _default) {
+		    int i;
+		    if (!int.TryParse(txt, out i)) {
+			    i = _default;
+		    }
+		    return i;
+	    }
+
+	    public static int Parse_Int(string txt) {
+            return Parse_Int(txt, -1);
+	    }
+
+
+
+        // Get Mouse Position in World with Z = 0f
+        public static Vector3 GetMouseWorldPosition() {
+            Vector3 vec = GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
+            vec.z = 0f;
+            return vec;
+        }
+
+        public static Vector3 GetMouseWorldPositionWithZ() {
+            return GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
+        }
+
+        public static Vector3 GetMouseWorldPositionWithZ(Camera worldCamera) {
+            return GetMouseWorldPositionWithZ(Input.mousePosition, worldCamera);
+        }
+
+        public static Vector3 GetMouseWorldPositionWithZ(Vector3 screenPosition, Camera worldCamera) {
+            Vector3 worldPosition = worldCamera.ScreenToWorldPoint(screenPosition);
+            return worldPosition;
+        }
+
+        public static Vector3 GetDirToMouse(Vector3 fromPosition) {
+            Vector3 mouseWorldPosition = GetMouseWorldPosition();
+            return (mouseWorldPosition - fromPosition).normalized;
+        }
+
+        
+
+        // Is Mouse over a UI Element? Used for ignoring World clicks through UI
+        public static bool IsPointerOverUI() {
+            if (EventSystem.current.IsPointerOverGameObject()) {
+                return true;
+            } else {
+                PointerEventData pe = new PointerEventData(EventSystem.current);
+                pe.position =  Input.mousePosition;
+                List<RaycastResult> hits = new List<RaycastResult>();
+                EventSystem.current.RaycastAll( pe, hits );
+                return hits.Count > 0;
+            }
+        }
+
+
+        
+		// Returns 00-FF, value 0->255
+	    public static string Dec_to_Hex(int value) {
+		    return value.ToString("X2");
+	    }
+
+		// Returns 0-255
+	    public static int Hex_to_Dec(string hex) {
+		    return Convert.ToInt32(hex, 16);
+	    }
+        
+		// Returns a hex string based on a number between 0->1
+	    public static string Dec01_to_Hex(float value) {
+		    return Dec_to_Hex((int)Mathf.Round(value*255f));
+	    }
+
+		// Returns a float between 0->1
+	    public static float Hex_to_Dec01(string hex) {
+		    return Hex_to_Dec(hex)/255f;
+	    }
+
+        // Get Hex Color FF00FF
+	    public static string GetStringFromColor(Color color) {
+		    string red = Dec01_to_Hex(color.r);
+		    string green = Dec01_to_Hex(color.g);
+		    string blue = Dec01_to_Hex(color.b);
+		    return red+green+blue;
+	    }
+        
+        // Get Hex Color FF00FFAA
+	    public static string GetStringFromColorWithAlpha(Color color) {
+		    string alpha = Dec01_to_Hex(color.a);
+		    return GetStringFromColor(color)+alpha;
+	    }
+
+        // Sets out values to Hex String 'FF'
+	    public static void GetStringFromColor(Color color, out string red, out string green, out string blue, out string alpha) {
+		    red = Dec01_to_Hex(color.r);
+		    green = Dec01_to_Hex(color.g);
+		    blue = Dec01_to_Hex(color.b);
+		    alpha = Dec01_to_Hex(color.a);
+	    }
+        
+        // Get Hex Color FF00FF
+	    public static string GetStringFromColor(float r, float g, float b) {
+		    string red = Dec01_to_Hex(r);
+		    string green = Dec01_to_Hex(g);
+		    string blue = Dec01_to_Hex(b);
+		    return red+green+blue;
+	    }
+        
+        // Get Hex Color FF00FFAA
+	    public static string GetStringFromColor(float r, float g, float b, float a) {
+		    string alpha = Dec01_to_Hex(a);
+		    return GetStringFromColor(r,g,b)+alpha;
+	    }
+        
+        // Get Color from Hex string FF00FFAA
+	    public static Color GetColorFromString(string color) {
+		    float red = Hex_to_Dec01(color.Substring(0,2));
+		    float green = Hex_to_Dec01(color.Substring(2,2));
+		    float blue = Hex_to_Dec01(color.Substring(4,2));
+            float alpha = 1f;
+            if (color.Length >= 8) {
+                // Color string contains alpha
+                alpha = Hex_to_Dec01(color.Substring(6,2));
+            }
+		    return new Color(red, green, blue, alpha);
+	    }
+
+        // Return a color going from Red to Yellow to Green, like a heat map
+        public static Color GetRedGreenColor(float value) {
+            float r = 0f;
+            float g = 0f;
+            if (value <= .5f) {
+                r = 1f;
+                g = value * 2f;
+            } else {
+                g = 1f;
+                r = 1f - (value - .5f) * 2f;
+            }
+            return new Color(r, g, 0f, 1f);
+        }
+
+
+        public static Color GetRandomColor() {
+            return new Color(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0f, 1f), 1f);
+        }
+
+        private static int sequencialColorIndex = -1;
+        private static Color[] sequencialColors = new[] {
+            GetColorFromString("26a6d5"),
+            GetColorFromString("41d344"),
+            GetColorFromString("e6e843"),
+            GetColorFromString("e89543"),
+            GetColorFromString("0f6ad0"),//("d34141"),
+		    GetColorFromString("b35db6"),
+            GetColorFromString("c45947"),
+            GetColorFromString("9447c4"),
+            GetColorFromString("4756c4"),
+        };
+
+        public static void ResetSequencialColors() {
+            sequencialColorIndex = -1;
+        }
+
+        public static Color GetSequencialColor() {
+            sequencialColorIndex = (sequencialColorIndex + 1) % sequencialColors.Length;
+            return sequencialColors[sequencialColorIndex];
+        }
+
+        public static Color GetColor255(float red, float green, float blue, float alpha = 255f) {
+            return new Color(red / 255f, green / 255f, blue / 255f, alpha / 255f);
+        }
+
+
+        // Generate random normalized direction
+        public static Vector3 GetRandomDir() {
+            return new Vector3(UnityEngine.Random.Range(-1f,1f), UnityEngine.Random.Range(-1f,1f)).normalized;
+        }
+
+        // Generate random normalized direction
+        public static Vector3 GetRandomDirXZ() {
+            return new Vector3(UnityEngine.Random.Range(-1f, 1f), 0, UnityEngine.Random.Range(-1f, 1f)).normalized;
+        }
+
+
+        public static Vector3 GetVectorFromAngle(int angle) {
+            // angle = 0 -> 360
+            float angleRad = angle * (Mathf.PI/180f);
+            return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad));
+        }
+        
+        public static Vector3 GetVectorFromAngle(float angle) {
+            // angle = 0 -> 360
+            float angleRad = angle * (Mathf.PI/180f);
+            return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad));
+        }
+        
+        public static Vector3 GetVectorFromAngleInt(int angle) {
+            // angle = 0 -> 360
+            float angleRad = angle * (Mathf.PI/180f);
+            return new Vector3(Mathf.Cos(angleRad), Mathf.Sin(angleRad));
+        }
+
+        public static float GetAngleFromVectorFloat(Vector3 dir) {
+            dir = dir.normalized;
+            float n = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
+            if (n < 0) n += 360;
+
+            return n;
+        }
+
+        public static float GetAngleFromVectorFloatXZ(Vector3 dir) {
+            dir = dir.normalized;
+            float n = Mathf.Atan2(dir.z, dir.x) * Mathf.Rad2Deg;
+            if (n < 0) n += 360;
+
+            return n;
+        }
+
+        public static int GetAngleFromVector(Vector3 dir) {
+            dir = dir.normalized;
+            float n = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
+            if (n < 0) n += 360;
+            int angle = Mathf.RoundToInt(n);
+
+            return angle;
+        }
+
+        public static int GetAngleFromVector180(Vector3 dir) {
+            dir = dir.normalized;
+            float n = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
+            int angle = Mathf.RoundToInt(n);
+
+            return angle;
+        }
+
+        public static Vector3 ApplyRotationToVector(Vector3 vec, Vector3 vecRotation) {
+            return ApplyRotationToVector(vec, GetAngleFromVectorFloat(vecRotation));
+        }
+
+        public static Vector3 ApplyRotationToVector(Vector3 vec, float angle) {
+            return Quaternion.Euler(0, 0, angle) * vec;
+        }
+
+        public static Vector3 ApplyRotationToVectorXZ(Vector3 vec, float angle) {
+            return Quaternion.Euler(0, angle, 0) * vec;
+        }
+
+
+
+        public static FunctionUpdater CreateMouseDraggingAction(Action<Vector3> onMouseDragging) {
+            return CreateMouseDraggingAction(0, onMouseDragging);
+        }
+
+        public static FunctionUpdater CreateMouseDraggingAction(int mouseButton, Action<Vector3> onMouseDragging) {
+            bool dragging = false;
+            return FunctionUpdater.Create(() => {
+                if (Input.GetMouseButtonDown(mouseButton)) {
+                    dragging = true;
+                }
+                if (Input.GetMouseButtonUp(mouseButton)) {
+                    dragging = false;
+                }
+                if (dragging) {
+                    onMouseDragging(UtilsClass.GetMouseWorldPosition());
+                }
+                return false; 
+            });
+        }
+
+        public static FunctionUpdater CreateMouseClickFromToAction(Action<Vector3, Vector3> onMouseClickFromTo, Action<Vector3, Vector3> onWaitingForToPosition) {
+            return CreateMouseClickFromToAction(0, 1, onMouseClickFromTo, onWaitingForToPosition);
+        }
+
+        public static FunctionUpdater CreateMouseClickFromToAction(int mouseButton, int cancelMouseButton, Action<Vector3, Vector3> onMouseClickFromTo, Action<Vector3, Vector3> onWaitingForToPosition) {
+            int state = 0;
+            Vector3 from = Vector3.zero;
+            return FunctionUpdater.Create(() => {
+                if (state == 1) {
+                    if (onWaitingForToPosition != null) onWaitingForToPosition(from, UtilsClass.GetMouseWorldPosition());
+                }
+                if (state == 1 && Input.GetMouseButtonDown(cancelMouseButton)) {
+                    // Cancel
+                    state = 0;
+                }
+                if (Input.GetMouseButtonDown(mouseButton) && !UtilsClass.IsPointerOverUI()) {
+                    if (state == 0) {
+                        state = 1;
+                        from = UtilsClass.GetMouseWorldPosition();
+                    } else {
+                        state = 0;
+                        onMouseClickFromTo(from, UtilsClass.GetMouseWorldPosition());
+                    }
+                }
+                return false; 
+            });
+        }
+
+        public static FunctionUpdater CreateMouseClickAction(Action<Vector3> onMouseClick) {
+            return CreateMouseClickAction(0, onMouseClick);
+        }
+
+        public static FunctionUpdater CreateMouseClickAction(int mouseButton, Action<Vector3> onMouseClick) {
+            return FunctionUpdater.Create(() => {
+                if (Input.GetMouseButtonDown(mouseButton)) {
+                    onMouseClick(GetWorldPositionFromUI());
+                }
+                return false; 
+            });
+        }
+
+        public static FunctionUpdater CreateKeyCodeAction(KeyCode keyCode, Action onKeyDown) {
+            return FunctionUpdater.Create(() => {
+                if (Input.GetKeyDown(keyCode)) {
+                    onKeyDown();
+                }
+                return false; 
+            });
+        }
+
+        
+
+        // Get UI Position from World Position
+        public static Vector2 GetWorldUIPosition(Vector3 worldPosition, Transform parent, Camera uiCamera, Camera worldCamera) {
+            Vector3 screenPosition = worldCamera.WorldToScreenPoint(worldPosition);
+            Vector3 uiCameraWorldPosition = uiCamera.ScreenToWorldPoint(screenPosition);
+            Vector3 localPos = parent.InverseTransformPoint(uiCameraWorldPosition);
+            return new Vector2(localPos.x, localPos.y);
+        }
+
+        public static Vector3 GetWorldPositionFromUIZeroZ() {
+            Vector3 vec = GetWorldPositionFromUI(Input.mousePosition, Camera.main);
+            vec.z = 0f;
+            return vec;
+        }
+
+        // Get World Position from UI Position
+        public static Vector3 GetWorldPositionFromUI() {
+            return GetWorldPositionFromUI(Input.mousePosition, Camera.main);
+        }
+
+        public static Vector3 GetWorldPositionFromUI(Camera worldCamera) {
+            return GetWorldPositionFromUI(Input.mousePosition, worldCamera);
+        }
+
+        public static Vector3 GetWorldPositionFromUI(Vector3 screenPosition, Camera worldCamera) {
+            Vector3 worldPosition = worldCamera.ScreenToWorldPoint(screenPosition);
+            return worldPosition;
+        }
+    
+        public static Vector3 GetWorldPositionFromUI_Perspective() {
+            return GetWorldPositionFromUI_Perspective(Input.mousePosition, Camera.main);
+        }
+
+        public static Vector3 GetWorldPositionFromUI_Perspective(Camera worldCamera) {
+            return GetWorldPositionFromUI_Perspective(Input.mousePosition, worldCamera);
+        }
+
+        public static Vector3 GetWorldPositionFromUI_Perspective(Vector3 screenPosition, Camera worldCamera) {
+            Ray ray = worldCamera.ScreenPointToRay(screenPosition);
+            Plane xy = new Plane(Vector3.forward, new Vector3(0, 0, 0f));
+            float distance;
+            xy.Raycast(ray, out distance);
+            return ray.GetPoint(distance);
+        }
+
+
+        // Screen Shake
+        public static void ShakeCamera(float intensity, float timer) {
+            Vector3 lastCameraMovement = Vector3.zero;
+            FunctionUpdater.Create(delegate () {
+                timer -= Time.unscaledDeltaTime;
+                Vector3 randomMovement = new Vector3(UnityEngine.Random.Range(-1f, 1f), UnityEngine.Random.Range(-1f, 1f)).normalized * intensity;
+                Camera.main.transform.position = Camera.main.transform.position - lastCameraMovement + randomMovement;
+                lastCameraMovement = randomMovement;
+                return timer <= 0f;
+            }, "CAMERA_SHAKE");
+        }
+
+
+        // Trigger an action next frame
+        public static FunctionUpdater ActionNextFrame(Action action) {
+            return FunctionUpdater.Create(() => {
+                action();
+                return true;
+            });
+        }
+
+        // Return random element from array
+        public static T GetRandom<T>(T[] array) {
+            return array[UnityEngine.Random.Range(0, array.Length)];
+        }
+
+
+        // Return a number with milli dots, 1000000 -> 1.000.000
+        public static string GetMilliDots(float n) {
+            return GetMilliDots((long)n);
+        }
+
+        public static string GetMilliDots(long n) {
+            string ret = n.ToString();
+            for (int i = 1; i <= Mathf.Floor(ret.Length / 4); i++) {
+                ret = ret.Substring(0, ret.Length - i * 3 - (i - 1)) + "." + ret.Substring(ret.Length - i * 3 - (i - 1));
+            }
+            return ret;
+        }
+
+
+        // Return with milli dots and dollar sign
+        public static string GetDollars(float n) {
+            return GetDollars((long)n);
+        }
+        public static string GetDollars(long n) {
+            if (n < 0)
+                return "-$" + GetMilliDots(Mathf.Abs(n));
+            else
+                return "$" + GetMilliDots(n);
+        }
+
+
+
+        [System.Serializable]
+        private class JsonDictionary {
+            public List<string> keyList = new List<string>();
+            public List<string> valueList = new List<string>();
+        }
+
+        // Take a Dictionary and return JSON string
+        public static string SaveDictionaryJson<TKey, TValue>(Dictionary<TKey, TValue> dictionary) {
+            JsonDictionary jsonDictionary = new JsonDictionary();
+            foreach (TKey key in dictionary.Keys) {
+                jsonDictionary.keyList.Add(JsonUtility.ToJson(key));
+                jsonDictionary.valueList.Add(JsonUtility.ToJson(dictionary[key]));
+            }
+            string saveJson = JsonUtility.ToJson(jsonDictionary);
+            return saveJson;
+        }
+
+        // Take a JSON string and return Dictionary<T1, T2>
+        public static Dictionary<TKey, TValue> LoadDictionaryJson<TKey, TValue>(string saveJson) {
+            JsonDictionary jsonDictionary = JsonUtility.FromJson<JsonDictionary>(saveJson);
+            Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>();
+            for (int i = 0; i < jsonDictionary.keyList.Count; i++) {
+                TKey key = JsonUtility.FromJson<TKey>(jsonDictionary.keyList[i]);
+                TValue value = JsonUtility.FromJson<TValue>(jsonDictionary.valueList[i]);
+                ret[key] = value;
+            }
+            return ret;
+        }
+
+
+        // Split a string into an array based on a Separator
+        public static string[] SplitString(string save, string separator) {
+            return save.Split(new string[] { separator }, System.StringSplitOptions.None);
+        }
+
+
+        // Destroy all children of this parent
+        public static void DestroyChildren(Transform parent) {
+            foreach (Transform transform in parent)
+                GameObject.Destroy(transform.gameObject);
+        }
+
+        // Destroy all children and randomize their names, useful if you want to do a Find() after calling destroy, since they only really get destroyed at the end of the frame
+        public static void DestroyChildrenRandomizeNames(Transform parent) {
+            foreach (Transform transform in parent) {
+                transform.name = "" + UnityEngine.Random.Range(10000, 99999);
+                GameObject.Destroy(transform.gameObject);
+            }
+        }
+
+        // Destroy all children except the ones with these names
+        public static void DestroyChildren(Transform parent, params string[] ignoreArr) {
+            foreach (Transform transform in parent) {
+                if (System.Array.IndexOf(ignoreArr, transform.name) == -1) // Don't ignore
+                    GameObject.Destroy(transform.gameObject);
+            }
+        }
+
+
+        // Set all parent and all children to this layer
+        public static void SetAllChildrenLayer(Transform parent, int layer) {
+            parent.gameObject.layer = layer;
+            foreach (Transform trans in parent) {
+                SetAllChildrenLayer(trans, layer);
+            }
+        }
+
+
+
+        // Returns a random script that can be used to id
+        public static string GetIdString() {
+            string alphabet = "0123456789abcdefghijklmnopqrstuvxywz";
+            string ret = "";
+            for (int i = 0; i < 8; i++) {
+                ret += alphabet[UnityEngine.Random.Range(0, alphabet.Length)];
+            }
+            return ret;
+        }
+
+        // Returns a random script that can be used to id (bigger alphabet)
+        public static string GetIdStringLong() {
+            return GetIdStringLong(10);
+        }
+
+        // Returns a random script that can be used to id (bigger alphabet)
+        public static string GetIdStringLong(int chars) {
+            string alphabet = "0123456789abcdefghijklmnopqrstuvxywzABCDEFGHIJKLMNOPQRSTUVXYWZ";
+            string ret = "";
+            for (int i = 0; i < chars; i++) {
+                ret += alphabet[UnityEngine.Random.Range(0, alphabet.Length)];
+            }
+            return ret;
+        }
+
+
+
+        // Get a random male name and optionally single letter surname
+        public static string GetRandomName(bool withSurname = false) {
+            List<string> firstNameList = new List<string>(){"Gabe","Cliff","Tim","Ron","Jon","John","Mike","Seth","Alex","Steve","Chris","Will","Bill","James","Jim",
+                                        "Ahmed","Omar","Peter","Pierre","George","Lewis","Lewie","Adam","William","Ali","Eddie","Ed","Dick","Robert","Bob","Rob",
+                                        "Neil","Tyson","Carl","Chris","Christopher","Jensen","Gordon","Morgan","Richard","Wen","Wei","Luke","Lucas","Noah","Ivan","Yusuf",
+                                        "Ezio","Connor","Milan","Nathan","Victor","Harry","Ben","Charles","Charlie","Jack","Leo","Leonardo","Dylan","Steven","Jeff",
+                                        "Alex","Mark","Leon","Oliver","Danny","Liam","Joe","Tom","Thomas","Bruce","Clark","Tyler","Jared","Brad","Jason"};
+
+            if (!withSurname) {
+                return firstNameList[UnityEngine.Random.Range(0, firstNameList.Count)];
+            } else {
+                string alphabet = "ABCDEFGHIJKLMNOPQRSTUVXYWZ";
+                return firstNameList[UnityEngine.Random.Range(0, firstNameList.Count)] + " " + alphabet[UnityEngine.Random.Range(0, alphabet.Length)] + ".";
+            }
+        }
+
+
+
+
+        public static string GetRandomCityName() {
+            List<string> cityNameList = new List<string>(){"Alabama","New York","Old York","Bangkok","Lisbon","Vee","Agen","Agon","Ardok","Arbok",
+                            "Kobra","House","Noun","Hayar","Salma","Chancellor","Dascomb","Payn","Inglo","Lorr","Ringu",
+                            "Brot","Mount Loom","Kip","Chicago","Madrid","London","Gam",
+                            "Greenvile","Franklin","Clinton","Springfield","Salem","Fairview","Fairfax","Washington","Madison",
+                            "Georgetown","Arlington","Marion","Oxford","Harvard","Valley","Ashland","Burlington","Manchester","Clayton",
+                            "Milton","Auburn","Dayton","Lexington","Milford","Riverside","Cleveland","Dover","Hudson","Kingston","Mount Vernon",
+                            "Newport","Oakland","Centerville","Winchester","Rotary","Bailey","Saint Mary","Three Waters","Veritas","Chaos","Center",
+                            "Millbury","Stockland","Deerstead Hills","Plaintown","Fairchester","Milaire View","Bradton","Glenfield","Kirkmore",
+                            "Fortdell","Sharonford","Inglewood","Englecamp","Harrisvania","Bosstead","Brookopolis","Metropolis","Colewood","Willowbury",
+                            "Hearthdale","Weelworth","Donnelsfield","Greenline","Greenwich","Clarkswich","Bridgeworth","Normont",
+                            "Lynchbrook","Ashbridge","Garfort","Wolfpain","Waterstead","Glenburgh","Fortcroft","Kingsbank","Adamstead","Mistead",
+                            "Old Crossing","Crossing","New Agon","New Agen","Old Agon","New Valley","Old Valley","New Kingsbank","Old Kingsbank",
+            "New Dover","Old Dover","New Burlington","Shawshank","Old Shawshank","New Shawshank","New Bradton", "Old Bradton","New Metropolis","Old Clayton","New Clayton"
+        };
+            return cityNameList[UnityEngine.Random.Range(0, cityNameList.Count)];
+        }
+
+
+
+        // Is this position inside the FOV? Top Down Perspective
+        public static bool IsPositionInsideFov(Vector3 pos, Vector3 aimDir, Vector3 posTarget, float fov) {
+            int aimAngle = UtilsClass.GetAngleFromVector180(aimDir);
+            int angle = UtilsClass.GetAngleFromVector180(posTarget - pos);
+            int angleDifference = (angle - aimAngle);
+            if (angleDifference > 180) angleDifference -= 360;
+            if (angleDifference < -180) angleDifference += 360;
+            if (!(angleDifference < fov / 2f && angleDifference > -fov / 2f)) {
+                // Not inside fov
+                return false;
+            } else {
+                // Inside fov
+                return true;
+            }
+        }
+
+        // Take two color arrays (pixels) and merge them
+        public static void MergeColorArrays(Color[] baseArray, Color[] overlay) {
+            for (int i = 0; i < baseArray.Length; i++) {
+                if (overlay[i].a > 0) {
+                    // Not empty color
+                    if (overlay[i].a >= 1) {
+                        // Fully replace
+                        baseArray[i] = overlay[i];
+                    } else {
+                        // Interpolate colors
+                        float alpha = overlay[i].a;
+                        baseArray[i].r += (overlay[i].r - baseArray[i].r) * alpha;
+                        baseArray[i].g += (overlay[i].g - baseArray[i].g) * alpha;
+                        baseArray[i].b += (overlay[i].b - baseArray[i].b) * alpha;
+                        baseArray[i].a += overlay[i].a;
+                    }
+                }
+            }
+        }
+
+        // Replace color in baseArray with replaceArray if baseArray[i] != ignoreColor
+        public static void ReplaceColorArrays(Color[] baseArray, Color[] replaceArray, Color ignoreColor) {
+            for (int i = 0; i < baseArray.Length; i++) {
+                if (baseArray[i] != ignoreColor) {
+                    baseArray[i] = replaceArray[i];
+                }
+            }
+        }
+
+        public static void MaskColorArrays(Color[] baseArray, Color[] mask) {
+            for (int i = 0; i < baseArray.Length; i++) {
+                if (baseArray[i].a > 0f) {
+                    baseArray[i].a = mask[i].a;
+                }
+            }
+        }
+
+        public static void TintColorArray(Color[] baseArray, Color tint) {
+            for (int i = 0; i < baseArray.Length; i++) {
+                // Apply tint
+                baseArray[i].r = tint.r * baseArray[i].r;
+                baseArray[i].g = tint.g * baseArray[i].g;
+                baseArray[i].b = tint.b * baseArray[i].b;
+            }
+        }
+        public static void TintColorArrayInsideMask(Color[] baseArray, Color tint, Color[] mask) {
+            for (int i = 0; i < baseArray.Length; i++) {
+                if (mask[i].a > 0) {
+                    // Apply tint
+                    Color baseColor = baseArray[i];
+                    Color fullyTintedColor = tint * baseColor;
+                    float interpolateAmount = mask[i].a;
+                    baseArray[i].r = baseColor.r + (fullyTintedColor.r - baseColor.r) * interpolateAmount;
+                    baseArray[i].g = baseColor.g + (fullyTintedColor.g - baseColor.g) * interpolateAmount;
+                    baseArray[i].b = baseColor.b + (fullyTintedColor.b - baseColor.b) * interpolateAmount;
+                }
+            }
+        }
+
+        public static Color TintColor(Color baseColor, Color tint) {
+            // Apply tint
+            baseColor.r = tint.r * baseColor.r;
+            baseColor.g = tint.g * baseColor.g;
+            baseColor.b = tint.b * baseColor.b;
+
+            return baseColor;
+        }
+
+        public static bool IsColorSimilar255(Color colorA, Color colorB, int maxDiff) {
+            return IsColorSimilar(colorA, colorB, maxDiff / 255f);
+        }
+
+        public static bool IsColorSimilar(Color colorA, Color colorB, float maxDiff) {
+            float rDiff = Mathf.Abs(colorA.r - colorB.r);
+            float gDiff = Mathf.Abs(colorA.g - colorB.g);
+            float bDiff = Mathf.Abs(colorA.b - colorB.b);
+            float aDiff = Mathf.Abs(colorA.a - colorB.a);
+
+            float totalDiff = rDiff + gDiff + bDiff + aDiff;
+            return totalDiff < maxDiff;
+        }
+
+        public static float GetColorDifference(Color colorA, Color colorB) {
+            float rDiff = Mathf.Abs(colorA.r - colorB.r);
+            float gDiff = Mathf.Abs(colorA.g - colorB.g);
+            float bDiff = Mathf.Abs(colorA.b - colorB.b);
+            float aDiff = Mathf.Abs(colorA.a - colorB.a);
+
+            float totalDiff = rDiff + gDiff + bDiff + aDiff;
+            return totalDiff;
+        }
+
+
+
+        public static Vector3 GetRandomPositionWithinRectangle(float xMin, float xMax, float yMin, float yMax) {
+            return new Vector3(UnityEngine.Random.Range(xMin, xMax), UnityEngine.Random.Range(yMin, yMax));
+        }
+
+        public static Vector3 GetRandomPositionWithinRectangle(Vector3 lowerLeft, Vector3 upperRight) {
+            return new Vector3(UnityEngine.Random.Range(lowerLeft.x, upperRight.x), UnityEngine.Random.Range(lowerLeft.y, upperRight.y));
+        }
+
+
+
+
+
+        public static string GetTimeHMS(float time, bool hours = true, bool minutes = true, bool seconds = true, bool milliseconds = true) {
+            string h0, h1, m0, m1, s0, s1, ms0, ms1, ms2;
+            GetTimeCharacterStrings(time, out h0, out h1, out m0, out m1, out s0, out s1, out ms0, out ms1, out ms2);
+            string h = h0 + h1;
+            string m = m0 + m1;
+            string s = s0 + s1;
+            string ms = ms0 + ms1 + ms2;
+
+            if (hours) {
+                if (minutes) {
+                    if (seconds) {
+                        if (milliseconds) {
+                            return h + ":" + m + ":" + s + "." + ms;
+                        } else {
+                            return h + ":" + m + ":" + s;
+                        }
+                    } else {
+                        return h + ":" + m;
+                    }
+                } else {
+                    return h;
+                }
+            } else {
+                if (minutes) {
+                    if (seconds) {
+                        if (milliseconds) {
+                            return m + ":" + s + "." + ms;
+                        } else {
+                            return m + ":" + s;
+                        }
+                    } else {
+                        return m;
+                    }
+                } else {
+                    if (seconds) {
+                        if (milliseconds) {
+                            return s + "." + ms;
+                        } else {
+                            return s;
+                        }
+                    } else {
+                        return ms;
+                    }
+                }
+            }
+        }
+
+        public static void SetupTimeHMSTransform(Transform transform, float time) {
+            string h0, h1, m0, m1, s0, s1, ms0, ms1, ms2;
+            GetTimeCharacterStrings(time, out h0, out h1, out m0, out m1, out s0, out s1, out ms0, out ms1, out ms2);
+
+            if (transform.Find("h0") != null && transform.Find("h0").GetComponent<Text>() != null)
+                transform.Find("h0").GetComponent<Text>().text = h0;
+            if (transform.Find("h1") != null && transform.Find("h1").GetComponent<Text>() != null)
+                transform.Find("h1").GetComponent<Text>().text = h1;
+
+            if (transform.Find("m0") != null && transform.Find("m0").GetComponent<Text>() != null)
+                transform.Find("m0").GetComponent<Text>().text = m0;
+            if (transform.Find("m1") != null && transform.Find("m1").GetComponent<Text>() != null)
+                transform.Find("m1").GetComponent<Text>().text = m1;
+
+            if (transform.Find("s0") != null && transform.Find("s0").GetComponent<Text>() != null)
+                transform.Find("s0").GetComponent<Text>().text = s0;
+            if (transform.Find("s1") != null && transform.Find("s1").GetComponent<Text>() != null)
+                transform.Find("s1").GetComponent<Text>().text = s1;
+
+            if (transform.Find("ms0") != null && transform.Find("ms0").GetComponent<Text>() != null)
+                transform.Find("ms0").GetComponent<Text>().text = ms0;
+            if (transform.Find("ms1") != null && transform.Find("ms1").GetComponent<Text>() != null)
+                transform.Find("ms1").GetComponent<Text>().text = ms1;
+            if (transform.Find("ms2") != null && transform.Find("ms2").GetComponent<Text>() != null)
+                transform.Find("ms2").GetComponent<Text>().text = ms2;
+        }
+
+        public static void GetTimeHMS(float time, out int h, out int m, out int s, out int ms) {
+            s = Mathf.FloorToInt(time);
+            m = Mathf.FloorToInt(s / 60f);
+            h = Mathf.FloorToInt((s / 60f) / 60f);
+            s = s - m * 60;
+            m = m - h * 60;
+            ms = (int)((time - Mathf.FloorToInt(time)) * 1000);
+        }
+
+        public static void GetTimeCharacterStrings(float time, out string h0, out string h1, out string m0, out string m1, out string s0, out string s1, out string ms0, out string ms1, out string ms2) {
+            int s = Mathf.FloorToInt(time);
+            int m = Mathf.FloorToInt(s / 60f);
+            int h = Mathf.FloorToInt((s / 60f) / 60f);
+            s = s - m * 60;
+            m = m - h * 60;
+            int ms = (int)((time - Mathf.FloorToInt(time)) * 1000);
+
+            if (h < 10) {
+                h0 = "0";
+                h1 = "" + h;
+            } else {
+                h0 = "" + Mathf.FloorToInt(h / 10f);
+                h1 = "" + (h - Mathf.FloorToInt(h / 10f) * 10);
+            }
+
+            if (m < 10) {
+                m0 = "0";
+                m1 = "" + m;
+            } else {
+                m0 = "" + Mathf.FloorToInt(m / 10f);
+                m1 = "" + (m - Mathf.FloorToInt(m / 10f) * 10);
+            }
+
+            if (s < 10) {
+                s0 = "0";
+                s1 = "" + s;
+            } else {
+                s0 = "" + Mathf.FloorToInt(s / 10f);
+                s1 = "" + (s - Mathf.FloorToInt(s / 10f) * 10);
+            }
+
+
+            if (ms < 10) {
+                ms0 = "0";
+                ms1 = "0";
+                ms2 = "" + ms;
+            } else {
+                // >= 10
+                if (ms < 100) {
+                    ms0 = "0";
+                    ms1 = "" + Mathf.FloorToInt(ms / 10f);
+                    ms2 = "" + (ms - Mathf.FloorToInt(ms / 10f) * 10);
+                } else {
+                    // >= 100
+                    int _i_ms0 = Mathf.FloorToInt(ms / 100f);
+                    int _i_ms1 = Mathf.FloorToInt(ms / 10f) - (_i_ms0 * 10);
+                    int _i_ms2 = ms - (_i_ms1 * 10) - (_i_ms0 * 100);
+                    ms0 = "" + _i_ms0;
+                    ms1 = "" + _i_ms1;
+                    ms2 = "" + _i_ms2;
+                }
+            }
+        }
+
+        public static void PrintTimeMilliseconds(float startTime, string prefix = "") {
+            Debug.Log(prefix + GetTimeMilliseconds(startTime));
+        }
+
+        public static float GetTimeMilliseconds(float startTime) {
+            return (Time.realtimeSinceStartup - startTime) * 1000f;
+        }
+
+
+
+
+
+        public static List<Vector3> GetPositionListAround(Vector3 position, float distance, int positionCount) {
+            List<Vector3> ret = new List<Vector3>();
+            for (int i = 0; i < positionCount; i++) {
+                int angle = i * (360 / positionCount);
+                Vector3 dir = UtilsClass.ApplyRotationToVector(new Vector3(0, 1), angle);
+                Vector3 pos = position + dir * distance;
+                ret.Add(pos);
+            }
+            return ret;
+        }
+
+        public static List<Vector3> GetPositionListAround(Vector3 position, float[] ringDistance, int[] ringPositionCount) {
+            List<Vector3> ret = new List<Vector3>();
+            for (int ring = 0; ring < ringPositionCount.Length; ring++) {
+                List<Vector3> ringPositionList = GetPositionListAround(position, ringDistance[ring], ringPositionCount[ring]);
+                ret.AddRange(ringPositionList);
+            }
+            return ret;
+        }
+
+        public static List<Vector3> GetPositionListAround(Vector3 position, float distance, int positionCount, Vector3 direction, int angleStart, int angleIncrease) {
+            List<Vector3> ret = new List<Vector3>();
+            for (int i = 0; i < positionCount; i++) {
+                int angle = angleStart + angleIncrease * i;
+                Vector3 dir = UtilsClass.ApplyRotationToVector(direction, angle);
+                Vector3 pos = position + dir * distance;
+                ret.Add(pos);
+            }
+            return ret;
+        }
+
+        public static List<Vector3> GetPositionListAlongDirection(Vector3 position, Vector3 direction, float distancePerPosition, int positionCount) {
+            List<Vector3> ret = new List<Vector3>();
+            for (int i = 0; i < positionCount; i++) {
+                Vector3 pos = position + direction * (distancePerPosition * i);
+                ret.Add(pos);
+            }
+            return ret;
+        }
+
+        public static List<Vector3> GetPositionListAlongAxis(Vector3 positionStart, Vector3 positionEnd, int positionCount) {
+            Vector3 direction = (positionEnd - positionStart).normalized;
+            float distancePerPosition = (positionEnd - positionStart).magnitude / positionCount;
+            return GetPositionListAlongDirection(positionStart + direction * (distancePerPosition / 2f), direction, distancePerPosition, positionCount);
+        }
+
+        public static List<Vector3> GetPositionListWithinRect(Vector3 lowerLeft, Vector3 upperRight, int positionCount) {
+            List<Vector3> ret = new List<Vector3>();
+            float width = upperRight.x - lowerLeft.x;
+            float height = upperRight.y - lowerLeft.y;
+            float area = width * height;
+            float areaPerPosition = area / positionCount;
+            float positionSquareSize = Mathf.Sqrt(areaPerPosition);
+            Vector3 rowLeft, rowRight;
+            rowLeft = new Vector3(lowerLeft.x, lowerLeft.y);
+            rowRight = new Vector3(upperRight.x, lowerLeft.y);
+            int rowsTotal = Mathf.RoundToInt(height / positionSquareSize);
+            float increaseY = height / rowsTotal;
+            rowLeft.y += increaseY / 2f;
+            rowRight.y += increaseY / 2f;
+            int positionsPerRow = Mathf.RoundToInt(width / positionSquareSize);
+            for (int i = 0; i < rowsTotal; i++) {
+                ret.AddRange(GetPositionListAlongAxis(rowLeft, rowRight, positionsPerRow));
+                rowLeft.y += increaseY;
+                rowRight.y += increaseY;
+            }
+            int missingPositions = positionCount - ret.Count;
+            Vector3 angleDir = (upperRight - lowerLeft) / missingPositions;
+            for (int i = 0; i < missingPositions; i++) {
+                ret.Add(lowerLeft + (angleDir / 2f) + angleDir * i);
+            }
+            while (ret.Count > positionCount) {
+                ret.RemoveAt(UnityEngine.Random.Range(0, ret.Count));
+            }
+            return ret;
+        }
+
+
+
+        public static List<Vector2Int> GetPosXYListDiamond(int size) {
+            List<Vector2Int> list = new List<Vector2Int>();
+            for (int x = 0; x < size; x++) {
+                for (int y = 0; y < size - x; y++) {
+                    list.Add(new Vector2Int(x, y));
+                    list.Add(new Vector2Int(-x, y));
+                    list.Add(new Vector2Int(x, -y));
+                    list.Add(new Vector2Int(-x, -y));
+                }
+            }
+            return list;
+        }
+
+        public static List<Vector2Int> GetPosXYListOblong(int width, int dropXamount, int increaseDropXamount, Vector3 dir) {
+            List<Vector2Int> list = GetPosXYListOblong(width, dropXamount, increaseDropXamount);
+            list = RotatePosXYList(list, UtilsClass.GetAngleFromVector(dir));
+            return list;
+        }
+
+        public static List<Vector2Int> GetPosXYListOblong(int width, int dropXamount, int increaseDropXamount) {
+            List<Vector2Int> triangle = GetPosXYListTriangle(width, dropXamount, increaseDropXamount);
+            List<Vector2Int> list = new List<Vector2Int>(triangle);
+            foreach (Vector2Int posXY in triangle) {
+                if (posXY.y == 0) continue;
+                list.Add(new Vector2Int(posXY.x, -posXY.y));
+            }
+            foreach (Vector2Int posXY in new List<Vector2Int>(list)) {
+                if (posXY.x == 0) continue;
+                list.Add(new Vector2Int(-posXY.x, posXY.y));
+            }
+            return list;
+        }
+
+        public static List<Vector2Int> GetPosXYListTriangle(int width, int dropXamount, int increaseDropXamount) {
+            List<Vector2Int> list = new List<Vector2Int>();
+            for (int i = 0; i > -999; i--) {
+                for (int j = 0; j < width; j++) {
+                    list.Add(new Vector2Int(j, i));
+                }
+                width -= dropXamount;
+                dropXamount += increaseDropXamount;
+                if (width <= 0) break;
+            }
+            return list;
+        }
+
+        public static List<Vector2Int> RotatePosXYList(List<Vector2Int> list, int angle) {
+            List<Vector2Int> ret = new List<Vector2Int>();
+            for (int i = 0; i < list.Count; i++) {
+                Vector2Int posXY = list[i];
+                Vector3 vec = UtilsClass.ApplyRotationToVector(new Vector3(posXY.x, posXY.y), angle);
+                ret.Add(new Vector2Int(Mathf.RoundToInt(vec.x), Mathf.RoundToInt(vec.y)));
+            }
+            return ret;
+        }
+
+
+
+
+
+
+        public static Transform CloneTransform(Transform transform, string name = null) {
+            Transform clone = GameObject.Instantiate(transform, transform.parent);
+
+            if (name != null)
+                clone.name = name;
+            else
+                clone.name = transform.name;
+
+            return clone;
+        }
+
+        public static Transform CloneTransform(Transform transform, string name, Vector2 newAnchoredPosition, bool setActiveTrue = false) {
+            Transform clone = CloneTransform(transform, name);
+            clone.GetComponent<RectTransform>().anchoredPosition = newAnchoredPosition;
+            if (setActiveTrue) {
+                clone.gameObject.SetActive(true);
+            }
+            return clone;
+        }
+
+        public static Transform CloneTransform(Transform transform, Transform newParent, string name = null) {
+            Transform clone = GameObject.Instantiate(transform, newParent);
+
+            if (name != null)
+                clone.name = name;
+            else
+                clone.name = transform.name;
+
+            return clone;
+        }
+
+        public static Transform CloneTransform(Transform transform, Transform newParent, string name, Vector2 newAnchoredPosition, bool setActiveTrue = false) {
+            Transform clone = CloneTransform(transform, newParent, name);
+            clone.GetComponent<RectTransform>().anchoredPosition = newAnchoredPosition;
+            if (setActiveTrue) {
+                clone.gameObject.SetActive(true);
+            }
+            return clone;
+        }
+
+        public static Transform CloneTransformWorld(Transform transform, Transform newParent, string name, Vector3 newLocalPosition) {
+            Transform clone = CloneTransform(transform, newParent, name);
+            clone.localPosition = newLocalPosition;
+            return clone;
+        }
+
+
+
+        public static T[] ArrayAdd<T>(T[] arr, T add) {
+            T[] ret = new T[arr.Length + 1];
+            for (int i = 0; i < arr.Length; i++) {
+                ret[i] = arr[i];
+            }
+            ret[arr.Length] = add;
+            return ret;
+        }
+
+        public static void ShuffleArray<T>(T[] arr, int iterations) {
+            for (int i = 0; i < iterations; i++) {
+                int rnd = UnityEngine.Random.Range(0, arr.Length);
+                T tmp = arr[rnd];
+                arr[rnd] = arr[0];
+                arr[0] = tmp;
+            }
+        }
+        public static void ShuffleArray<T>(T[] arr, int iterations, System.Random random) {
+            for (int i = 0; i < iterations; i++) {
+                int rnd = random.Next(0, arr.Length);
+                T tmp = arr[rnd];
+                arr[rnd] = arr[0];
+                arr[0] = tmp;
+            }
+        }
+
+        public static void ShuffleList<T>(List<T> list, int iterations) {
+            for (int i = 0; i < iterations; i++) {
+                int rnd = UnityEngine.Random.Range(0, list.Count);
+                T tmp = list[rnd];
+                list[rnd] = list[0];
+                list[0] = tmp;
+            }
+        }
+
+
+        public static void DebugDrawCircle(Vector3 center, float radius, Color color, float duration, int divisions) {
+            for (int i = 0; i <= divisions; i++) {
+                Vector3 vec1 = center + UtilsClass.ApplyRotationToVector(new Vector3(0, 1) * radius, (360f / divisions) * i);
+                Vector3 vec2 = center + UtilsClass.ApplyRotationToVector(new Vector3(0, 1) * radius, (360f / divisions) * (i + 1));
+                Debug.DrawLine(vec1, vec2, color, duration);
+            }
+        }
+
+        public static void DebugDrawRectangle(Vector3 minXY, Vector3 maxXY, Color color, float duration) {
+            Debug.DrawLine(new Vector3(minXY.x, minXY.y), new Vector3(maxXY.x, minXY.y), color, duration);
+            Debug.DrawLine(new Vector3(minXY.x, minXY.y), new Vector3(minXY.x, maxXY.y), color, duration);
+            Debug.DrawLine(new Vector3(minXY.x, maxXY.y), new Vector3(maxXY.x, maxXY.y), color, duration);
+            Debug.DrawLine(new Vector3(maxXY.x, minXY.y), new Vector3(maxXY.x, maxXY.y), color, duration);
+        }
+
+        public static void DebugDrawText(string text, Vector3 position, Color color, float size, float duration) {
+            text = text.ToUpper();
+            float kerningSize = size * 0.6f;
+            Vector3 basePosition = position;
+            for (int i = 0; i < text.Length; i++) {
+                char c = text[i];
+                switch (c) {
+                    case '\n':
+                        // Newline
+                        position.x = basePosition.x;
+                        position.y += size;
+                        break;
+                    case ' ':
+                        position.x += kerningSize;
+                        break;
+                    default:
+                        DebugDrawChar(c, position, color, size, duration);
+                        position.x += kerningSize;
+                        break;
+                }
+            }
+        }
+
+        // Draw Characters using Debug DrawLine Gizmos
+        public static void DebugDrawChar(char c, Vector3 position, Color color, float size, float duration) {
+            switch (c) {
+                default:
+                case 'A':
+                    DebugDrawLines(position, color, size, duration, new[] {
+                0.317f,0.041f, 0.5f,0.98f, 0.749f,0.062f, 0.625f,0.501f, 0.408f,0.507f }); break;
+                case 'B':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.289f,0.069f, 0.274f,0.937f, 0.609f,0.937f, 0.801f,0.879f, 0.829f,0.708f, 0.756f,0.538f, 0.655f,0.492f, 0.442f,0.495f, 0.271f,0.495f, 0.567f,0.474f, 0.676f,0.465f, 0.722f,0.385f, 0.719f,0.181f, 0.664f,0.087f, 0.527f,0.053f, 0.396f,0.05f, 0.271f,0.078f }); break;
+                case 'C':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.695f,0.946f, 0.561f,0.949f, 0.426f,0.937f, 0.317f,0.867f, 0.265f,0.733f, 0.262f,0.553f, 0.292f,0.27f, 0.323f,0.172f, 0.417f,0.12f, 0.512f,0.096f, 0.637f,0.093f, 0.743f,0.117f, }); break;
+                case 'D':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.314f,0.909f, 0.329f,0.096f, 0.53f,0.123f, 0.594f,0.197f, 0.673f,0.334f, 0.716f,0.498f, 0.692f,0.666f, 0.609f,0.806f, 0.457f,0.891f, 0.323f,0.919f }); break;
+                case 'E':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.344f,0.919f, 0.363f,0.078f, 0.713f,0.096f, 0.359f,0.096f, 0.347f,0.48f, 0.53f,0.492f, 0.356f,0.489f, 0.338f,0.913f, 0.625f,0.919f }); break;
+                case 'F':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.682f,0.916f, 0.329f,0.909f, 0.341f,0.66f, 0.503f,0.669f, 0.341f,0.669f, 0.317f,0.087f }); break;
+                case 'G':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.618f,0.867f, 0.399f,0.849f, 0.292f,0.654f, 0.241f,0.404f, 0.253f,0.178f, 0.481f,0.075f, 0.612f,0.078f, 0.725f,0.169f, 0.728f,0.334f, 0.71f,0.437f, 0.609f,0.462f, 0.463f,0.462f }); break;
+                case 'H':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.277f,0.876f, 0.305f,0.133f, 0.295f,0.507f, 0.628f,0.501f, 0.643f,0.139f, 0.637f,0.873f }); break;
+                case 'I':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.487f,0.906f, 0.484f,0.096f }); break;
+                case 'J':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.628f,0.882f, 0.679f,0.242f, 0.603f,0.114f, 0.445f,0.066f, 0.317f,0.114f, 0.262f,0.209f, 0.253f,0.3f, 0.259f,0.367f }); break;
+                case 'K':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.292f,0.879f, 0.311f,0.111f, 0.305f,0.498f, 0.594f,0.876f, 0.305f,0.516f, 0.573f,0.154f,  }); break;
+                case 'L':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.311f,0.879f, 0.308f,0.133f, 0.682f,0.148f,  }); break;
+                case 'M':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.262f,0.12f, 0.265f,0.909f, 0.509f,0.608f, 0.71f,0.919f, 0.713f,0.151f,  }); break;
+                case 'N':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.737f,0.885f, 0.679f,0.114f, 0.335f,0.845f, 0.353f,0.175f,  }); break;
+                case 'O':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.609f,0.906f, 0.396f,0.894f, 0.271f,0.687f, 0.232f,0.474f, 0.241f,0.282f, 0.356f,0.142f, 0.527f,0.087f, 0.655f,0.09f, 0.719f,0.181f, 0.737f,0.379f, 0.737f,0.638f, 0.71f,0.836f, 0.628f,0.919f, 0.582f,0.919f, }); break;
+                case 'P':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.314f,0.129f, 0.311f,0.873f, 0.658f,0.906f, 0.746f,0.8f, 0.746f,0.66f, 0.673f,0.544f, 0.509f,0.51f, 0.359f,0.51f, 0.311f,0.516f,  }); break;
+                case 'Q':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.497f,0.925f, 0.335f,0.894f, 0.228f,0.681f, 0.213f,0.379f, 0.25f,0.145f, 0.396f,0.096f, 0.573f,0.105f, 0.631f,0.166f, 0.542f,0.245f, 0.752f,0.108f, 0.628f,0.187f, 0.685f,0.261f, 0.728f,0.398f, 0.759f,0.605f, 0.722f,0.794f, 0.64f,0.916f, 0.475f,0.946f,  }); break;
+                case 'R':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.347f,0.142f, 0.332f,0.9f, 0.667f,0.897f, 0.698f,0.699f, 0.655f,0.58f, 0.521f,0.553f, 0.396f,0.553f, 0.344f,0.553f, 0.564f,0.37f, 0.655f,0.206f, 0.71f,0.169f }); break;
+                case 'S':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.695f,0.842f, 0.576f,0.882f, 0.439f,0.885f, 0.329f,0.8f, 0.289f,0.626f, 0.317f,0.489f, 0.439f,0.44f, 0.621f,0.434f, 0.695f,0.358f, 0.713f,0.224f, 0.646f,0.111f, 0.494f,0.093f, 0.338f,0.105f, 0.289f,0.151f, }); break;
+                case 'T':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.497f,0.172f, 0.5f,0.864f, 0.286f,0.858f, 0.719f,0.852f,  }); break;
+                case 'U':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.232f,0.858f, 0.247f,0.251f, 0.366f,0.105f, 0.466f,0.078f, 0.615f,0.084f, 0.704f,0.123f, 0.746f,0.276f, 0.74f,0.559f, 0.737f,0.806f, 0.722f,0.864f, }); break;
+                case 'V':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.238f,0.855f, 0.494f,0.105f, 0.707f,0.855f,  }); break;
+                case 'X':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.783f,0.852f, 0.256f,0.133f, 0.503f,0.498f, 0.305f,0.824f, 0.789f,0.117f,  }); break;
+                case 'Y':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.299f,0.842f, 0.497f,0.529f, 0.646f,0.842f, 0.49f,0.541f, 0.487f,0.105f, }); break;
+                case 'W':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.228f,0.815f, 0.381f,0.093f, 0.503f,0.434f, 0.615f,0.151f, 0.722f,0.818f,  }); break;
+                case 'Z':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.25f,0.87f, 0.795f,0.842f, 0.274f,0.133f, 0.716f,0.142f }); break;
+
+
+                case '0':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.536f,0.891f, 0.509f,0.891f, 0.42f,0.809f, 0.378f,0.523f, 0.372f,0.215f, 0.448f,0.087f, 0.539f,0.069f, 0.609f,0.099f, 0.637f,0.242f, 0.646f,0.416f, 0.646f,0.608f, 0.631f,0.809f, 0.554f,0.888f, 0.527f,0.894f,  }); break;
+                case '1':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.652f,0.108f, 0.341f,0.114f, 0.497f,0.12f, 0.497f,0.855f, 0.378f,0.623f,  }); break;
+                case '2':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.311f,0.714f, 0.375f,0.83f, 0.564f,0.894f, 0.722f,0.839f, 0.765f,0.681f, 0.634f,0.483f, 0.5f,0.331f, 0.366f,0.245f, 0.299f,0.126f, 0.426f,0.126f, 0.621f,0.136f, 0.679f,0.136f, 0.737f,0.139f,  }); break;
+                case '3':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.289f,0.855f, 0.454f,0.876f, 0.606f,0.818f, 0.685f,0.702f, 0.664f,0.547f, 0.564f,0.459f, 0.484f,0.449f, 0.417f,0.455f, 0.53f,0.434f, 0.655f,0.355f, 0.664f,0.233f, 0.591f,0.105f, 0.466f,0.075f, 0.335f,0.084f, 0.259f,0.142f,  }); break;
+                case '4':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.353f,0.836f, 0.262f,0.349f, 0.579f,0.367f, 0.5f,0.376f, 0.49f,0.471f, 0.509f,0.069f,  }); break;
+                case '5':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.67f,0.852f, 0.335f,0.858f, 0.347f,0.596f, 0.582f,0.602f, 0.698f,0.513f, 0.749f,0.343f, 0.719f,0.187f, 0.561f,0.133f, 0.363f,0.151f,  }); break;
+                case '6':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.567f,0.888f, 0.442f,0.782f, 0.35f,0.544f, 0.326f,0.288f, 0.39f,0.157f, 0.615f,0.142f, 0.679f,0.245f, 0.676f,0.37f, 0.573f,0.48f, 0.454f,0.48f, 0.378f,0.41f, 0.335f,0.367f,  }); break;
+                case '7':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.286f,0.852f, 0.731f,0.864f, 0.417f,0.117f, 0.57f,0.498f, 0.451f,0.483f, 0.688f,0.501f, }); break;
+                case '8':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.518f,0.541f, 0.603f,0.623f, 0.649f,0.748f, 0.612f,0.858f, 0.497f,0.888f, 0.375f,0.824f, 0.341f,0.708f, 0.381f,0.611f, 0.494f,0.55f, 0.557f,0.513f, 0.6f,0.416f, 0.631f,0.312f, 0.579f,0.178f, 0.509f,0.108f, 0.436f,0.102f, 0.335f,0.181f, 0.308f,0.279f, 0.347f,0.401f, 0.423f,0.486f, 0.497f,0.547f,  }); break;
+                case '9':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.475f,0.129f, 0.573f,0.495f, 0.646f,0.824f, 0.509f,0.97f, 0.28f,0.94f, 0.189f,0.827f, 0.262f,0.708f, 0.396f,0.69f, 0.564f,0.745f, 0.646f,0.83f,  }); break;
+
+
+                case '.':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.515f,0.157f, 0.469f,0.148f, 0.469f,0.117f, 0.515f,0.123f, 0.503f,0.169f }); break;
+                case ':':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.515f,0.157f, 0.469f,0.148f, 0.469f,0.117f, 0.515f,0.123f, 0.503f,0.169f });
+                    DebugDrawLines(position, color, size, duration, new[] {
+                0.515f,.5f+0.157f, 0.469f,.5f+0.148f, 0.469f,.5f+0.117f, 0.515f,.5f+0.123f, 0.503f,.5f+0.169f });
+                    break;
+                case '-':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.277f,0.51f, 0.716f,0.51f,  }); break;
+                case '+':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.265f,0.513f, 0.676f,0.516f, 0.497f,0.529f, 0.49f,0.699f, 0.497f,0.27f,  }); break;
+
+                case '(':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.542f,0.934f, 0.411f,0.797f, 0.344f,0.587f, 0.341f,0.434f, 0.375f,0.257f, 0.457f,0.12f, 0.567f,0.075f, }); break;
+                case ')':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.442f,0.94f, 0.548f,0.757f, 0.625f,0.568f, 0.64f,0.392f, 0.554f,0.129f, 0.472f,0.056f,  }); break;
+                case ';':
+                case ',':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.533f,0.239f, 0.527f,0.154f, 0.487f,0.099f, 0.451f,0.062f,  }); break;
+                case '_':
+                    DebugDrawLines(position, color, size, duration, new[] {
+               0.274f,0.133f, 0.716f,0.142f }); break;
+
+                    /*
+             case ':': DebugDrawLines(position, color, size, duration, new [] {
+                    0f }); break;
+                    */
+            }
+        }
+
+        public static void DebugDrawLines(Vector3 position, Color color, float size, float duration, Vector3[] points) {
+            for (int i = 0; i < points.Length - 1; i++) {
+                Debug.DrawLine(position + points[i] * size, position + points[i + 1] * size, color, duration);
+            }
+        }
+
+        public static void DebugDrawLines(Vector3 position, Color color, float size, float duration, float[] points) {
+            List<Vector3> vecList = new List<Vector3>();
+            for (int i = 0; i < points.Length; i += 2) {
+                Vector3 vec = new Vector3(points[i + 0], points[i + 1]);
+                vecList.Add(vec);
+            }
+            DebugDrawLines(position, color, size, duration, vecList.ToArray());
+        }
+
+        public static void ClearLogConsole() {
+#if UNITY_EDITOR
+            //Debug.Log("################# DISABLED BECAUSE OF BUILD!");
+            /*
+            Assembly assembly = Assembly.GetAssembly(typeof(UnityEditor.SceneView));
+            System.Type logEntries = System.Type.GetType("UnityEditor.LogEntries, UnityEditor.dll");
+            MethodInfo clearConsoleMethod = logEntries.GetMethod("Clear");
+            clearConsoleMethod.Invoke(new object(), null);
+            //*/
+#endif
+        }
+
+
+        public static string GetPercentString(float f, bool includeSign = true) {
+            return Mathf.RoundToInt(f * 100f) + (includeSign ? "%" : "");
+        }
+
+
+
+        public static string GetMonthName(int month) {
+            switch (month) {
+                default:
+                case 0: return "January";
+                case 1: return "February";
+                case 2: return "March";
+                case 3: return "April";
+                case 4: return "May";
+                case 5: return "June";
+                case 6: return "July";
+                case 7: return "August";
+                case 8: return "September";
+                case 9: return "October";
+                case 10: return "November";
+                case 11: return "December";
+            }
+        }
+
+        public static string GetMonthNameShort(int month) {
+            return GetMonthName(month).Substring(0, 3);
+        }
+
+
+
+
+        public static class ReflectionTools {
+
+            public static object CallMethod(string typeName, string methodName) {
+                return System.Type.GetType(typeName).GetMethod(methodName).Invoke(null, null);
+            }
+            public static object GetField(string typeName, string fieldName) {
+                System.Reflection.FieldInfo fieldInfo = System.Type.GetType(typeName).GetField(fieldName);
+                return fieldInfo.GetValue(null);
+            }
+            public static System.Type GetNestedType(string typeName, string nestedTypeName) {
+                return System.Type.GetType(typeName).GetNestedType(nestedTypeName);
+            }
+
+        }
+
+
+
+        public static bool TestChance(int chance, int chanceMax = 100) {
+            return UnityEngine.Random.Range(0, chanceMax) < chance;
+        }
+
+        public static T[] RemoveDuplicates<T>(T[] arr) {
+            List<T> list = new List<T>();
+            foreach (T t in arr) {
+                if (!list.Contains(t)) {
+                    list.Add(t);
+                }
+            }
+            return list.ToArray();
+        }
+
+        public static List<T> RemoveDuplicates<T>(List<T> arr) {
+            List<T> list = new List<T>();
+            foreach (T t in arr) {
+                if (!list.Contains(t)) {
+                    list.Add(t);
+                }
+            }
+            return list;
+        }
+
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/UtilsClass.cs.meta

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

+ 150 - 0
Assets/CodeMonkey/Utils/World_Bar.cs

@@ -0,0 +1,150 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using UnityEngine;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Bar in the World, great for quickly making a health bar
+     * */
+    public class World_Bar {
+        
+        private Outline outline;
+        private GameObject gameObject;
+        private Transform transform;
+        private Transform background;
+        private Transform bar;
+
+        public static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = 5000) {
+            return (int)(baseSortingOrder - position.y) + offset;
+        }
+
+        public class Outline {
+            public float size = 1f;
+            public Color color = Color.black;
+        }
+
+        public static World_Bar Create(Vector3 localPosition, Vector3 localScale, Color? backgroundColor, Color barColor, float sizeRatio, Outline outline = null) {
+            return Create(null, localPosition, localScale, backgroundColor, barColor, sizeRatio, 0, outline);
+        }
+
+        public static World_Bar Create(Transform parent, Vector3 localPosition, Vector3 localScale, Color? backgroundColor, Color barColor, float sizeRatio, int sortingOrder, Outline outline = null) {
+            return new World_Bar(parent, localPosition, localScale, backgroundColor, barColor, sizeRatio, sortingOrder, outline);
+        }
+
+        public World_Bar(Transform parent, Vector3 localPosition, Vector3 localScale, Color? backgroundColor, Color barColor, float sizeRatio, int sortingOrder, Outline outline = null) {
+            this.outline = outline;
+            SetupParent(parent, localPosition);
+            if (outline != null) SetupOutline(outline, localScale, sortingOrder - 1);
+            if (backgroundColor != null) SetupBackground((Color)backgroundColor, localScale, sortingOrder);
+            SetupBar(barColor, localScale, sortingOrder + 1);
+            SetSize(sizeRatio);
+        }
+
+        private void SetupParent(Transform parent, Vector3 localPosition) {
+            gameObject = new GameObject("World_Bar");
+            transform = gameObject.transform;
+            transform.SetParent(parent);
+            transform.localPosition = localPosition;
+        }
+
+        private void SetupOutline(Outline outline, Vector3 localScale, int sortingOrder) {
+            UtilsClass.CreateWorldSprite(transform, "Outline", Assets.i.s_White, new Vector3(0,0), localScale + new Vector3(outline.size, outline.size), sortingOrder, outline.color);
+        }
+
+        private void SetupBackground(Color backgroundColor, Vector3 localScale, int sortingOrder) {
+            background = UtilsClass.CreateWorldSprite(transform, "Background", Assets.i.s_White, new Vector3(0,0), localScale, sortingOrder, backgroundColor).transform;
+        }
+
+        private void SetupBar(Color barColor, Vector3 localScale, int sortingOrder) {
+            GameObject barGO = new GameObject("Bar");
+            bar = barGO.transform;
+            bar.SetParent(transform);
+            bar.localPosition = new Vector3(-localScale.x / 2f, 0, 0);
+            bar.localScale = new Vector3(1,1,1);
+            Transform barIn = UtilsClass.CreateWorldSprite(bar, "BarIn", Assets.i.s_White, new Vector3(localScale.x / 2f, 0), localScale, sortingOrder, barColor).transform;
+        }
+
+        public void SetLocalScale(Vector3 localScale) {
+            // Outline
+            if (transform.Find("Outline") != null) {
+                // Has outline
+                transform.Find("Outline").localScale = localScale + new Vector3(outline.size, outline.size);
+            }
+
+            //Background
+            background.localScale = localScale;
+
+            // Set Bar Scale
+            bar.localPosition = new Vector3(-localScale.x / 2f, 0, 0);
+            Transform barIn = bar.Find("BarIn");
+            barIn.localScale = localScale;
+            barIn.localPosition = new Vector3(localScale.x / 2f, 0);
+        }
+        
+        public void SetSortingOrder(int sortingOrder) {
+            bar.Find("BarIn").GetComponent<SpriteRenderer>().sortingOrder = sortingOrder;
+            if (background != null) background.GetComponent<SpriteRenderer>().sortingOrder = sortingOrder - 1;
+            if (transform.Find("Outline") != null) transform.Find("Outline").GetComponent<SpriteRenderer>().sortingOrder = sortingOrder - 2;
+        }
+
+        public void SetSortingLayerName(string sortingLayerName) {
+            bar.Find("BarIn").GetComponent<SpriteRenderer>().sortingLayerName = sortingLayerName;
+            if (background != null) background.GetComponent<SpriteRenderer>().sortingLayerName = sortingLayerName;
+            if (transform.Find("Outline") != null) transform.Find("Outline").GetComponent<SpriteRenderer>().sortingLayerName = sortingLayerName;
+        }
+
+        public void SetRotation(float rotation) {
+            transform.localEulerAngles = new Vector3(0, 0, rotation);
+        }
+
+        public void SetSize(float sizeRatio) {
+            bar.localScale = new Vector3(sizeRatio, 1, 1);
+        }
+
+        public void SetColor(Color color) {
+            bar.Find("BarIn").GetComponent<SpriteRenderer>().color = color;
+        }
+
+        public void SetActive(bool isActive) {
+            gameObject.SetActive(isActive);
+        }
+
+        public void Show() {
+            gameObject.SetActive(true);
+        }
+
+        public void Hide() {
+            gameObject.SetActive(false);
+        }
+
+        public Button_Sprite AddButton(System.Action ClickFunc, System.Action MouseOverOnceFunc, System.Action MouseOutOnceFunc) {
+            Button_Sprite buttonSprite = gameObject.AddComponent<Button_Sprite>();
+            if (ClickFunc != null)
+                buttonSprite.ClickFunc = ClickFunc;
+            if (MouseOverOnceFunc != null)
+                buttonSprite.MouseOverOnceFunc = MouseOverOnceFunc;
+            if (MouseOutOnceFunc != null)
+                buttonSprite.MouseOutOnceFunc = MouseOutOnceFunc;
+            return buttonSprite;
+        }
+
+        public void DestroySelf() {
+            if (gameObject != null) {
+                Object.Destroy(gameObject);
+            }
+        }
+
+    }
+    
+}

+ 13 - 0
Assets/CodeMonkey/Utils/World_Bar.cs.meta

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

+ 237 - 0
Assets/CodeMonkey/Utils/World_Mesh.cs

@@ -0,0 +1,237 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using UnityEngine;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Mesh in the World
+     * */
+    public class World_Mesh {
+        
+        private const int sortingOrderDefault = 5000;
+
+        public GameObject gameObject;
+        public Transform transform;
+        private Material material;
+        private Vector3[] vertices;
+        private Vector2[] uv;
+        private int[] triangles;
+        private Mesh mesh;
+
+
+        public static World_Mesh CreateEmpty(Vector3 position, float eulerZ, Material material, int sortingOrderOffset = 0) {
+            return new World_Mesh(null, position, Vector3.one, eulerZ, material, new Vector3[0], new Vector2[0], new int[0], sortingOrderOffset);
+        }
+        
+        public static World_Mesh Create(Vector3 position, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset = 0) {
+            return new World_Mesh(null, position, Vector3.one, eulerZ, material, vertices, uv, triangles, sortingOrderOffset);
+        }
+
+        public static World_Mesh Create(Vector3 position, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
+            return new World_Mesh(null, position, Vector3.one, eulerZ, meshWidth, meshHeight, material, uvCoords, sortingOrderOffset);
+        }
+
+        public static World_Mesh Create(Vector3 lowerLeftCorner, float width, float height, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
+            return Create(lowerLeftCorner, lowerLeftCorner + new Vector3(width, height), material, uvCoords, sortingOrderOffset);
+        }
+
+        public static World_Mesh Create(Vector3 lowerLeftCorner, Vector3 upperRightCorner, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
+            float width = upperRightCorner.x - lowerLeftCorner.x;
+            float height = upperRightCorner.y - lowerLeftCorner.y;
+            Vector3 localScale = upperRightCorner - lowerLeftCorner;
+            Vector3 position = lowerLeftCorner + localScale * .5f;
+            return new World_Mesh(null, position, Vector3.one, 0f, width, height, material, uvCoords, sortingOrderOffset);
+        }
+
+
+        private static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) {
+            return (int)(baseSortingOrder - position.y) + offset;
+        }
+
+
+        public class UVCoords {
+            public int x, y, width, height;
+            public UVCoords(int x, int y, int width, int height) {
+                this.x = x;
+                this.y = y;
+                this.width = width;
+                this.height = height;
+            }
+        }
+
+
+        public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset) {
+            this.material = material;
+
+            vertices = new Vector3[4];
+            uv = new Vector2[4];
+            triangles = new int[6];
+
+            /* 0,1
+             * 1,1
+             * 0,0
+             * 1,0
+             */
+            
+            float meshWidthHalf  = meshWidth  / 2f;
+            float meshHeightHalf = meshHeight / 2f;
+
+            vertices[0] = new Vector3(-meshWidthHalf,  meshHeightHalf);
+            vertices[1] = new Vector3( meshWidthHalf,  meshHeightHalf);
+            vertices[2] = new Vector3(-meshWidthHalf, -meshHeightHalf);
+            vertices[3] = new Vector3( meshWidthHalf, -meshHeightHalf);
+            
+            if (uvCoords == null) {
+                uvCoords = new UVCoords(0, 0, material.mainTexture.width, material.mainTexture.height);
+            }
+
+            Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
+
+            ApplyUVToUVArray(uvArray, ref uv);
+
+            triangles[0] = 0;
+            triangles[1] = 1;
+            triangles[2] = 2;
+            triangles[3] = 2;
+            triangles[4] = 1;
+            triangles[5] = 3;
+
+            mesh = new Mesh();
+
+            mesh.vertices = vertices;
+            mesh.uv = uv;
+            mesh.triangles = triangles;
+
+            gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
+            gameObject.transform.parent = parent;
+            gameObject.transform.localPosition = localPosition;
+            gameObject.transform.localScale = localScale;
+            gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
+
+            gameObject.GetComponent<MeshFilter>().mesh = mesh;
+            gameObject.GetComponent<MeshRenderer>().material = material;
+
+            transform = gameObject.transform;
+
+            SetSortingOrderOffset(sortingOrderOffset);
+        }
+        
+        public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset) {
+            this.material = material;
+            this.vertices = vertices;
+            this.uv = uv;
+            this.triangles = triangles;
+
+            mesh = new Mesh();
+
+            mesh.vertices = vertices;
+            mesh.uv = uv;
+            mesh.triangles = triangles;
+
+            gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
+            gameObject.transform.parent = parent;
+            gameObject.transform.localPosition = localPosition;
+            gameObject.transform.localScale = localScale;
+            gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
+
+            gameObject.GetComponent<MeshFilter>().mesh = mesh;
+            gameObject.GetComponent<MeshRenderer>().material = material;
+
+            transform = gameObject.transform;
+
+            SetSortingOrderOffset(sortingOrderOffset);
+        }
+
+        private Vector2 ConvertPixelsToUVCoordinates(int x, int y, int textureWidth, int textureHeight) {
+            return new Vector2((float)x / textureWidth, (float)y / textureHeight);
+        }
+
+        private Vector2[] GetUVRectangleFromPixels(int x, int y, int width, int height, int textureWidth, int textureHeight) {
+            /* 0, 1
+             * 1, 1
+             * 0, 0
+             * 1, 0
+             * */
+            return new Vector2[] { 
+                ConvertPixelsToUVCoordinates(x, y + height, textureWidth, textureHeight),
+                ConvertPixelsToUVCoordinates(x + width, y + height, textureWidth, textureHeight),
+                ConvertPixelsToUVCoordinates(x, y, textureWidth, textureHeight),
+                ConvertPixelsToUVCoordinates(x + width, y, textureWidth, textureHeight)
+            };
+        }
+
+        private void ApplyUVToUVArray(Vector2[] uv, ref Vector2[] mainUV) {
+            if (uv == null || uv.Length < 4 || mainUV == null || mainUV.Length < 4) throw new System.Exception();
+            mainUV[0] = uv[0];
+            mainUV[1] = uv[1];
+            mainUV[2] = uv[2];
+            mainUV[3] = uv[3];
+        }
+
+        public void SetUVCoords(UVCoords uvCoords) {
+            Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
+            ApplyUVToUVArray(uvArray, ref uv);
+            mesh.uv = uv;
+        }
+
+        public void SetSortingOrderOffset(int sortingOrderOffset) {
+            SetSortingOrder(GetSortingOrder(gameObject.transform.position, sortingOrderOffset));
+        }
+
+        public void SetSortingOrder(int sortingOrder) {
+            gameObject.GetComponent<Renderer>().sortingOrder = sortingOrder;
+        }
+
+        public void SetLocalScale(Vector3 localScale) {
+            transform.localScale = localScale;
+        }
+
+        public void SetPosition(Vector3 localPosition) {
+            transform.localPosition = localPosition;
+        }
+
+        public void AddPosition(Vector3 addPosition) {
+            transform.localPosition += addPosition;
+        }
+
+        public Vector3 GetPosition() {
+            return transform.localPosition;
+        }
+
+        public int GetSortingOrder() {
+            return gameObject.GetComponent<Renderer>().sortingOrder;
+        }
+
+        public Mesh GetMesh() {
+            return mesh;
+        }
+
+        public void Show() {
+            gameObject.SetActive(true);
+        }
+
+        public void Hide() {
+            gameObject.SetActive(false);
+        }
+
+        public void DestroySelf() {
+            Object.Destroy(gameObject);
+        }
+
+        public static void CreateMesh() {
+        }
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/World_Mesh.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 91ce8dcaef210db41a183b4558f16bb2
+timeCreated: 1524300280
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 225 - 0
Assets/CodeMonkey/Utils/World_Sprite.cs

@@ -0,0 +1,225 @@
+/* 
+    ------------------- Code Monkey -------------------
+
+    Thank you for downloading the Code Monkey Utilities
+    I hope you find them useful in your projects
+    If you have any questions use the contact form
+    Cheers!
+
+               unitycodemonkey.com
+    --------------------------------------------------
+ */
+
+using System;
+using UnityEngine;
+
+namespace CodeMonkey.Utils {
+
+    /*
+     * Sprite in the World
+     * */
+    public class World_Sprite {
+        
+        private const int sortingOrderDefault = 5000;
+
+        public GameObject gameObject;
+        public Transform transform;
+        private SpriteRenderer spriteRenderer;
+
+
+        public static World_Sprite CreateDebugButton(Vector3 position, System.Action ClickFunc) {
+            World_Sprite worldSprite = new World_Sprite(null, position, new Vector3(10, 10), Assets.i.s_White, Color.green, sortingOrderDefault);
+            worldSprite.AddButton(ClickFunc, null, null);
+            return worldSprite;
+        }
+
+        public static World_Sprite CreateDebugButton(Transform parent, Vector3 localPosition, System.Action ClickFunc) {
+            World_Sprite worldSprite = new World_Sprite(parent, localPosition, new Vector3(10, 10), Assets.i.s_White, Color.green, sortingOrderDefault);
+            worldSprite.AddButton(ClickFunc, null, null);
+            return worldSprite;
+        }
+
+        public static World_Sprite CreateDebugButton(Transform parent, Vector3 localPosition, string text, System.Action ClickFunc, int fontSize = 30, float paddingX = 5, float paddingY = 5) {
+            GameObject gameObject = new GameObject("DebugButton");
+            gameObject.transform.parent = parent;
+            gameObject.transform.localPosition = localPosition;
+            TextMesh textMesh = UtilsClass.CreateWorldText(text, gameObject.transform, Vector3.zero, fontSize, Color.white, TextAnchor.MiddleCenter, TextAlignment.Center, 20000);
+            Bounds rendererBounds = textMesh.GetComponent<MeshRenderer>().bounds;
+
+            Color color = UtilsClass.GetColorFromString("00BA00FF");
+            if (color.r >= 1f) color.r = .9f;
+            if (color.g >= 1f) color.g = .9f;
+            if (color.b >= 1f) color.b = .9f;
+            Color colorOver = color * 1.1f; // button over color lighter
+
+            World_Sprite worldSprite = new World_Sprite(gameObject.transform, Vector3.zero, rendererBounds.size + new Vector3(paddingX, paddingY), Assets.i.s_White, color, sortingOrderDefault);
+            worldSprite.AddButton(ClickFunc, () => worldSprite.SetColor(colorOver), () => worldSprite.SetColor(color));
+            return worldSprite;
+        }
+
+        public static World_Sprite Create(Transform parent, Vector3 localPosition, Vector3 localScale, Sprite sprite, Color color, int sortingOrderOffset) {
+            return new World_Sprite(parent, localPosition, localScale, sprite, color, sortingOrderOffset);
+        }
+
+        public static World_Sprite Create(Transform parent, Vector3 localPosition, Vector3 localScale, Sprite sprite = null, Color? color = null, int sortingOrderOffset = 0) {
+            if (sprite == null) {
+                sprite = Assets.i.s_White;
+            }
+            if (color == null) {
+                color = Color.white;
+            }
+            return new World_Sprite(parent, localPosition, localScale, sprite, (Color)color, sortingOrderOffset);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Sprite sprite) {
+            return new World_Sprite(null, worldPosition, new Vector3(1, 1, 1), sprite, Color.white, 0);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale, Sprite sprite, Color color, int sortingOrderOffset) {
+            return new World_Sprite(null, worldPosition, localScale, sprite, color, sortingOrderOffset);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale, Sprite sprite, Color color) {
+            return new World_Sprite(null, worldPosition, localScale, sprite, color, 0);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale, Color color) {
+            return new World_Sprite(null, worldPosition, localScale, Assets.i.s_White, color, 0);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale, Color color, int sortingOrderOffset) {
+            return new World_Sprite(null, worldPosition, localScale, Assets.i.s_White, color, sortingOrderOffset);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale) {
+            return new World_Sprite(null, worldPosition, localScale, Assets.i.s_White, Color.white, 0);
+        }
+
+        public static World_Sprite Create(Vector3 worldPosition, Vector3 localScale, int sortingOrderOffset) {
+            return new World_Sprite(null, worldPosition, localScale, Assets.i.s_White, Color.white, sortingOrderOffset);
+        }
+
+        public static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) {
+            return (int)(baseSortingOrder - position.y) + offset;
+        }
+
+
+
+
+        public World_Sprite(Transform parent, Vector3 localPosition, Vector3 localScale, Sprite sprite, Color color, int sortingOrderOffset) {
+            Vector3 position = localPosition;
+            if (parent != null) {
+                position = parent.TransformPoint(position);
+            }
+            int sortingOrder = GetSortingOrder(position, sortingOrderOffset);
+            gameObject = UtilsClass.CreateWorldSprite(parent, "Sprite", sprite, localPosition, localScale, sortingOrder, color);
+            transform = gameObject.transform;
+            spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
+        }
+
+        public void SetActive(bool isActive) {
+            gameObject.SetActive(isActive);
+        }
+
+        public SpriteRenderer GetSpriteRenderer() {
+            return spriteRenderer;
+        }
+
+        public void SetName(string name) {
+            gameObject.name = name;
+        }
+
+        public void SetSortingOrderOffset(int sortingOrderOffset) {
+            SetSortingOrder(GetSortingOrder(gameObject.transform.position, sortingOrderOffset));
+        }
+
+        public void SetSortingOrder(int sortingOrder) {
+            gameObject.GetComponent<SpriteRenderer>().sortingOrder = sortingOrder;
+        }
+
+        public void SetSortingLayerName(string layerName) {
+            gameObject.GetComponent<SpriteRenderer>().sortingLayerName = layerName;
+        }
+
+        public int GetSortingOrder() {
+            return gameObject.GetComponent<SpriteRenderer>().sortingOrder;
+        }
+
+        public void SetParent(GameObject parentGameObject) {
+            SetParent(parentGameObject.transform);
+        }
+
+        public void SetParent(Transform parent) {
+            transform.parent = parent;
+        }
+
+        public void SetLocalScale(Vector3 localScale) {
+            transform.localScale = localScale;
+        }
+
+        public void SetPosition(Vector3 localPosition) {
+            transform.localPosition = localPosition;
+        }
+
+        public void SetPosition(Func<Vector3> getLocalPosition) {
+            FunctionUpdater.Create(() => { 
+                transform.localPosition = getLocalPosition();
+            });
+        }
+
+        public Vector3 GetPosition() {
+            return transform.position;
+        }
+
+        public Vector3 GetLocalScale() {
+            return transform.localScale;
+        }
+
+        public float GetRotation() {
+            return transform.localEulerAngles.z;
+        }
+
+        public void SetRotation(float rotation) {
+            transform.localEulerAngles = new Vector3(0, 0, rotation);
+        }
+
+        public void SetColor(Color color) {
+            spriteRenderer.color = color;
+        }
+
+        public void SetSprite(Sprite sprite) {
+            spriteRenderer.sprite = sprite;
+        }
+
+        public void SetFlip(bool flipX, bool flipY) {
+            spriteRenderer.flipX = flipX;
+            spriteRenderer.flipY = flipY;
+        }
+
+        public void Show() {
+            gameObject.SetActive(true);
+        }
+
+        public void Hide() {
+            gameObject.SetActive(false);
+        }
+
+        public Button_Sprite AddButton(System.Action ClickFunc, System.Action MouseOverOnceFunc, System.Action MouseOutOnceFunc) {
+            gameObject.AddComponent<BoxCollider2D>();
+            Button_Sprite buttonSprite = gameObject.AddComponent<Button_Sprite>();
+            if (ClickFunc != null)
+                buttonSprite.ClickFunc = ClickFunc;
+            if (MouseOverOnceFunc != null)
+                buttonSprite.MouseOverOnceFunc = MouseOverOnceFunc;
+            if (MouseOutOnceFunc != null)
+                buttonSprite.MouseOutOnceFunc = MouseOutOnceFunc;
+            return buttonSprite;
+        }
+
+        public void DestroySelf() {
+            UnityEngine.Object.Destroy(gameObject);
+        }
+
+    }
+
+}

+ 13 - 0
Assets/CodeMonkey/Utils/World_Sprite.cs.meta

@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 1460472c3006fb44daea959dda2c4d81
+timeCreated: 1524300280
+licenseType: Pro
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/Data.meta

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

+ 22 - 0
Assets/Data/A2D28127-D81C-4749-BA23-1EC1973096E3.asset

@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 87c1fa5b4885dcf428c1cd60ab80b55d, type: 3}
+  m_Name: A2D28127-D81C-4749-BA23-1EC1973096E3
+  m_EditorClassIdentifier: 
+  ID: A2D28127-D81C-4749-BA23-1EC1973096E3
+  FriendlyName: NewName
+  Description: 
+  Category: 0
+  Stackable: 0
+  BuyPrice: 20
+  SellPercentage: 0
+  Icon: {fileID: 21300000, guid: 7d0f73aed89f4e146b939c2b5afbcb89, type: 3}

+ 8 - 0
Assets/Data/A2D28127-D81C-4749-BA23-1EC1973096E3.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e0dfba9c32db66447bac0faa04688c6f
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 22 - 0
Assets/Data/AnotherTestItem.asset

@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 87c1fa5b4885dcf428c1cd60ab80b55d, type: 3}
+  m_Name: AnotherTestItem
+  m_EditorClassIdentifier: 
+  ID: D4CD81C3-15DA-4BC5-AF66-EF67B51E605A
+  FriendlyName: Another test item
+  Description: This is another test item
+  Category: 1
+  Stackable: 0
+  BuyPrice: 0
+  SellPercentage: 0
+  Icon: {fileID: 21300000, guid: fb1e48043961d8f44948225f539a83bb, type: 3}

+ 8 - 0
Assets/Data/AnotherTestItem.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a978a4c55301a894ead4b366cd6e1749
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 22 - 0
Assets/Data/TestItem.asset

@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 87c1fa5b4885dcf428c1cd60ab80b55d, type: 3}
+  m_Name: TestItem
+  m_EditorClassIdentifier: 
+  ID: 5EB573A8-5542-44E2-8E2B-1EC817BDAD6C
+  FriendlyName: Basic Wall
+  Description: A basic wall object
+  Category: 0
+  Stackable: 0
+  BuyPrice: 10
+  SellPercentage: 0.26
+  Icon: {fileID: 21300000, guid: 89a7c2b9294dbaa4985085575713504f, type: 3}

+ 8 - 0
Assets/Data/TestItem.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: de8d24d09ab6ed14e8bc41b21b0377f9
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/Data/UI.meta

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

+ 8 - 0
Assets/Data/UI/Buildables.meta

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

+ 21 - 0
Assets/Data/UI/Buildables/Door-1.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 25868053ff94eab49a832604d09eeb0f, type: 3}
+  m_Name: Door-1
+  m_EditorClassIdentifier: 
+  nameString: Door
+  prefab: {fileID: 1224967975766489802, guid: 861f739e592bcf843ba3dae4e68c1127, type: 3}
+  visual: {fileID: 1224967975766489802, guid: 861f739e592bcf843ba3dae4e68c1127, type: 3}
+  width: 1
+  height: 1
+  ButtonText: Door
+  category: 0

+ 8 - 0
Assets/Data/UI/Buildables/Door-1.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f078bd6e8c09579499f9b574620de93f
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 21 - 0
Assets/Data/UI/Buildables/TestDecoration.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 25868053ff94eab49a832604d09eeb0f, type: 3}
+  m_Name: TestDecoration
+  m_EditorClassIdentifier: 
+  nameString: TestDecoration
+  prefab: {fileID: 1224967975766489802, guid: 861f739e592bcf843ba3dae4e68c1127, type: 3}
+  visual: {fileID: 1224967975766489802, guid: 861f739e592bcf843ba3dae4e68c1127, type: 3}
+  width: 1
+  height: 1
+  ButtonText: Reception
+  category: 1

+ 8 - 0
Assets/Data/UI/Buildables/TestDecoration.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b95e9bb2f9c0cb042bbe11884d7cdebc
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 21 - 0
Assets/Data/UI/Buildables/TestWall2Size.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 25868053ff94eab49a832604d09eeb0f, type: 3}
+  m_Name: TestWall2Size
+  m_EditorClassIdentifier: 
+  nameString: Wall Wide
+  prefab: {fileID: 267422625024573660, guid: 18f098fc95202c94a8f7dbd2130c26a2, type: 3}
+  visual: {fileID: 267422625024573660, guid: 18f098fc95202c94a8f7dbd2130c26a2, type: 3}
+  width: 2
+  height: 1
+  ButtonText: Wall wide
+  category: 0

+ 8 - 0
Assets/Data/UI/Buildables/TestWall2Size.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb9f88df88235bf4aa25596f1b00f6a8
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 21 - 0
Assets/Data/UI/Buildables/Wall-1.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 25868053ff94eab49a832604d09eeb0f, type: 3}
+  m_Name: Wall-1
+  m_EditorClassIdentifier: 
+  nameString: 3colorWall
+  prefab: {fileID: 1532464777670360863, guid: c35336299fd01e740a77f5b8f8fcf53c, type: 3}
+  visual: {fileID: 1532464777670360863, guid: c35336299fd01e740a77f5b8f8fcf53c, type: 3}
+  width: 1
+  height: 1
+  ButtonText: Three colored wall
+  ot: 0

+ 8 - 0
Assets/Data/UI/Buildables/Wall-1.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 03e088500a34b5b4da12f8dc504113e3
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/Data/UI/Menus.meta

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

+ 18 - 0
Assets/Data/UI/Menus/DecorationsMenu.asset

@@ -0,0 +1,18 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6d7593989b0ffe64c980a2e8d0a5af85, type: 3}
+  m_Name: DecorationsMenu
+  m_EditorClassIdentifier: 
+  MenuText: Decorations
+  menuOpen: 0
+  category: 1
+  buildableItemTemplate: {fileID: 9197481963319205126, guid: c1fa5c5243a19544ea89d7f7c9be47cf, type: 3}

+ 8 - 0
Assets/Data/UI/Menus/DecorationsMenu.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a3a84d02c95b39743963aae3c86ad3ea
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 18 - 0
Assets/Data/UI/Menus/WallMenu.asset

@@ -0,0 +1,18 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6d7593989b0ffe64c980a2e8d0a5af85, type: 3}
+  m_Name: WallMenu
+  m_EditorClassIdentifier: 
+  MenuText: Walls
+  menuOpen: 0
+  category: 0
+  buildableItemTemplate: {fileID: 9197481963319205126, guid: c1fa5c5243a19544ea89d7f7c9be47cf, type: 3}

+ 8 - 0
Assets/Data/UI/Menus/WallMenu.asset.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 35b601435fd1a01448695e49e17d2358
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 11400000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/GridBuildingSystem.meta

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

+ 1748 - 0
Assets/GridBuildingSystem/GameScene_GridBuildingSystem2D.unity

@@ -0,0 +1,1748 @@
+%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: 1, g: 1, b: 1, 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: 3
+  m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+  m_SkyboxMaterial: {fileID: 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, g: 0, b: 0, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 0
+    m_EnableRealtimeLightmaps: 0
+  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: 0
+    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 &79197617
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 79197620}
+  - component: {fileID: 79197619}
+  - component: {fileID: 79197618}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &79197618
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalAxis: Horizontal
+  m_VerticalAxis: Vertical
+  m_SubmitButton: Submit
+  m_CancelButton: Cancel
+  m_InputActionsPerSecond: 10
+  m_RepeatDelay: 0.5
+  m_ForceModuleActive: 0
+--- !u!114 &79197619
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 0}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 5
+--- !u!4 &79197620
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &105464379
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 105464381}
+  - component: {fileID: 105464380}
+  - component: {fileID: 105464382}
+  m_Layer: 0
+  m_Name: UICamera
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!20 &105464380
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 105464379}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 3
+  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: 1
+  orthographic size: 100
+  m_Depth: 0
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_RenderingPath: -1
+  m_TargetTexture: {fileID: 0}
+  m_TargetDisplay: 0
+  m_TargetEye: 3
+  m_HDR: 0
+  m_AllowMSAA: 1
+  m_AllowDynamicResolution: 0
+  m_ForceIntoRT: 0
+  m_OcclusionCulling: 1
+  m_StereoConvergence: 10
+  m_StereoSeparation: 0.022
+--- !u!4 &105464381
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 105464379}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1797793838}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &105464382
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 105464379}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_RenderShadows: 1
+  m_RequiresDepthTextureOption: 2
+  m_RequiresOpaqueTextureOption: 2
+  m_CameraType: 0
+  m_Cameras: []
+  m_RendererIndex: -1
+  m_VolumeLayerMask:
+    serializedVersion: 2
+    m_Bits: 1
+  m_VolumeTrigger: {fileID: 0}
+  m_RenderPostProcessing: 0
+  m_Antialiasing: 0
+  m_AntialiasingQuality: 2
+  m_StopNaN: 0
+  m_Dithering: 0
+  m_ClearDepth: 1
+  m_RequiresDepthTexture: 0
+  m_RequiresColorTexture: 0
+  m_Version: 2
+--- !u!1 &142192280
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 142192282}
+  - component: {fileID: 142192281}
+  m_Layer: 0
+  m_Name: BuildingSound
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &142192281
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 142192280}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 057aa5117047d4e44908d6aee054c4c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  gridBuildingSystem3D: {fileID: 0}
+  gridBuildingSystem2D: {fileID: 931635513}
+  pfBuildingSound: {fileID: 3344039833696424170, guid: 7763a701df95c6848a506e21230d6dab,
+    type: 3}
+--- !u!4 &142192282
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 142192280}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &166491222
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 166491224}
+  - component: {fileID: 166491223}
+  m_Layer: 0
+  m_Name: BuildingGhost2D
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &166491223
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 166491222}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 8a55948557bbd0643b5abf7f8d229e4f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!4 &166491224
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 166491222}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &328557944
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 328557945}
+  - component: {fileID: 328557946}
+  m_Layer: 0
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &328557945
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 328557944}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 50.7, y: 46.9, z: 0}
+  m_LocalScale: {x: 0.1, y: 0.1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &328557946
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 328557944}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 0
+  m_RenderingLayerMask: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, 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: 0
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 1157653183
+  m_SortingLayer: -1
+  m_SortingOrder: -20
+  m_Sprite: {fileID: 21300000, guid: f49e6c39aa952d14cb151ee68af04952, type: 3}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_FlipX: 0
+  m_FlipY: 0
+  m_DrawMode: 2
+  m_Size: {x: 2477.0103, y: 1909.7278}
+  m_AdaptiveModeThreshold: 0.5
+  m_SpriteTileMode: 0
+  m_WasSpriteAssigned: 1
+  m_MaskInteraction: 0
+  m_SpriteSortPoint: 0
+--- !u!1 &387273711
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 387273712}
+  m_Layer: 0
+  m_Name: Meshes
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &387273712
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 387273711}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 626059708}
+  - {fileID: 1325846907}
+  - {fileID: 780186272}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &419600748
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 419600749}
+  - component: {fileID: 419600750}
+  m_Layer: 0
+  m_Name: Global Volume
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &419600749
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 419600748}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1065981920}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &419600750
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 419600748}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  isGlobal: 1
+  priority: 0
+  blendDistance: 0
+  weight: 1
+  sharedProfile: {fileID: 11400000, guid: 7dce7ca22e97fea4a92f8624979214c8, type: 2}
+--- !u!1 &554223376
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 554223377}
+  - component: {fileID: 554223380}
+  - component: {fileID: 554223379}
+  - component: {fileID: 554223378}
+  m_Layer: 0
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &554223377
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 1797793838}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!114 &554223378
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &554223379
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 0.82
+  m_ReferenceResolution: {x: 1280, y: 720}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 1
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!223 &554223380
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 105464380}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!1 &626059707
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 626059708}
+  - component: {fileID: 626059712}
+  - component: {fileID: 626059711}
+  - component: {fileID: 626059710}
+  - component: {fileID: 626059709}
+  m_Layer: 0
+  m_Name: Mesh_Blood
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &626059708
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &626059709
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: -4
+--- !u!114 &626059710
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 128, y: 16}
+  spawnNewMeshWhenFull: 1
+  UVList:
+  - Vector_1: {x: 0, y: 16}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 16, y: 0}
+    Vector_4: {x: 16, y: 16}
+  - Vector_1: {x: 16, y: 16}
+    Vector_2: {x: 16, y: 0}
+    Vector_3: {x: 32, y: 0}
+    Vector_4: {x: 32, y: 16}
+  - Vector_1: {x: 32, y: 16}
+    Vector_2: {x: 32, y: 0}
+    Vector_3: {x: 48, y: 0}
+    Vector_4: {x: 48, y: 16}
+  - Vector_1: {x: 48, y: 16}
+    Vector_2: {x: 48, y: 0}
+    Vector_3: {x: 64, y: 0}
+    Vector_4: {x: 64, y: 16}
+  - Vector_1: {x: 64, y: 16}
+    Vector_2: {x: 64, y: 0}
+    Vector_3: {x: 80, y: 0}
+    Vector_4: {x: 80, y: 16}
+  - Vector_1: {x: 80, y: 16}
+    Vector_2: {x: 80, y: 0}
+    Vector_3: {x: 96, y: 0}
+    Vector_4: {x: 96, y: 16}
+  - Vector_1: {x: 96, y: 16}
+    Vector_2: {x: 96, y: 0}
+    Vector_3: {x: 112, y: 0}
+    Vector_4: {x: 112, y: 16}
+  - Vector_1: {x: 112, y: 16}
+    Vector_2: {x: 112, y: 0}
+    Vector_3: {x: 128, y: 0}
+    Vector_4: {x: 128, y: 16}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &626059711
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: a6090c6a3b8cf1c49874a1abb645b5a7, 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: -4
+--- !u!33 &626059712
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Mesh: {fileID: 0}
+--- !u!1 &780186271
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 780186272}
+  - component: {fileID: 780186276}
+  - component: {fileID: 780186275}
+  - component: {fileID: 780186274}
+  - component: {fileID: 780186273}
+  m_Layer: 0
+  m_Name: Mesh_Top
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &780186272
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &780186273
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: 10000
+--- !u!114 &780186274
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 512, y: 512}
+  spawnNewMeshWhenFull: 0
+  UVList:
+  - Vector_1: {x: 0, y: 512}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 512, y: 0}
+    Vector_4: {x: 512, y: 512}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &780186275
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 6123fb67bbc1fad408e07ccbb8fa9fcb, 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: 10000
+--- !u!33 &780186276
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Mesh: {fileID: 0}
+--- !u!1001 &814888834
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 1575375740}
+    m_Modifications:
+    - target: {fileID: 1848020400031394, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_Name
+      value: GameAssets
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -2.0506113
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 11.127766
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: -0.30743352
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_RootOrder
+      value: 6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+--- !u!4 &814888835 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2,
+    type: 3}
+  m_PrefabInstance: {fileID: 814888834}
+  m_PrefabAsset: {fileID: 0}
+--- !u!1 &830715207
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 830715208}
+  - component: {fileID: 830715209}
+  m_Layer: 0
+  m_Name: CameraTarget
+  m_TagString: Untagged
+  m_Icon: {fileID: -5487077368411116049, guid: 0000000000000000d000000000000000, type: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &830715208
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 830715207}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 47.5012, y: 42.590378, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &830715209
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 830715207}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 969f2427847e50c458ed8e204e5ade1f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  axis: 1
+  moveSpeed: 50
+--- !u!1 &931635512
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 931635515}
+  - component: {fileID: 931635513}
+  m_Layer: 0
+  m_Name: GridBuildingSystem2D
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &931635513
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 931635512}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c79b94ac2aef2d448b464bcc7414407f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  placedObjectTypeSOList:
+  - {fileID: 11400000, guid: e69c89cefc1b72243a24b373dc6bd161, type: 2}
+  - {fileID: 11400000, guid: d03304a63647ae648942979f956d9ea2, type: 2}
+  - {fileID: 11400000, guid: 500e1c0287e3913429f02efccd2c1485, type: 2}
+  - {fileID: 11400000, guid: c0d6d84266cffea4ea07ea8c44a2bee7, type: 2}
+  - {fileID: 11400000, guid: 38a3fc5fef2051f479b67f24b127a006, type: 2}
+  - {fileID: 11400000, guid: eafce1364a57f104ab8402ee78bd7c7b, type: 2}
+--- !u!4 &931635515
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 931635512}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1065981916
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065981920}
+  - component: {fileID: 1065981919}
+  - component: {fileID: 1065981918}
+  - component: {fileID: 1065981917}
+  - component: {fileID: 1065981922}
+  - component: {fileID: 1065981921}
+  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 &1065981917
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+--- !u!124 &1065981918
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+--- !u!20 &1065981919
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 2
+  m_BackGroundColor: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1}
+  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: 1
+  orthographic size: 40
+  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 &1065981920
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 47.5012, y: 42.590378, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 419600749}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1065981921
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 72ece51f2901e7445ab60da3685d6b5f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ShowDebugText: 0
+  m_ShowCameraFrustum: 1
+  m_IgnoreTimeScale: 0
+  m_WorldUpOverride: {fileID: 0}
+  m_UpdateMethod: 2
+  m_BlendUpdateMethod: 1
+  m_DefaultBlend:
+    m_Style: 1
+    m_Time: 2
+    m_CustomCurve:
+      serializedVersion: 2
+      m_Curve: []
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+  m_CustomBlends: {fileID: 0}
+  m_CameraCutEvent:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CameraActivatedEvent:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1065981922
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_RenderShadows: 1
+  m_RequiresDepthTextureOption: 2
+  m_RequiresOpaqueTextureOption: 2
+  m_CameraType: 0
+  m_Cameras: []
+  m_RendererIndex: -1
+  m_VolumeLayerMask:
+    serializedVersion: 2
+    m_Bits: 1
+  m_VolumeTrigger: {fileID: 0}
+  m_RenderPostProcessing: 1
+  m_Antialiasing: 1
+  m_AntialiasingQuality: 2
+  m_StopNaN: 0
+  m_Dithering: 0
+  m_ClearDepth: 1
+  m_RequiresDepthTexture: 0
+  m_RequiresColorTexture: 0
+  m_Version: 2
+--- !u!1 &1138890176
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1138890177}
+  - component: {fileID: 1138890178}
+  m_Layer: 0
+  m_Name: Global Light 2D
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1138890177
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1138890176}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 21.314842, y: 8.599944, z: -159.93407}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1138890178
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1138890176}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_LightType: 4
+  m_BlendStyleIndex: 0
+  m_FalloffIntensity: 0.5
+  m_Color: {r: 0.6698113, g: 0.6698113, b: 0.6698113, a: 1}
+  m_Intensity: 1
+  m_LightVolumeOpacity: 0
+  m_ApplyToSortingLayers: bf62004500000000a3b7b2db
+  m_LightCookieSprite: {fileID: 0}
+  m_UseNormalMap: 0
+  m_LightOrder: 0
+  m_AlphaBlendOnOverlap: 0
+  m_ShadowIntensity: 0
+  m_ShadowVolumeIntensity: 0
+  m_PointLightInnerAngle: 360
+  m_PointLightOuterAngle: 360
+  m_PointLightInnerRadius: 0
+  m_PointLightOuterRadius: 1
+  m_PointLightDistance: 3
+  m_PointLightQuality: 1
+  m_ShapeLightParametricSides: 5
+  m_ShapeLightParametricAngleOffset: 0
+  m_ShapeLightParametricRadius: 1
+  m_ShapeLightFalloffSize: 0.5
+  m_ShapeLightFalloffOffset: {x: 0, y: 0}
+  m_ShapePath:
+  - {x: -0.5, y: -0.5, z: 0}
+  - {x: 0.5, y: -0.5, z: 0}
+  - {x: 0.5, y: 0.5, z: 0}
+  - {x: -0.5, y: 0.5, z: 0}
+--- !u!1 &1325846906
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1325846907}
+  - component: {fileID: 1325846911}
+  - component: {fileID: 1325846910}
+  - component: {fileID: 1325846909}
+  - component: {fileID: 1325846908}
+  m_Layer: 0
+  m_Name: Mesh_Dirt
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1325846907
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1325846908
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: -3
+--- !u!114 &1325846909
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 128, y: 32}
+  spawnNewMeshWhenFull: 0
+  UVList:
+  - Vector_1: {x: 0, y: 16}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 16, y: 0}
+    Vector_4: {x: 16, y: 16}
+  - Vector_1: {x: 16, y: 16}
+    Vector_2: {x: 16, y: 0}
+    Vector_3: {x: 32, y: 0}
+    Vector_4: {x: 32, y: 16}
+  - Vector_1: {x: 32, y: 16}
+    Vector_2: {x: 32, y: 0}
+    Vector_3: {x: 48, y: 0}
+    Vector_4: {x: 48, y: 16}
+  - Vector_1: {x: 48, y: 16}
+    Vector_2: {x: 48, y: 0}
+    Vector_3: {x: 64, y: 0}
+    Vector_4: {x: 64, y: 16}
+  - Vector_1: {x: 64, y: 16}
+    Vector_2: {x: 64, y: 0}
+    Vector_3: {x: 80, y: 0}
+    Vector_4: {x: 80, y: 16}
+  - Vector_1: {x: 80, y: 16}
+    Vector_2: {x: 80, y: 0}
+    Vector_3: {x: 96, y: 0}
+    Vector_4: {x: 96, y: 16}
+  - Vector_1: {x: 96, y: 16}
+    Vector_2: {x: 96, y: 0}
+    Vector_3: {x: 112, y: 0}
+    Vector_4: {x: 112, y: 16}
+  - Vector_1: {x: 112, y: 16}
+    Vector_2: {x: 112, y: 0}
+    Vector_3: {x: 128, y: 0}
+    Vector_4: {x: 128, y: 16}
+  - Vector_1: {x: 0, y: 32}
+    Vector_2: {x: 0, y: 16}
+    Vector_3: {x: 16, y: 16}
+    Vector_4: {x: 16, y: 32}
+  - Vector_1: {x: 16, y: 32}
+    Vector_2: {x: 16, y: 16}
+    Vector_3: {x: 32, y: 16}
+    Vector_4: {x: 32, y: 32}
+  - Vector_1: {x: 32, y: 32}
+    Vector_2: {x: 32, y: 16}
+    Vector_3: {x: 48, y: 16}
+    Vector_4: {x: 48, y: 32}
+  - Vector_1: {x: 48, y: 32}
+    Vector_2: {x: 48, y: 16}
+    Vector_3: {x: 64, y: 16}
+    Vector_4: {x: 64, y: 32}
+  - Vector_1: {x: 64, y: 32}
+    Vector_2: {x: 64, y: 16}
+    Vector_3: {x: 80, y: 16}
+    Vector_4: {x: 80, y: 32}
+  - Vector_1: {x: 80, y: 32}
+    Vector_2: {x: 80, y: 16}
+    Vector_3: {x: 96, y: 16}
+    Vector_4: {x: 96, y: 32}
+  - Vector_1: {x: 96, y: 32}
+    Vector_2: {x: 96, y: 16}
+    Vector_3: {x: 112, y: 16}
+    Vector_4: {x: 112, y: 32}
+  - Vector_1: {x: 112, y: 32}
+    Vector_2: {x: 112, y: 16}
+    Vector_3: {x: 128, y: 16}
+    Vector_4: {x: 128, y: 32}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &1325846910
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: c4fcccf17d6525948bff0ba8e7066428, 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: -3
+--- !u!33 &1325846911
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Mesh: {fileID: 0}
+--- !u!1 &1575375738
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1575375740}
+  m_Layer: 0
+  m_Name: GameHandler
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1575375740
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1575375738}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1797793838}
+  - {fileID: 79197620}
+  - {fileID: 1065981920}
+  - {fileID: 387273712}
+  - {fileID: 1138890177}
+  - {fileID: 328557945}
+  - {fileID: 814888835}
+  - {fileID: 1915904523}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1632335932
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1632335934}
+  - component: {fileID: 1632335933}
+  m_Layer: 0
+  m_Name: CM vcam1
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1632335933
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1632335932}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 45e653bab7fb20e499bda25e1b646fea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ExcludedPropertiesInInspector:
+  - m_Script
+  m_LockStageInInspector: 
+  m_StreamingVersion: 20170927
+  m_Priority: 10
+  m_StandbyUpdate: 2
+  m_LookAt: {fileID: 0}
+  m_Follow: {fileID: 830715208}
+  m_Lens:
+    FieldOfView: 60
+    OrthographicSize: 40
+    NearClipPlane: 0.3
+    FarClipPlane: 1000
+    Dutch: 0
+    LensShift: {x: 0, y: 0}
+  m_Transitions:
+    m_BlendHint: 0
+    m_InheritPosition: 0
+    m_OnCameraLive:
+      m_PersistentCalls:
+        m_Calls: []
+  m_LegacyBlendHint: 0
+  m_ComponentOwner: {fileID: 1913717644}
+--- !u!4 &1632335934
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1632335932}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 47.5012, y: 42.590378, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1913717644}
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1797793837
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1797793838}
+  m_Layer: 0
+  m_Name: UI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1797793838
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1797793837}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 1000, y: 0, z: 1000}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 105464381}
+  - {fileID: 554223377}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1913717643
+GameObject:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1913717644}
+  - component: {fileID: 1913717646}
+  - component: {fileID: 1913717645}
+  m_Layer: 0
+  m_Name: cm
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1913717644
+Transform:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1913717643}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -0.7788945, y: 0.3834345, z: 9.409624}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1632335934}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1913717645
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1913717643}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6ad980451443d70438faac0bc6c235a0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_LookaheadTime: 0
+  m_LookaheadSmoothing: 10
+  m_LookaheadIgnoreY: 0
+  m_XDamping: 1
+  m_YDamping: 1
+  m_ZDamping: 1
+  m_ScreenX: 0.5
+  m_ScreenY: 0.5
+  m_CameraDistance: 10
+  m_DeadZoneWidth: 0
+  m_DeadZoneHeight: 0
+  m_DeadZoneDepth: 0
+  m_UnlimitedSoftZone: 0
+  m_SoftZoneWidth: 0.8
+  m_SoftZoneHeight: 0.8
+  m_BiasX: 0
+  m_BiasY: 0
+  m_CenterOnActivate: 1
+  m_GroupFramingMode: 2
+  m_AdjustmentMode: 0
+  m_GroupFramingSize: 0.8
+  m_MaxDollyIn: 5000
+  m_MaxDollyOut: 5000
+  m_MinimumDistance: 1
+  m_MaximumDistance: 5000
+  m_MinimumFOV: 3
+  m_MaximumFOV: 60
+  m_MinimumOrthoSize: 1
+  m_MaximumOrthoSize: 5000
+--- !u!114 &1913717646
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1913717643}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ac0b09e7857660247b1477e93731de29, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &1915904522
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1915904523}
+  - component: {fileID: 1915904524}
+  m_Layer: 0
+  m_Name: TextWriter
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1915904523
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1915904522}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 7
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1915904524
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1915904522}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: aebf1cca111a4a8408850f87281ce760, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 

+ 9 - 0
Assets/GridBuildingSystem/GameScene_GridBuildingSystem2D.unity.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 2eadc55a65daa9c458fd1abed3dc2141
+timeCreated: 1523793784
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1659 - 0
Assets/GridBuildingSystem/GameScene_GridBuildingSystem3D.unity

@@ -0,0 +1,1659 @@
+%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, g: 0, b: 0, 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: 87922511}
+  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+  m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+  m_ObjectHideFlags: 0
+  serializedVersion: 11
+  m_GIWorkflowMode: 1
+  m_GISettings:
+    serializedVersion: 2
+    m_BounceScale: 1
+    m_IndirectOutputScale: 1
+    m_AlbedoBoost: 1
+    m_EnvironmentLightingMode: 0
+    m_EnableBakedLightmaps: 1
+    m_EnableRealtimeLightmaps: 0
+  m_LightmapEditorSettings:
+    serializedVersion: 12
+    m_Resolution: 2
+    m_BakeResolution: 5
+    m_AtlasSize: 1024
+    m_AO: 1
+    m_AOMaxDistance: 1
+    m_CompAOExponent: 5.86
+    m_CompAOExponentDirect: 5.98
+    m_ExtractAmbientOcclusion: 0
+    m_Padding: 2
+    m_LightmapParameters: {fileID: 0}
+    m_LightmapsBakeMode: 1
+    m_TextureCompression: 0
+    m_FinalGather: 0
+    m_FinalGatherFiltering: 1
+    m_FinalGatherRayCount: 256
+    m_ReflectionCompression: 2
+    m_MixedBakeMode: 0
+    m_BakeBackend: 2
+    m_PVRSampling: 1
+    m_PVRDirectSampleCount: 100
+    m_PVRSampleCount: 100
+    m_PVRBounces: 2
+    m_PVREnvironmentSampleCount: 100
+    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: 0
+--- !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 &79197617
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 79197620}
+  - component: {fileID: 79197619}
+  - component: {fileID: 79197618}
+  m_Layer: 0
+  m_Name: EventSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &79197618
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalAxis: Horizontal
+  m_VerticalAxis: Vertical
+  m_SubmitButton: Submit
+  m_CancelButton: Cancel
+  m_InputActionsPerSecond: 10
+  m_RepeatDelay: 0.5
+  m_ForceModuleActive: 0
+--- !u!114 &79197619
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FirstSelected: {fileID: 0}
+  m_sendNavigationEvents: 1
+  m_DragThreshold: 5
+--- !u!4 &79197620
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 79197617}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &87922510
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 87922512}
+  - component: {fileID: 87922511}
+  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 &87922511
+Light:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 87922510}
+  m_Enabled: 1
+  serializedVersion: 10
+  m_Type: 1
+  m_Shape: 0
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_Intensity: 1
+  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: 0.3
+    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: 1
+  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 &87922512
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 87922510}
+  m_LocalRotation: {x: 0.4914524, y: 0.2506194, z: 0.0473229, w: 0.8327215}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 5
+  m_LocalEulerAnglesHint: {x: 52.633003, y: 49.851, z: 32.394}
+--- !u!1 &387273711
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 387273712}
+  m_Layer: 0
+  m_Name: Meshes
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &387273712
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 387273711}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 626059708}
+  - {fileID: 1325846907}
+  - {fileID: 780186272}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &475063744
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 475063745}
+  - component: {fileID: 475063746}
+  m_Layer: 0
+  m_Name: Mouse3D
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &475063745
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 475063744}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 10
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &475063746
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 475063744}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 78ae842c6da5aeb4a99503b05a947f78, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  mouseColliderLayerMask:
+    serializedVersion: 2
+    m_Bits: 1024
+--- !u!1 &554223376
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 554223377}
+  - component: {fileID: 554223380}
+  - component: {fileID: 554223379}
+  - component: {fileID: 554223378}
+  m_Layer: 0
+  m_Name: Canvas
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &554223377
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0, y: 0, z: 0}
+  m_Children: []
+  m_Father: {fileID: 1797793838}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0, y: 0}
+--- !u!114 &554223378
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreReversedGraphics: 1
+  m_BlockingObjects: 0
+  m_BlockingMask:
+    serializedVersion: 2
+    m_Bits: 4294967295
+--- !u!114 &554223379
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_UiScaleMode: 1
+  m_ReferencePixelsPerUnit: 100
+  m_ScaleFactor: 0.82
+  m_ReferenceResolution: {x: 1280, y: 720}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 1
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!223 &554223380
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 554223376}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_RenderMode: 0
+  m_Camera: {fileID: 0}
+  m_PlaneDistance: 100
+  m_PixelPerfect: 0
+  m_ReceivesEvents: 1
+  m_OverrideSorting: 0
+  m_OverridePixelPerfect: 0
+  m_SortingBucketNormalizedSize: 0
+  m_AdditionalShaderChannelsFlag: 0
+  m_SortingLayerID: 0
+  m_SortingOrder: 0
+  m_TargetDisplay: 0
+--- !u!1 &626059707
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 626059708}
+  - component: {fileID: 626059712}
+  - component: {fileID: 626059711}
+  - component: {fileID: 626059710}
+  - component: {fileID: 626059709}
+  m_Layer: 0
+  m_Name: Mesh_Blood
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &626059708
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &626059709
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: -4
+--- !u!114 &626059710
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 128, y: 16}
+  spawnNewMeshWhenFull: 1
+  UVList:
+  - Vector_1: {x: 0, y: 16}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 16, y: 0}
+    Vector_4: {x: 16, y: 16}
+  - Vector_1: {x: 16, y: 16}
+    Vector_2: {x: 16, y: 0}
+    Vector_3: {x: 32, y: 0}
+    Vector_4: {x: 32, y: 16}
+  - Vector_1: {x: 32, y: 16}
+    Vector_2: {x: 32, y: 0}
+    Vector_3: {x: 48, y: 0}
+    Vector_4: {x: 48, y: 16}
+  - Vector_1: {x: 48, y: 16}
+    Vector_2: {x: 48, y: 0}
+    Vector_3: {x: 64, y: 0}
+    Vector_4: {x: 64, y: 16}
+  - Vector_1: {x: 64, y: 16}
+    Vector_2: {x: 64, y: 0}
+    Vector_3: {x: 80, y: 0}
+    Vector_4: {x: 80, y: 16}
+  - Vector_1: {x: 80, y: 16}
+    Vector_2: {x: 80, y: 0}
+    Vector_3: {x: 96, y: 0}
+    Vector_4: {x: 96, y: 16}
+  - Vector_1: {x: 96, y: 16}
+    Vector_2: {x: 96, y: 0}
+    Vector_3: {x: 112, y: 0}
+    Vector_4: {x: 112, y: 16}
+  - Vector_1: {x: 112, y: 16}
+    Vector_2: {x: 112, y: 0}
+    Vector_3: {x: 128, y: 0}
+    Vector_4: {x: 128, y: 16}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &626059711
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: a6090c6a3b8cf1c49874a1abb645b5a7, 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: -4
+--- !u!33 &626059712
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 626059707}
+  m_Mesh: {fileID: 0}
+--- !u!1 &773525417
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 773525419}
+  - component: {fileID: 773525418}
+  m_Layer: 0
+  m_Name: CM vcam1
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &773525418
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 773525417}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 45e653bab7fb20e499bda25e1b646fea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ExcludedPropertiesInInspector:
+  - m_Script
+  m_LockStageInInspector: 
+  m_StreamingVersion: 20170927
+  m_Priority: 10
+  m_StandbyUpdate: 2
+  m_LookAt: {fileID: 0}
+  m_Follow: {fileID: 2138980713}
+  m_Lens:
+    FieldOfView: 50
+    OrthographicSize: 70
+    NearClipPlane: 0.3
+    FarClipPlane: 1000
+    Dutch: 0
+    LensShift: {x: 0, y: 0}
+  m_Transitions:
+    m_BlendHint: 0
+    m_InheritPosition: 0
+    m_OnCameraLive:
+      m_PersistentCalls:
+        m_Calls: []
+  m_LegacyBlendHint: 0
+  m_ComponentOwner: {fileID: 2051895204}
+--- !u!4 &773525419
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 773525417}
+  m_LocalRotation: {x: 0.33036605, y: 0.2432104, z: -0.08852133, w: 0.9076734}
+  m_LocalPosition: {x: 11.538803, y: 30, z: -10.927739}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 2051895204}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 8
+  m_LocalEulerAnglesHint: {x: 40, y: 30, z: 0}
+--- !u!1 &780186271
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 780186272}
+  - component: {fileID: 780186276}
+  - component: {fileID: 780186275}
+  - component: {fileID: 780186274}
+  - component: {fileID: 780186273}
+  m_Layer: 0
+  m_Name: Mesh_Top
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &780186272
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &780186273
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: 10000
+--- !u!114 &780186274
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 512, y: 512}
+  spawnNewMeshWhenFull: 0
+  UVList:
+  - Vector_1: {x: 0, y: 512}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 512, y: 0}
+    Vector_4: {x: 512, y: 512}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &780186275
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 6123fb67bbc1fad408e07ccbb8fa9fcb, 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: 10000
+--- !u!33 &780186276
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 780186271}
+  m_Mesh: {fileID: 0}
+--- !u!1 &806761472
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 806761473}
+  - component: {fileID: 806761474}
+  m_Layer: 11
+  m_Name: BuildingGhost
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &806761473
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 806761472}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &806761474
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 806761472}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 72cba4a9acc909a45b3a0292f5926d31, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1001 &814888834
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    m_TransformParent: {fileID: 1575375740}
+    m_Modifications:
+    - target: {fileID: 1848020400031394, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_Name
+      value: GameAssets
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -2.0506113
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 11.127766
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: -0.30743352
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_RootOrder
+      value: 7
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: dee376222848e90438fb664630ef1ed2, type: 3}
+--- !u!4 &814888835 stripped
+Transform:
+  m_CorrespondingSourceObject: {fileID: 4660278464350348, guid: dee376222848e90438fb664630ef1ed2,
+    type: 3}
+  m_PrefabInstance: {fileID: 814888834}
+  m_PrefabAsset: {fileID: 0}
+--- !u!1 &963480885
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 963480887}
+  - component: {fileID: 963480886}
+  m_Layer: 0
+  m_Name: BuildingSound
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &963480886
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963480885}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 057aa5117047d4e44908d6aee054c4c1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  gridBuildingSystem3D: {fileID: 1749865708}
+  gridBuildingSystem2D: {fileID: 0}
+  pfBuildingSound: {fileID: 3344039833696424170, guid: 7763a701df95c6848a506e21230d6dab,
+    type: 3}
+--- !u!4 &963480887
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 963480885}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 3
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1065981916
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1065981920}
+  - component: {fileID: 1065981919}
+  - component: {fileID: 1065981918}
+  - component: {fileID: 1065981917}
+  - component: {fileID: 1065981922}
+  - component: {fileID: 1065981921}
+  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 &1065981917
+AudioListener:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+--- !u!124 &1065981918
+Behaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+--- !u!20 &1065981919
+Camera:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  serializedVersion: 2
+  m_ClearFlags: 1
+  m_BackGroundColor: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1}
+  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: 50
+  orthographic: 0
+  orthographic size: 70
+  m_Depth: -1
+  m_CullingMask:
+    serializedVersion: 2
+    m_Bits: 4294967039
+  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 &1065981920
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_LocalRotation: {x: 0.33036605, y: 0.2432104, z: -0.08852133, w: 0.9076734}
+  m_LocalPosition: {x: 11.538803, y: 30, z: -10.927739}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 6
+  m_LocalEulerAnglesHint: {x: 40, y: 30, z: 0}
+--- !u!114 &1065981921
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 72ece51f2901e7445ab60da3685d6b5f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ShowDebugText: 0
+  m_ShowCameraFrustum: 1
+  m_IgnoreTimeScale: 0
+  m_WorldUpOverride: {fileID: 0}
+  m_UpdateMethod: 2
+  m_BlendUpdateMethod: 1
+  m_DefaultBlend:
+    m_Style: 1
+    m_Time: 2
+    m_CustomCurve:
+      serializedVersion: 2
+      m_Curve: []
+      m_PreInfinity: 2
+      m_PostInfinity: 2
+      m_RotationOrder: 4
+  m_CustomBlends: {fileID: 0}
+  m_CameraCutEvent:
+    m_PersistentCalls:
+      m_Calls: []
+  m_CameraActivatedEvent:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!114 &1065981922
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1065981916}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_RenderShadows: 1
+  m_RequiresDepthTextureOption: 2
+  m_RequiresOpaqueTextureOption: 2
+  m_CameraType: 0
+  m_Cameras: []
+  m_RendererIndex: -1
+  m_VolumeLayerMask:
+    serializedVersion: 2
+    m_Bits: 1
+  m_VolumeTrigger: {fileID: 0}
+  m_RenderPostProcessing: 1
+  m_Antialiasing: 0
+  m_AntialiasingQuality: 2
+  m_StopNaN: 0
+  m_Dithering: 0
+  m_ClearDepth: 1
+  m_RequiresDepthTexture: 0
+  m_RequiresColorTexture: 0
+  m_Version: 2
+--- !u!1 &1155196264
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1155196268}
+  - component: {fileID: 1155196267}
+  - component: {fileID: 1155196266}
+  - component: {fileID: 1155196265}
+  m_Layer: 10
+  m_Name: Ground
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!65 &1155196265
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1155196264}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!23 &1155196266
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1155196264}
+  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: e3da5dbede43e3e4f8b24b0e846d463d, 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: 1
+  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 &1155196267
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1155196264}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1155196268
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1155196264}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 60, y: 0, z: 60}
+  m_LocalScale: {x: 200, y: 0.1, z: 200}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1325846906
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1325846907}
+  - component: {fileID: 1325846911}
+  - component: {fileID: 1325846910}
+  - component: {fileID: 1325846909}
+  - component: {fileID: 1325846908}
+  m_Layer: 0
+  m_Name: Mesh_Dirt
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1325846907
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 387273712}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1325846908
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1b43e1de8460bbd429abad1c1eb5b726, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  sortingLayerName: 
+  sortingOrder: -3
+--- !u!114 &1325846909
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: cc382eaa73f3b31428faf672575002b4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  bounds:
+    m_Center: {x: 0, y: 0, z: 0}
+    m_Extent: {x: 1000, y: 1000, z: 0}
+  amtMax: 3000
+  UVTextureSize: {x: 128, y: 32}
+  spawnNewMeshWhenFull: 0
+  UVList:
+  - Vector_1: {x: 0, y: 16}
+    Vector_2: {x: 0, y: 0}
+    Vector_3: {x: 16, y: 0}
+    Vector_4: {x: 16, y: 16}
+  - Vector_1: {x: 16, y: 16}
+    Vector_2: {x: 16, y: 0}
+    Vector_3: {x: 32, y: 0}
+    Vector_4: {x: 32, y: 16}
+  - Vector_1: {x: 32, y: 16}
+    Vector_2: {x: 32, y: 0}
+    Vector_3: {x: 48, y: 0}
+    Vector_4: {x: 48, y: 16}
+  - Vector_1: {x: 48, y: 16}
+    Vector_2: {x: 48, y: 0}
+    Vector_3: {x: 64, y: 0}
+    Vector_4: {x: 64, y: 16}
+  - Vector_1: {x: 64, y: 16}
+    Vector_2: {x: 64, y: 0}
+    Vector_3: {x: 80, y: 0}
+    Vector_4: {x: 80, y: 16}
+  - Vector_1: {x: 80, y: 16}
+    Vector_2: {x: 80, y: 0}
+    Vector_3: {x: 96, y: 0}
+    Vector_4: {x: 96, y: 16}
+  - Vector_1: {x: 96, y: 16}
+    Vector_2: {x: 96, y: 0}
+    Vector_3: {x: 112, y: 0}
+    Vector_4: {x: 112, y: 16}
+  - Vector_1: {x: 112, y: 16}
+    Vector_2: {x: 112, y: 0}
+    Vector_3: {x: 128, y: 0}
+    Vector_4: {x: 128, y: 16}
+  - Vector_1: {x: 0, y: 32}
+    Vector_2: {x: 0, y: 16}
+    Vector_3: {x: 16, y: 16}
+    Vector_4: {x: 16, y: 32}
+  - Vector_1: {x: 16, y: 32}
+    Vector_2: {x: 16, y: 16}
+    Vector_3: {x: 32, y: 16}
+    Vector_4: {x: 32, y: 32}
+  - Vector_1: {x: 32, y: 32}
+    Vector_2: {x: 32, y: 16}
+    Vector_3: {x: 48, y: 16}
+    Vector_4: {x: 48, y: 32}
+  - Vector_1: {x: 48, y: 32}
+    Vector_2: {x: 48, y: 16}
+    Vector_3: {x: 64, y: 16}
+    Vector_4: {x: 64, y: 32}
+  - Vector_1: {x: 64, y: 32}
+    Vector_2: {x: 64, y: 16}
+    Vector_3: {x: 80, y: 16}
+    Vector_4: {x: 80, y: 32}
+  - Vector_1: {x: 80, y: 32}
+    Vector_2: {x: 80, y: 16}
+    Vector_3: {x: 96, y: 16}
+    Vector_4: {x: 96, y: 32}
+  - Vector_1: {x: 96, y: 32}
+    Vector_2: {x: 96, y: 16}
+    Vector_3: {x: 112, y: 16}
+    Vector_4: {x: 112, y: 32}
+  - Vector_1: {x: 112, y: 32}
+    Vector_2: {x: 112, y: 16}
+    Vector_3: {x: 128, y: 16}
+    Vector_4: {x: 128, y: 32}
+  updateRate: 0.02
+  destroy: 0
+--- !u!23 &1325846910
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  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: 4294967295
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: c4fcccf17d6525948bff0ba8e7066428, 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: -3
+--- !u!33 &1325846911
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1325846906}
+  m_Mesh: {fileID: 0}
+--- !u!1 &1575375738
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1575375740}
+  m_Layer: 0
+  m_Name: GameHandler
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1575375740
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1575375738}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 1797793838}
+  - {fileID: 79197620}
+  - {fileID: 1577821638}
+  - {fileID: 387273712}
+  - {fileID: 1155196268}
+  - {fileID: 87922512}
+  - {fileID: 1065981920}
+  - {fileID: 814888835}
+  - {fileID: 773525419}
+  - {fileID: 2138980713}
+  - {fileID: 475063745}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1577821637
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1577821638}
+  - component: {fileID: 1577821639}
+  m_Layer: 0
+  m_Name: PostProcessingVolume
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1577821638
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1577821637}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: -10}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1577821639
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1577821637}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  isGlobal: 1
+  priority: 0
+  blendDistance: 0
+  weight: 1
+  sharedProfile: {fileID: 11400000, guid: 7dce7ca22e97fea4a92f8624979214c8, type: 2}
+--- !u!1 &1749865707
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1749865709}
+  - component: {fileID: 1749865708}
+  m_Layer: 0
+  m_Name: GridBuildingSystem
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1749865708
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1749865707}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f19a6e328721df640963e9f2f9ac7cbd, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  placedObjectTypeSOList:
+  - {fileID: 11400000, guid: 7babf3f7f4d6bc54d9130413fc704cc1, type: 2}
+  - {fileID: 11400000, guid: b849b211769ce1c42b1b4c11fcc8533d, type: 2}
+  - {fileID: 11400000, guid: 709fc383cbbe34142b4a2e8ae48173f8, type: 2}
+  - {fileID: 11400000, guid: 67175f7dc2641d44da6a9a121df9b1d3, type: 2}
+  - {fileID: 11400000, guid: fa9af11f625862a4c9404b8b3890aec4, type: 2}
+  - {fileID: 11400000, guid: b347ff2852da2c942aaefce20644d7b8, type: 2}
+--- !u!4 &1749865709
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1749865707}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1797793837
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1797793838}
+  m_Layer: 0
+  m_Name: UI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1797793838
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1797793837}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 1000, y: 0, z: 1000}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 554223377}
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &2051895203
+GameObject:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2051895204}
+  - component: {fileID: 2051895207}
+  - component: {fileID: 2051895205}
+  m_Layer: 0
+  m_Name: cm
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2051895204
+Transform:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2051895203}
+  m_LocalRotation: {x: 0.1931838, y: 0.22495659, z: -0.045557804, w: -0.9539387}
+  m_LocalPosition: {x: -0.8732643, y: 3.48065, z: 72.87586}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 773525419}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2051895205
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2051895203}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fa7155796051b734daa718462081dc5f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_BindingMode: 1
+  m_FollowOffset: {x: 0, y: 30, z: 0}
+  m_XDamping: 1
+  m_YDamping: 1
+  m_ZDamping: 1
+  m_AngularDampingMode: 0
+  m_PitchDamping: 0
+  m_YawDamping: 0
+  m_RollDamping: 0
+  m_AngularDamping: 0
+--- !u!114 &2051895207
+MonoBehaviour:
+  m_ObjectHideFlags: 3
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2051895203}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ac0b09e7857660247b1477e93731de29, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &2138980712
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2138980713}
+  - component: {fileID: 2138980714}
+  m_Layer: 0
+  m_Name: CameraTarget
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2138980713
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2138980712}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 11.538803, y: 0, z: -10.927739}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 1575375740}
+  m_RootOrder: 9
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2138980714
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2138980712}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 969f2427847e50c458ed8e204e5ade1f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  axis: 0
+  moveSpeed: 50

+ 9 - 0
Assets/GridBuildingSystem/GameScene_GridBuildingSystem3D.unity.meta

@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ffc5f85f769b4c940bcc631a2e2d08bd
+timeCreated: 1523793784
+licenseType: Pro
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/GridBuildingSystem/Materials.meta

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

+ 129 - 0
Assets/GridBuildingSystem/Materials/Anchor.mat

@@ -0,0 +1,129 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Anchor
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_ValidKeywords:
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - SHADOWCASTER
+  - DepthOnly
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _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}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _Blend: 0
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 5
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0.101122856, g: 1, b: 0, a: 1}
+    - _Color: {r: 0.101122856, g: 1, b: 0, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &5115235824639973746
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 5

+ 8 - 0
Assets/GridBuildingSystem/Materials/Anchor.mat.meta

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

+ 129 - 0
Assets/GridBuildingSystem/Materials/Ghost.mat

@@ -0,0 +1,129 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Ghost
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_ValidKeywords:
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - SHADOWCASTER
+  - DepthOnly
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _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}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _Blend: 0
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 5
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0, g: 0.78094625, b: 1, a: 0.28235295}
+    - _Color: {r: 0, g: 0.78094625, b: 1, a: 0.28235295}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &5115235824639973746
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 5

+ 8 - 0
Assets/GridBuildingSystem/Materials/Ghost.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 72bdd373775d53f469945fdfbe87b976
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 129 - 0
Assets/GridBuildingSystem/Materials/Grey.mat

@@ -0,0 +1,129 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Grey
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_ValidKeywords:
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - SHADOWCASTER
+  - DepthOnly
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _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}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _Blend: 0
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 5
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1}
+    - _Color: {r: 0.3207547, g: 0.3207547, b: 0.3207547, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &5115235824639973746
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 5

+ 8 - 0
Assets/GridBuildingSystem/Materials/Grey.mat.meta

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

+ 129 - 0
Assets/GridBuildingSystem/Materials/GreyTransparent.mat

@@ -0,0 +1,129 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: GreyTransparent
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_ValidKeywords:
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - SHADOWCASTER
+  - DepthOnly
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _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}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AlphaClip: 0
+    - _Blend: 0
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 5
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0, g: 0.78094625, b: 1, a: 0.28235295}
+    - _Color: {r: 0, g: 0.78094625, b: 1, a: 0.28235295}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
+  m_BuildTextureStacks: []
+--- !u!114 &5115235824639973746
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  version: 5

+ 8 - 0
Assets/GridBuildingSystem/Materials/GreyTransparent.mat.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 08ae8bac2531eab4ab63aacf6f7aa270
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Assets/GridBuildingSystem/Prefabs.meta

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

+ 8 - 0
Assets/GridBuildingSystem/Prefabs/Visuals.meta

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

+ 220 - 0
Assets/GridBuildingSystem/Prefabs/Visuals/BuildingVisual.prefab

@@ -0,0 +1,220 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1456656668474129271
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2499414142690952232}
+  m_Layer: 0
+  m_Name: BuildingVisual
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2499414142690952232
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1456656668474129271}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3997620240393340812}
+  - {fileID: 7498211316536848695}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &3997620240393340808
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3997620240393340812}
+  - component: {fileID: 3997620240393340813}
+  - component: {fileID: 3997620240393340814}
+  - component: {fileID: 3997620240393340815}
+  m_Layer: 0
+  m_Name: Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3997620240393340812
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 5, y: 0, z: 5}
+  m_LocalScale: {x: 10, y: 1, z: 10}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3997620240393340813
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3997620240393340814
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  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: 08ae8bac2531eab4ab63aacf6f7aa270, 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: 1
+  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!65 &3997620240393340815
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &5149259365084036331
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7498211316536848695}
+  - component: {fileID: 9016978913842552167}
+  - component: {fileID: 5561775182755762708}
+  - component: {fileID: 4612688024572091603}
+  m_Layer: 0
+  m_Name: Anchor
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7498211316536848695
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5149259365084036331}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &9016978913842552167
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5149259365084036331}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &5561775182755762708
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5149259365084036331}
+  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: ea15e7578fcaba245ae39d4619ef838c, 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: 1
+  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!65 &4612688024572091603
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5149259365084036331}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}

+ 7 - 0
Assets/GridBuildingSystem/Prefabs/Visuals/BuildingVisual.prefab.meta

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

+ 220 - 0
Assets/GridBuildingSystem/Prefabs/Visuals/FireStationVisual.prefab

@@ -0,0 +1,220 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1456656668474129271
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2499414142690952232}
+  m_Layer: 0
+  m_Name: FireStationVisual
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2499414142690952232
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1456656668474129271}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3997620240393340812}
+  - {fileID: 5123986218844527272}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &3997620240393340808
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3997620240393340812}
+  - component: {fileID: 3997620240393340813}
+  - component: {fileID: 3997620240393340814}
+  - component: {fileID: 3997620240393340815}
+  m_Layer: 0
+  m_Name: Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3997620240393340812
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 5, y: 0, z: 5}
+  m_LocalScale: {x: 10, y: 1, z: 10}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3997620240393340813
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3997620240393340814
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  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: 08ae8bac2531eab4ab63aacf6f7aa270, 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: 1
+  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!65 &3997620240393340815
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &5065133502172637794
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5123986218844527272}
+  - component: {fileID: 8728624695356609942}
+  - component: {fileID: 3433779538208694218}
+  - component: {fileID: 6938162740392752570}
+  m_Layer: 0
+  m_Name: Anchor
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5123986218844527272
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5065133502172637794}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &8728624695356609942
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5065133502172637794}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3433779538208694218
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5065133502172637794}
+  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: ea15e7578fcaba245ae39d4619ef838c, 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: 1
+  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!65 &6938162740392752570
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5065133502172637794}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}

+ 7 - 0
Assets/GridBuildingSystem/Prefabs/Visuals/FireStationVisual.prefab.meta

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

+ 220 - 0
Assets/GridBuildingSystem/Prefabs/Visuals/GasStationVisual.prefab

@@ -0,0 +1,220 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1456656668474129271
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2499414142690952232}
+  m_Layer: 0
+  m_Name: GasStationVisual
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2499414142690952232
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1456656668474129271}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 3997620240393340812}
+  - {fileID: 8617583971755733324}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &3997620240393340808
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3997620240393340812}
+  - component: {fileID: 3997620240393340813}
+  - component: {fileID: 3997620240393340814}
+  - component: {fileID: 3997620240393340815}
+  m_Layer: 0
+  m_Name: Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3997620240393340812
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 10, y: 0, z: 5}
+  m_LocalScale: {x: 20, y: 1, z: 10}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3997620240393340813
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &3997620240393340814
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  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: 08ae8bac2531eab4ab63aacf6f7aa270, 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: 1
+  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!65 &3997620240393340815
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3997620240393340808}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &5770087395508685485
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8617583971755733324}
+  - component: {fileID: 2989869888645776690}
+  - component: {fileID: 6086553398823026690}
+  - component: {fileID: 2547895062214432643}
+  m_Layer: 0
+  m_Name: Anchor
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &8617583971755733324
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5770087395508685485}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_Children: []
+  m_Father: {fileID: 2499414142690952232}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &2989869888645776690
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5770087395508685485}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &6086553398823026690
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5770087395508685485}
+  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: ea15e7578fcaba245ae39d4619ef838c, 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: 1
+  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!65 &2547895062214432643
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5770087395508685485}
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_Enabled: 1
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1, z: 1}
+  m_Center: {x: 0, y: 0, z: 0}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio