From 4419091321356869eb9266b0e14bf665716a80ad Mon Sep 17 00:00:00 2001 From: Leroy Date: Tue, 19 May 2020 16:29:51 +0200 Subject: [PATCH] Version 0.4b1 (#7) * SIM-51 (#5) * - Added new icons - Added legend for buildings - Added arrow keys for camera control - Updated config files - Updated README - Fixed Bomb being invisible - Removed horizontal scrollbar from traffic popup - Added + / - for zooming * SIM-52 (#6) * - Added colors for selected layer - Done some optimization - Made bomb smaller - Removed + and - for zooming. Only use keypad + and - or scroll for zooming - Fixed a bug in the plane navigator for selecting a bomb target - Fixed grid manager - Increased default tiles per street to 60 - Updated Inno Setup version to 0.4b1 --- .gitignore | 13 + README.md | 28 +- innosetup.iss | 2 +- src/Assets/FreeAssets/Prefabs/Bomb.prefab | 4 +- .../Prefabs/UI/UI_Image_Legend.prefab | 231 ++++++++ .../Prefabs/UI/UI_Image_Legend.prefab.meta | 7 + ...refab => UI_Image_TrafficBottomBar.prefab} | 0 ... => UI_Image_TrafficBottomBar.prefab.meta} | 0 .../Sprites/iconfinder_arrow138_216456.png | Bin 0 -> 12774 bytes .../iconfinder_arrow138_216456.png.meta | 116 ++++ .../Sprites/iconfinder_chevron12_216466.png | Bin 0 -> 12730 bytes .../iconfinder_chevron12_216466.png.meta | 116 ++++ .../Sprites/iconfinder_close16_216470.png | Bin 0 -> 12887 bytes .../iconfinder_close16_216470.png.meta | 116 ++++ .../Sprites/iconfinder_view6_216550.png | Bin 0 -> 9639 bytes .../Sprites/iconfinder_view6_216550.png.meta | 116 ++++ src/Assets/Scenes/MainScene.unity | 560 ++++++++++++------ .../Scripts/Components/BuildingLegend.cs | 56 ++ .../Scripts/Components/BuildingLegend.cs.meta | 11 + .../Components/Navigators/PlaneNavigator.cs | 3 +- src/Assets/Scripts/Components/TrafficPopup.cs | 25 +- src/Assets/Scripts/Managers/AssetsManager.cs | 21 + .../Scripts/Managers/CameraController.cs | 25 +- src/Assets/Scripts/Managers/GridManager.cs | 9 +- src/Assets/Scripts/Managers/LayerManager.cs | 82 ++- .../Scripts/Managers/SettingsManager.cs | 6 +- src/Assets/Scripts/Managers/TrafficManager.cs | 7 +- .../Models/Settings/AssetBundleSettings.cs | 2 + src/Assets/Scripts/Utils/Singleton.cs | 2 +- src/Preset config files/config-free.json | 10 +- src/Preset config files/config-paid.json | 20 +- src/ProjectSettings/ProjectSettings.asset | 2 +- src/config.json | 20 +- 33 files changed, 1352 insertions(+), 258 deletions(-) create mode 100644 .gitignore create mode 100644 src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab create mode 100644 src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab.meta rename src/Assets/Resources/Prefabs/UI/{UI_Image.prefab => UI_Image_TrafficBottomBar.prefab} (100%) rename src/Assets/Resources/Prefabs/UI/{UI_Image.prefab.meta => UI_Image_TrafficBottomBar.prefab.meta} (100%) create mode 100644 src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png create mode 100644 src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png.meta create mode 100644 src/Assets/Resources/Sprites/iconfinder_chevron12_216466.png create mode 100644 src/Assets/Resources/Sprites/iconfinder_chevron12_216466.png.meta create mode 100644 src/Assets/Resources/Sprites/iconfinder_close16_216470.png create mode 100644 src/Assets/Resources/Sprites/iconfinder_close16_216470.png.meta create mode 100644 src/Assets/Resources/Sprites/iconfinder_view6_216550.png create mode 100644 src/Assets/Resources/Sprites/iconfinder_view6_216550.png.meta create mode 100644 src/Assets/Scripts/Components/BuildingLegend.cs create mode 100644 src/Assets/Scripts/Components/BuildingLegend.cs.meta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2bdd35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/src/Assets/AssetBundles/paid.meta +/src/Assets/AssetBundles/paid.meta +/src/Assets/AssetBundles/paid.manifest.meta +/src/Assets/AssetBundles/paid.manifest +/src/Assets/AssetBundles/paid +/src/Assets/AssetBundles/free.meta +/src/Assets/AssetBundles/free.manifest.meta +/src/Assets/AssetBundles/free.manifest +/src/Assets/AssetBundles/free diff --git a/README.md b/README.md index 4742cdc..d8f97c7 100644 --- a/README.md +++ b/README.md @@ -59,15 +59,15 @@ If you want to use these assets, read chapter 5.1 | Key | Action | |------------------------|-----------------------------------------------------------------| -| W | Move the camera forward | -| A | Move the camera to the left | -| S | Move the camera backwards | -| D | Move the camera to the right | +| W / Up Arrow | Move the camera forward | +| A / Left Arrow | Move the camera to the left | +| S / Down Arrow | Move the camera backwards | +| D / Right Arrow | Move the camera to the right | | Escape | Go back to the main menu | | F4 | Open the debug console | | Left mouse button | When clicked on a building or vehicle it displays information | | Hold right mouse button| Rotate the camera around | -| Scroll | Zoom in or out | +| Scroll / KP + or - | Zoom in or out | ## 2. Configuration @@ -158,6 +158,8 @@ Example configuration: "Rotation": 0 } ], + "Label": "$", + "Name": "BuildingS", "MinSize": 15 }, { @@ -173,6 +175,8 @@ Example configuration: "Rotation": 0 } ], + "Label": "$$", + "Name": "BuildingM", "MinSize": 20 }, { @@ -188,6 +192,8 @@ Example configuration: "Rotation": 0 } ], + "Label": "$$$", + "Name": "BuildingL", "MinSize": 30 } ], @@ -340,7 +346,7 @@ The game model looks like the following: ], "layers": [ // Types of layers { - "icon": "images/cpu_icon.png", // Location to image on the back-end for example https://simtainer.yourorginzation.local/images/cpu_icon.png + "icon": "images/cpu_icon.png", // Location to image on the back-end for example https://simtainer.yourorganization.local/images/cpu_icon.png "layerType": "cpuLayer" // Name of the layer }, { @@ -482,13 +488,15 @@ Depending on the size of the input the game will choose a vehicle to use. You ca Layers are fully dynamic depending on the API. Images should be placed at `BASEURL/images/example_icon.png`. These images are loaded in the game. You can find the example JSON at paragraph 3.2. +**It is important to use a white icon, since Unity can only colorize white sprites.** + We used the layers for metrics about CPU, Memory and 500 error's. Layers are managed in the LayerManager class. You can see the layers in action in the gif at the beginning of this readme. -To disable Team Selection, edit the `config.json`. +To disable Layers, edit the `config.json`. ### 4.4 Team selection @@ -593,4 +601,8 @@ There are other managers that have events as well, but the order does not matter ## 7. Developer note -This project is my graduation project. If you have any questions, feedback or suggestions, feel free to contact me! +This project is a graduation project. If you have any questions, feedback or suggestions, feel free to contact us (Harm Weites, Sebastiaan Bekker or Leroy van Dijk)! + +## 8. Icons + +Icons used in this project are from iconfinder.com created by DesignerzBase. diff --git a/innosetup.iss b/innosetup.iss index 61699a9..858a44a 100644 --- a/innosetup.iss +++ b/innosetup.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "SimTainer" -#define MyAppVersion "0.3b2" +#define MyAppVersion "0.4b1" #define MyAppPublisher "Wehkamp" #define MyAppExeName "SimTainer.exe" diff --git a/src/Assets/FreeAssets/Prefabs/Bomb.prefab b/src/Assets/FreeAssets/Prefabs/Bomb.prefab index ce823d6..a447aa2 100644 --- a/src/Assets/FreeAssets/Prefabs/Bomb.prefab +++ b/src/Assets/FreeAssets/Prefabs/Bomb.prefab @@ -29,7 +29,7 @@ Transform: m_GameObject: {fileID: 3285111104184262078} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 233, y: 97.042, z: 109.59628} - m_LocalScale: {x: 10, y: 10, z: 10} + m_LocalScale: {x: 5, y: 5, z: 5} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 @@ -41,7 +41,7 @@ MeshFilter: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3285111104184262078} - m_Mesh: {fileID: 0} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &3539207181720727468 MeshRenderer: m_ObjectHideFlags: 0 diff --git a/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab b/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab new file mode 100644 index 0000000..8002808 --- /dev/null +++ b/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab @@ -0,0 +1,231 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &993539185272044432 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 993539185272044447} + - component: {fileID: 993539185272044445} + - component: {fileID: 993539185272044446} + m_Layer: 5 + m_Name: UI_Image_Legend + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &993539185272044447 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539185272044432} + 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: 993539187335799542} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -662.4, y: -0.7} + m_SizeDelta: {x: 32, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &993539185272044445 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539185272044432} + m_CullTransparentMesh: 0 +--- !u!114 &993539185272044446 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539185272044432} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 12ade680e28b952408205c4d13d60c45, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &993539187335799543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 993539187335799542} + - component: {fileID: 993539187335799540} + - component: {fileID: 993539187335799541} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &993539187335799542 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539187335799543} + 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: 993539185272044447} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 44.18, y: -0.7} + m_SizeDelta: {x: 50.222656, y: 21.04004} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &993539187335799540 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539187335799543} + m_CullTransparentMesh: 0 +--- !u!114 &993539187335799541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993539187335799543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: $$$$$ + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278255421 + m_fontColor: {r: 0.23950672, g: 1, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_outlineColor: + serializedVersion: 2 + rgba: 4278190080 + m_fontSize: 16 + m_fontSizeBase: 16 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_textAlignment: 257 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 3 + m_firstOverflowCharacterIndex: -1 + m_linkedTextComponent: {fileID: 0} + m_isLinkedTextComponent: 0 + m_isTextTruncated: 0 + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_ignoreRectMaskCulling: 0 + m_ignoreCulling: 1 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_VertexBufferAutoSizeReduction: 1 + m_firstVisibleCharacter: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0.12007904, w: 0.46959114} + m_textInfo: + textComponent: {fileID: 993539187335799541} + characterCount: 5 + spriteCount: 0 + spaceCount: 0 + wordCount: 1 + linkCount: 0 + lineCount: 1 + pageCount: 1 + materialCount: 1 + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_spriteAnimator: {fileID: 0} + m_hasFontAssetChanged: 0 + m_subTextObjects: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab.meta b/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab.meta new file mode 100644 index 0000000..a0ae8db --- /dev/null +++ b/src/Assets/Resources/Prefabs/UI/UI_Image_Legend.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 47d8790486204c448a548564093a49c5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Assets/Resources/Prefabs/UI/UI_Image.prefab b/src/Assets/Resources/Prefabs/UI/UI_Image_TrafficBottomBar.prefab similarity index 100% rename from src/Assets/Resources/Prefabs/UI/UI_Image.prefab rename to src/Assets/Resources/Prefabs/UI/UI_Image_TrafficBottomBar.prefab diff --git a/src/Assets/Resources/Prefabs/UI/UI_Image.prefab.meta b/src/Assets/Resources/Prefabs/UI/UI_Image_TrafficBottomBar.prefab.meta similarity index 100% rename from src/Assets/Resources/Prefabs/UI/UI_Image.prefab.meta rename to src/Assets/Resources/Prefabs/UI/UI_Image_TrafficBottomBar.prefab.meta diff --git a/src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png b/src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png new file mode 100644 index 0000000000000000000000000000000000000000..9bdd4a4ee1a3dca31762892ef13491a8b58c7039 GIT binary patch literal 12774 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 R|EK}8Fts&#VeEPD{{uE4$2I@} literal 0 HcmV?d00001 diff --git a/src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png.meta b/src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png.meta new file mode 100644 index 0000000..63bc750 --- /dev/null +++ b/src/Assets/Resources/Sprites/iconfinder_arrow138_216456.png.meta @@ -0,0 +1,116 @@ +fileFormatVersion: 2 +guid: 2387d0752141b844a8d0f1b44c4653d0 +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 + - 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 + - serializedVersion: 3 + buildTarget: WebGL + 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: diff --git a/src/Assets/Resources/Sprites/iconfinder_chevron12_216466.png b/src/Assets/Resources/Sprites/iconfinder_chevron12_216466.png new file mode 100644 index 0000000000000000000000000000000000000000..4a776c08d17b094b9863f45168b4cba494785655 GIT binary patch literal 12730 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 W+6?+$58t!`jP%SeRbOzv_x}KSHM-yc literal 0 HcmV?d00001 diff --git a/src/Assets/Resources/Sprites/iconfinder_view6_216550.png.meta b/src/Assets/Resources/Sprites/iconfinder_view6_216550.png.meta new file mode 100644 index 0000000..aea20f4 --- /dev/null +++ b/src/Assets/Resources/Sprites/iconfinder_view6_216550.png.meta @@ -0,0 +1,116 @@ +fileFormatVersion: 2 +guid: f42261716cb815447bc356ff2ea20574 +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 + - 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 + - serializedVersion: 3 + buildTarget: WebGL + 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: diff --git a/src/Assets/Scenes/MainScene.unity b/src/Assets/Scenes/MainScene.unity index 87378b3..119b0cb 100644 --- a/src/Assets/Scenes/MainScene.unity +++ b/src/Assets/Scenes/MainScene.unity @@ -1141,7 +1141,6 @@ RectTransform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1036928953} - - {fileID: 1000381705} - {fileID: 1668009542} m_Father: {fileID: 285337455} m_RootOrder: 0 @@ -1164,15 +1163,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Content: {fileID: 553772764} - m_Horizontal: 1 - m_Vertical: 0 + m_Horizontal: 0 + m_Vertical: 1 m_MovementType: 1 m_Elasticity: 0.1 m_Inertia: 1 m_DecelerationRate: 0.135 m_ScrollSensitivity: 1 m_Viewport: {fileID: 1036928953} - m_HorizontalScrollbar: {fileID: 1000381706} + m_HorizontalScrollbar: {fileID: 0} m_VerticalScrollbar: {fileID: 1668009543} m_HorizontalScrollbarVisibility: 2 m_VerticalScrollbarVisibility: 2 @@ -1217,6 +1216,197 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 307863797} m_CullTransparentMesh: 0 +--- !u!1 &315006686 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 315006687} + - component: {fileID: 315006690} + - component: {fileID: 315006689} + - component: {fileID: 315006688} + m_Layer: 5 + m_Name: Closebutton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &315006687 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315006686} + 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: 999481250} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 75, y: 0} + m_SizeDelta: {x: 32, y: 48} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &315006688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315006686} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 315006689} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 651681398} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 999481249} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &315006689 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315006686} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 1eeaee44885581e40b979ec2fa477eb7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &315006690 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 315006686} + m_CullTransparentMesh: 0 +--- !u!1 &321470732 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 321470733} + - component: {fileID: 321470734} + m_Layer: 5 + m_Name: Buildings Legend + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &321470733 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 321470732} + 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: 651681402} + - {fileID: 999481250} + m_Father: {fileID: 1936842677} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 87.12, y: -32.013153} + m_SizeDelta: {x: 174.2359, y: 636.0263} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &321470734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 321470732} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7a549eff03b233b4bb067a545cb3120a, type: 3} + m_Name: + m_EditorClassIdentifier: + Image: {fileID: 993539185272044432, guid: 47d8790486204c448a548564093a49c5, type: 3} + LegendPanel: {fileID: 999481249} --- !u!1 &329789590 GameObject: m_ObjectHideFlags: 0 @@ -2165,8 +2355,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 1} - m_AnchoredPosition: {x: -219.40059, y: 0} - m_SizeDelta: {x: 438, y: -282.77} + m_AnchoredPosition: {x: -219.40042, y: 0} + m_SizeDelta: {x: 438, y: -299.77} m_Pivot: {x: 0, y: 1} --- !u!114 &553772765 MonoBehaviour: @@ -2424,6 +2614,145 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 630868256} m_CullTransparentMesh: 0 +--- !u!1 &651681398 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 651681402} + - component: {fileID: 651681401} + - component: {fileID: 651681400} + - component: {fileID: 651681399} + m_Layer: 5 + m_Name: ShowLegendButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &651681399 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651681398} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 651681400} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 999481249} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 651681398} + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &651681400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651681398} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 2387d0752141b844a8d0f1b44c4653d0, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &651681401 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651681398} + m_CullTransparentMesh: 0 +--- !u!224 &651681402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 651681398} + 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: 321470733} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -154.5, y: -306.5} + m_SizeDelta: {x: 32, y: 48} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &656037799 GameObject: m_ObjectHideFlags: 0 @@ -3300,7 +3629,7 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 971761102} m_CullTransparentMesh: 0 ---- !u!1 &1000381704 +--- !u!1 &999481249 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -3308,100 +3637,51 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1000381705} - - component: {fileID: 1000381708} - - component: {fileID: 1000381707} - - component: {fileID: 1000381706} + - component: {fileID: 999481250} + - component: {fileID: 999481252} + - component: {fileID: 999481251} m_Layer: 5 - m_Name: Scrollbar Horizontal + m_Name: BuildingLegendPanel m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1000381705 + m_IsActive: 0 +--- !u!224 &999481250 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000381704} + m_GameObject: {fileID: 999481249} 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: 1595622241} - m_Father: {fileID: 307863798} + - {fileID: 315006687} + m_Father: {fileID: 321470733} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -17, y: 20} - m_Pivot: {x: 0, y: 0} ---- !u!114 &1000381706 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000381704} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1054090617} - m_HandleRect: {fileID: 1054090616} - m_Direction: 0 - m_Value: 1.0007439 - m_Size: 0.9981736 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1000381707 + m_AnchorMin: {x: 0, y: 0.2925256} + m_AnchorMax: {x: 0, y: 0.2925256} + m_AnchoredPosition: {x: 56.1, y: 144} + m_SizeDelta: {x: 112.68475, y: 37.709656} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &999481251 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000381704} + m_GameObject: {fileID: 999481249} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 + m_Color: {r: 0, g: 0, b: 0, a: 0.78039217} + m_RaycastTarget: 0 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] @@ -3415,13 +3695,13 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1000381708 +--- !u!222 &999481252 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1000381704} + m_GameObject: {fileID: 999481249} m_CullTransparentMesh: 0 --- !u!1 &1011823763 GameObject: @@ -3510,7 +3790,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -17, y: -17} + m_SizeDelta: {x: -17, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &1036928954 MonoBehaviour: @@ -3561,79 +3841,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1036928952} m_CullTransparentMesh: 0 ---- !u!1 &1054090615 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1054090616} - - component: {fileID: 1054090618} - - component: {fileID: 1054090617} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1054090616 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1054090615} - 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: 1595622241} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.0018264055, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1054090617 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1054090615} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1054090618 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1054090615} - m_CullTransparentMesh: 0 --- !u!1 &1090023704 GameObject: m_ObjectHideFlags: 0 @@ -5739,42 +5946,6 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 100 m_TargetDisplay: 0 ---- !u!1 &1595622240 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1595622241} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1595622241 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1595622240} - 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: 1054090616} - m_Father: {fileID: 1000381705} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1615841384 GameObject: m_ObjectHideFlags: 0 @@ -6035,7 +6206,7 @@ RectTransform: m_Children: - {fileID: 837141161} m_Father: {fileID: 307863798} - m_RootOrder: 2 + m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -6084,7 +6255,7 @@ MonoBehaviour: m_TargetGraphic: {fileID: 1290087942} m_HandleRect: {fileID: 1290087941} m_Direction: 2 - m_Value: 1 + m_Value: 0 m_Size: 1 m_NumberOfSteps: 0 m_OnValueChanged: @@ -7057,6 +7228,7 @@ RectTransform: - {fileID: 2130652343} - {fileID: 1740229892} - {fileID: 169449149} + - {fileID: 321470733} m_Father: {fileID: 710520548} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -7451,7 +7623,7 @@ RectTransform: m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 583.2, y: 450} - m_SizeDelta: {x: 32, y: 32} + m_SizeDelta: {x: 64, y: 64} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2084690905 MonoBehaviour: @@ -7536,7 +7708,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 5a97d5afa6254804f81b7ba956296996, type: 3} + m_Sprite: {fileID: 21300000, guid: f42261716cb815447bc356ff2ea20574, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -7699,8 +7871,6 @@ MonoBehaviour: m_EditorClassIdentifier: LayerPanel: {fileID: 1474303399} LayerSettingsPanel: {fileID: 2130652342} - FireEffectThreshold: 0.9 - SmokeEffectThreshold: 0.8 --- !u!114 &2092454567 MonoBehaviour: m_ObjectHideFlags: 0 @@ -7939,6 +8109,12 @@ PrefabInstance: m_Modification: m_TransformParent: {fileID: 1474303400} m_Modifications: + - target: {fileID: 1818406520027381633, guid: 6285d197655004c4faaf08964afe80af, + type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 21300000, guid: e8a671c03938e2746a5b65f72db55cac, + type: 3} - target: {fileID: 1818406520027381634, guid: 6285d197655004c4faaf08964afe80af, type: 3} propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size diff --git a/src/Assets/Scripts/Components/BuildingLegend.cs b/src/Assets/Scripts/Components/BuildingLegend.cs new file mode 100644 index 0000000..7e76bfd --- /dev/null +++ b/src/Assets/Scripts/Components/BuildingLegend.cs @@ -0,0 +1,56 @@ +using Assets.Scripts.Managers; +using Assets.Scripts.Models.Settings; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace Assets.Scripts.Components +{ + public class BuildingLegend : MonoBehaviour + { + public GameObject Image; + + public GameObject LegendPanel; + private float _heightDeltaX = 5f; + + // Start is called before the first frame update + void Start() + { + AssetsManager.Instance.AssetsLoaded.AddListener(AssetsLoaded); + } + + private void AssetsLoaded() + { + float panelHeightDeltaY = 0f; + // Loop through all building prefabs from the configuration + foreach (BuildingPrefab buildingPrefab in SettingsManager.Instance.Settings.AssetBundle.Buildings) + { + // Create an image prefab + GameObject imageGameObject = Instantiate(Image, transform); + imageGameObject.transform.SetParent(LegendPanel.transform); + imageGameObject.SetActive(true); + + // Override the sprite + Image img = imageGameObject.GetComponent(); + img.overrideSprite = AssetsManager.Instance.GetVehicleSpritesByType(buildingPrefab.Name); + + // Set the position of the icon + RectTransform rt = imageGameObject.GetComponent(); + rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 10f, rt.rect.width); + rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, _heightDeltaX, rt.rect.height); + + // Set the label of the icon + imageGameObject.GetComponentInChildren().text = buildingPrefab.Label; + + // Add some height + _heightDeltaX += 35f; + panelHeightDeltaY += 35f; + + } + + RectTransform panelRt = LegendPanel.GetComponent(); + // Set the height of the panel + panelRt.sizeDelta = new Vector2(panelRt.sizeDelta.x, panelRt.sizeDelta.y + panelHeightDeltaY); + } + } +} \ No newline at end of file diff --git a/src/Assets/Scripts/Components/BuildingLegend.cs.meta b/src/Assets/Scripts/Components/BuildingLegend.cs.meta new file mode 100644 index 0000000..8aa8ca4 --- /dev/null +++ b/src/Assets/Scripts/Components/BuildingLegend.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a549eff03b233b4bb067a545cb3120a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Assets/Scripts/Components/Navigators/PlaneNavigator.cs b/src/Assets/Scripts/Components/Navigators/PlaneNavigator.cs index 71f27c1..0d48d5b 100644 --- a/src/Assets/Scripts/Components/Navigators/PlaneNavigator.cs +++ b/src/Assets/Scripts/Components/Navigators/PlaneNavigator.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using Assets.Scripts.Interfaces; using Assets.Scripts.Managers; using Assets.Scripts.Utils; using UnityEngine; @@ -147,7 +148,7 @@ void Update() .Instance.GameModel .Neighbourhoods .Single(x => x.Name == hit.collider.gameObject.name.Replace("neighbourhood-", "")) - .VisualizedObjects.Count >= MinimumBuildings) + .VisualizedObjects.Count(x=>x is IVisualizedBuilding) >= MinimumBuildings) { _fired = true; Instantiate(AssetsManager.Instance.GetPredefinedPrefab(AssetsManager.PrefabType.Bomb), diff --git a/src/Assets/Scripts/Components/TrafficPopup.cs b/src/Assets/Scripts/Components/TrafficPopup.cs index 25d3b5c..6a2c0cf 100644 --- a/src/Assets/Scripts/Components/TrafficPopup.cs +++ b/src/Assets/Scripts/Components/TrafficPopup.cs @@ -26,10 +26,6 @@ void OnDisable() void OnEnable() { - foreach (var vehiclePrefab in SettingsManager.Instance.Settings.AssetBundle.Vehicles) - { - } - UpdatePopup(); TrafficManager.Instance.TrafficUpdateEvent.AddListener(UpdatePopup); TeamManager.Instance.TeamSelectionChangedEvent.AddListener(UpdatePopup); @@ -45,6 +41,9 @@ private void ResetRows() InfoGameObjects.Clear(); } + /// + /// Function to refresh the popup with new information. + /// private void UpdatePopup() { IEnumerable vehicles = TrafficManager.Instance.Vehicles.OrderBy(x => @@ -65,21 +64,29 @@ private void UpdatePopup() } } - + /// + /// Function to add a row to the table of traffic. + /// + /// + /// + /// + /// private void AddRow(Sprite sprite, string service, VisualizedVehicleModel vehicleModel, GameObject vehicleGameObject) { GameObject trafficRow; - TMP_Text[] texts; - // We already have this row, so we only update the object? + // Check if we already have this row, so we only need to update the object? if (InfoGameObjects.ContainsKey(vehicleModel.Identifier)) { trafficRow = InfoGameObjects[vehicleModel.Identifier]; } else { + // Row does not exists, create one trafficRow = Instantiate(TrafficOverviewRowPrefab); + + // Add an event trigger object so we can make the button clickable EventTrigger eventTrigger = trafficRow.AddComponent(); EventTrigger.Entry entry = new EventTrigger.Entry {eventID = EventTriggerType.PointerClick}; entry.callback.AddListener(eventData => @@ -92,12 +99,14 @@ private void AddRow(Sprite sprite, string service, VisualizedVehicleModel vehicl InfoGameObjects.Add(vehicleModel.Identifier, trafficRow); } - texts = trafficRow.GetComponentsInChildren(); + TMP_Text[] texts = trafficRow.GetComponentsInChildren(); Image image = trafficRow.GetComponentInChildren(); + // Set the correct text. Row 0 = name of the service, Row 1 = the size of the service texts[0].text = service; texts[1].text = vehicleModel.Size.ToString(); + // Set the correct sprite image.sprite = sprite; } } diff --git a/src/Assets/Scripts/Managers/AssetsManager.cs b/src/Assets/Scripts/Managers/AssetsManager.cs index 873c5f4..004cf62 100644 --- a/src/Assets/Scripts/Managers/AssetsManager.cs +++ b/src/Assets/Scripts/Managers/AssetsManager.cs @@ -95,6 +95,7 @@ private void OnAssetsLoaded() _assetBundle.LoadAllAssets(); // Generate vehicle sprites for the UI GenerateVehicleSprites(); + GenerateBuildingSprites(); // Fix shaders of all materials RefreshShaders(); AssetsLoaded?.Invoke(); @@ -312,6 +313,26 @@ private void GenerateVehicleSprites() } } + /// + /// Function to generate sprites for every vehicle in the game. + /// It generates the sprite for the first prefab in the list. + /// + private void GenerateBuildingSprites() + { + foreach (BuildingPrefab buildingPrefab in _assetBundleSettingsSettings.Buildings) + { + // Generate a texture of the prefab + + Prefab firstBuildingPrefab = buildingPrefab.Prefabs.First(); + GameObject buildingGameObject = GetPrefab(firstBuildingPrefab.Name); + buildingGameObject.transform.rotation = Quaternion.Euler(0f, firstBuildingPrefab.Rotation, 0f); + Texture2D texture = + RuntimePreviewGenerator.GenerateModelPreview(buildingGameObject.transform); + // Add the sprite to the caching dictionary + _spriteCacheDictionary.Add(buildingPrefab.Name, texture.GenerateSprite()); + } + } + /// /// Unload the assets when the assets manager is being destroyed. /// diff --git a/src/Assets/Scripts/Managers/CameraController.cs b/src/Assets/Scripts/Managers/CameraController.cs index 302d49a..e0b0fb3 100644 --- a/src/Assets/Scripts/Managers/CameraController.cs +++ b/src/Assets/Scripts/Managers/CameraController.cs @@ -94,7 +94,7 @@ void FixedUpdate() { // Controls are locked, do nothing - + // Check if user is focused on an UI-element if (EventSystem.current.IsPointerOverGameObject()) return; @@ -142,8 +142,8 @@ private void Movement() // Move the camera (camera_target) Forward relative to current rotation if "W" is pressed or if the mouse moves within the borderWidth distance from the top edge of the screen - if (Input.GetKey("w") || EdgeScrolling && Input.mousePosition.y >= Screen.height - BorderWidth) - + if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow) || EdgeScrolling && + Input.mousePosition.y >= Screen.height - BorderWidth) { pos += forward * PanSpeed * Time.deltaTime; } @@ -151,8 +151,8 @@ private void Movement() // Move the camera (camera_target) Backward relative to current rotation if "S" is pressed or if the mouse moves within the borderWidth distance from the bottom edge of the screen - if (Input.GetKey("s") || EdgeScrolling && Input.mousePosition.y <= BorderWidth) - + if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow) || EdgeScrolling && + Input.mousePosition.y <= BorderWidth) { pos -= forward * PanSpeed * Time.deltaTime; } @@ -160,8 +160,8 @@ private void Movement() // Move the camera (camera_target) Right relative to current rotation if "D" is pressed or if the mouse moves within the borderWidth distance from the right edge of the screen - if (Input.GetKey("d") || EdgeScrolling && Input.mousePosition.x >= Screen.width - BorderWidth) - + if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow) || EdgeScrolling && + Input.mousePosition.x >= Screen.width - BorderWidth) { pos += right * PanSpeed * Time.deltaTime; } @@ -169,12 +169,13 @@ private void Movement() // Move the camera (camera_target) Left relative to current rotation if "A" is pressed or if the mouse moves within the borderWidth distance from the left edge of the screen - if (Input.GetKey("a") || EdgeScrolling && Input.mousePosition.x <= BorderWidth) - + if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow) || EdgeScrolling && + Input.mousePosition.x <= BorderWidth) { pos -= right * PanSpeed * Time.deltaTime; } + // Check if we are not crossing the map border if (pos.x <= -100f || pos.x >= _maxX || pos.z < -100f || pos.z >= _maxZ) { return; @@ -225,8 +226,7 @@ private void Zoom() // When we scroll our mouse wheel up, zoom in if the camera is not within the minimum distance (set by our zoomMin variable) - if (Input.GetAxis("Mouse ScrollWheel") > 0f && size > ZoomMin) - + if ((Input.GetAxis("Mouse ScrollWheel") > 0f || Input.GetKey(KeyCode.KeypadPlus)) && size > ZoomMin) { size -= ZoomSpeed * Time.deltaTime; } @@ -234,8 +234,7 @@ private void Zoom() // When we scroll our mouse wheel down, zoom out if the camera is not outside of the maximum distance (set by our zoomMax variable) - if (Input.GetAxis("Mouse ScrollWheel") < 0f && size < ZoomMax) - + if ((Input.GetAxis("Mouse ScrollWheel") < 0f || Input.GetKey(KeyCode.KeypadMinus)) && size < ZoomMax) { size += ZoomSpeed * Time.deltaTime; } diff --git a/src/Assets/Scripts/Managers/GridManager.cs b/src/Assets/Scripts/Managers/GridManager.cs index bf0a7e1..8f672c4 100644 --- a/src/Assets/Scripts/Managers/GridManager.cs +++ b/src/Assets/Scripts/Managers/GridManager.cs @@ -21,7 +21,7 @@ internal class GridManager : Singleton // Rows are dynamic and changed in the generate city function to match a little with the amount of instances public int Rows { get; private set; } = 50; - // Cols is a solid 50 + // Cols is being set by the SettingsManager public int Cols { get; private set; } = 50; public const int TileSize = 10; @@ -67,14 +67,13 @@ public void GenerateCity(GameModel gameModel) x => x.VisualizedObjects.Count ).Sum(); - // Make rows based on amount of instances in total divided by 14 so we always have enough space. - Rows = instances / 14; + Cols = SettingsManager.Instance.Settings.Grid.TilesPerStreet; + Rows = (instances + gameModel.Neighbourhoods.Count) / Cols * 3; // We always want an uneven number of rows so we can generate a street everywhere if (Rows % 2 == 0) Rows++; - Cols = SettingsManager.Instance.Settings.Grid.TilesPerStreet; GenerateGrid(); VehicleSpawnPoints.Add(new Vector3(0f, 0.2f, 0f), Quaternion.Euler(0, 0f, 0)); VehicleSpawnPoints.Add(new Vector3(Cols * TileSize - TileSize, 0.2f, 0f), Quaternion.Euler(0, 0f, 0)); @@ -235,9 +234,11 @@ public void SpawnNeighbourhood(NeighbourhoodModel neighbourhoodModel) float spawnOffsetX = 0; int tileIndex = 0; + // Loop through all the visualized objects for (int index = 0; index < visualizedObjects.Count; index++) { Tile tile = tiles[tileIndex]; + // If the tile is already filled, destroy it. if (Grid[tile] != null && Grid[tile].GameObject != null) Destroy(Grid[tile].GameObject); diff --git a/src/Assets/Scripts/Managers/LayerManager.cs b/src/Assets/Scripts/Managers/LayerManager.cs index 84e0ef9..176f4ae 100644 --- a/src/Assets/Scripts/Managers/LayerManager.cs +++ b/src/Assets/Scripts/Managers/LayerManager.cs @@ -19,11 +19,25 @@ internal class LayerManager : Singleton public GameObject LayerSettingsPanel; public VisualLayerModel SelectedLayer; - // List with objects that are used for a selected layer - private readonly List _selectedLayerObjects = - new List(); + private readonly List _spriteObjects = new List(); + + /// + /// Struct used to combine an outline component and a visual layer model + /// + private struct SpriteImageObject + { + public readonly Image Image; + public readonly VisualLayerModel VisualLayerModel; + + public SpriteImageObject(Image image, VisualLayerModel visualLayerModel) + { + Image = image; + VisualLayerModel = visualLayerModel; + } + } private IOrderedEnumerable _layerEffects; + // Start is called before the first frame update void Start() { @@ -50,7 +64,8 @@ public void Setup(GameModel gameModel) heightDeltaY += gameModel.Layers.Count * 50; rt.sizeDelta = new Vector2(rt.sizeDelta.x, heightDeltaY); - _layerEffects = SettingsManager.Instance.Settings.AssetBundle.LayerEffects.OrderByDescending(x=>x.Threshold); + _layerEffects = + SettingsManager.Instance.Settings.AssetBundle.LayerEffects.OrderByDescending(x => x.Threshold); } else { @@ -84,15 +99,14 @@ private IEnumerator GenerateButtonWithTexture(VisualLayerModel visualLayer, floa Button button = buttonObject.AddComponent