Browse Source

Initial commit

jamesperet 2 years ago
commit
eea2c07725
100 changed files with 6875 additions and 0 deletions
  1. 71 0
      .gitignore
  2. 14 0
      ChangeLog.md
  3. 7 0
      ChangeLog.md.meta
  4. 8 0
      Docs.meta
  5. 5 0
      Docs/Tooltips.md
  6. 7 0
      Docs/Tooltips.md.meta
  7. 8 0
      Editor.meta
  8. 8 0
      Prefabs.meta
  9. 361 0
      Prefabs/ActivityMessage.prefab
  10. 7 0
      Prefabs/ActivityMessage.prefab.meta
  11. 692 0
      Prefabs/ActivityMessageController.prefab
  12. 7 0
      Prefabs/ActivityMessageController.prefab.meta
  13. 8 0
      Prefabs/ConfigOptions.meta
  14. 476 0
      Prefabs/ConfigOptions/CheckboxConfigOptionPrefab.prefab
  15. 7 0
      Prefabs/ConfigOptions/CheckboxConfigOptionPrefab.prefab.meta
  16. 1430 0
      Prefabs/ConfigOptions/DropdownConfigOptionPrefab.prefab
  17. 7 0
      Prefabs/ConfigOptions/DropdownConfigOptionPrefab.prefab.meta
  18. 626 0
      Prefabs/ConfigOptions/SliderConfigOptionPrefab.prefab
  19. 7 0
      Prefabs/ConfigOptions/SliderConfigOptionPrefab.prefab.meta
  20. 152 0
      Prefabs/FloatingMessagePrefab.prefab
  21. 7 0
      Prefabs/FloatingMessagePrefab.prefab.meta
  22. 433 0
      Prefabs/TooltipPrefabExample.prefab
  23. 7 0
      Prefabs/TooltipPrefabExample.prefab.meta
  24. 73 0
      Readme.md
  25. 7 0
      Readme.md.meta
  26. 8 0
      Runtime.meta
  27. 8 0
      Runtime/ActivityMessages.meta
  28. 18 0
      Runtime/ActivityMessages/ActivityMessage.cs
  29. 11 0
      Runtime/ActivityMessages/ActivityMessage.cs.meta
  30. 127 0
      Runtime/ActivityMessages/ActivityMessageController.cs
  31. 11 0
      Runtime/ActivityMessages/ActivityMessageController.cs.meta
  32. 103 0
      Runtime/ActivityMessages/ActivityMessageUi.cs
  33. 11 0
      Runtime/ActivityMessages/ActivityMessageUi.cs.meta
  34. 8 0
      Runtime/ConfigOptions.meta
  35. 60 0
      Runtime/ConfigOptions/CheckboxConfigOptionUI.cs
  36. 11 0
      Runtime/ConfigOptions/CheckboxConfigOptionUI.cs.meta
  37. 71 0
      Runtime/ConfigOptions/ConfigOptionsUI.cs
  38. 11 0
      Runtime/ConfigOptions/ConfigOptionsUI.cs.meta
  39. 66 0
      Runtime/ConfigOptions/DropdownConfigOptionUI.cs
  40. 11 0
      Runtime/ConfigOptions/DropdownConfigOptionUI.cs.meta
  41. 75 0
      Runtime/ConfigOptions/SliderConfigOptionUI.cs
  42. 11 0
      Runtime/ConfigOptions/SliderConfigOptionUI.cs.meta
  43. 8 0
      Runtime/FloatingMessages.meta
  44. 51 0
      Runtime/FloatingMessages/FloatingValueUi.cs
  45. 11 0
      Runtime/FloatingMessages/FloatingValueUi.cs.meta
  46. 30 0
      Runtime/FloatingMessages/FloatingValuesController.cs
  47. 11 0
      Runtime/FloatingMessages/FloatingValuesController.cs.meta
  48. 8 0
      Runtime/GameActions.meta
  49. 125 0
      Runtime/GameActions/UiElementGameAction.cs
  50. 11 0
      Runtime/GameActions/UiElementGameAction.cs.meta
  51. 19 0
      Runtime/GameVersionText.cs
  52. 11 0
      Runtime/GameVersionText.cs.meta
  53. 11 0
      Runtime/IUiSystemElement.cs
  54. 11 0
      Runtime/IUiSystemElement.cs.meta
  55. 8 0
      Runtime/InteractionHandler.meta
  56. 20 0
      Runtime/InteractionHandler/ButtonData.cs
  57. 11 0
      Runtime/InteractionHandler/ButtonData.cs.meta
  58. 20 0
      Runtime/InteractionHandler/ClickHandler.cs
  59. 11 0
      Runtime/InteractionHandler/ClickHandler.cs.meta
  60. 11 0
      Runtime/InteractionHandler/IClickHandler.cs
  61. 11 0
      Runtime/InteractionHandler/IClickHandler.cs.meta
  62. 18 0
      Runtime/KairoEngine.UI.asmdef
  63. 7 0
      Runtime/KairoEngine.UI.asmdef.meta
  64. 8 0
      Runtime/MenuComponents.meta
  65. 105 0
      Runtime/MenuComponents/ColumnMenuUI.cs
  66. 11 0
      Runtime/MenuComponents/ColumnMenuUI.cs.meta
  67. 22 0
      Runtime/MenuComponents/MenuAction.cs
  68. 11 0
      Runtime/MenuComponents/MenuAction.cs.meta
  69. 25 0
      Runtime/MenuComponents/MenuButtomData.cs
  70. 11 0
      Runtime/MenuComponents/MenuButtomData.cs.meta
  71. 41 0
      Runtime/MenuComponents/MenuController.cs
  72. 11 0
      Runtime/MenuComponents/MenuController.cs.meta
  73. 137 0
      Runtime/MenuComponents/MenuUI.cs
  74. 11 0
      Runtime/MenuComponents/MenuUI.cs.meta
  75. 35 0
      Runtime/ModalWindowController.cs
  76. 11 0
      Runtime/ModalWindowController.cs.meta
  77. 51 0
      Runtime/MouseInputUIBlocker.cs
  78. 11 0
      Runtime/MouseInputUIBlocker.cs.meta
  79. 8 0
      Runtime/Slideshow.meta
  80. 60 0
      Runtime/Slideshow/SlideData.cs
  81. 11 0
      Runtime/Slideshow/SlideData.cs.meta
  82. 49 0
      Runtime/Slideshow/SlideshowController.cs
  83. 11 0
      Runtime/Slideshow/SlideshowController.cs.meta
  84. 79 0
      Runtime/SoundConfigurationsUI.cs
  85. 11 0
      Runtime/SoundConfigurationsUI.cs.meta
  86. 8 0
      Runtime/Tooltips.meta
  87. 64 0
      Runtime/Tooltips/Tooltip.cs
  88. 11 0
      Runtime/Tooltips/Tooltip.cs.meta
  89. 69 0
      Runtime/Tooltips/TooltipSystem.cs
  90. 11 0
      Runtime/Tooltips/TooltipSystem.cs.meta
  91. 51 0
      Runtime/Tooltips/TooltipTrigger.cs
  92. 11 0
      Runtime/Tooltips/TooltipTrigger.cs.meta
  93. 114 0
      Runtime/TransitionController.cs
  94. 11 0
      Runtime/TransitionController.cs.meta
  95. 96 0
      Runtime/UiAnimator.cs
  96. 11 0
      Runtime/UiAnimator.cs.meta
  97. 146 0
      Runtime/UiManager.cs
  98. 11 0
      Runtime/UiManager.cs.meta
  99. 40 0
      Runtime/UiSystemElement.cs
  100. 11 0
      Runtime/UiSystemElement.cs.meta

+ 71 - 0
.gitignore

@@ -0,0 +1,71 @@
+# This .gitignore file should be placed at the root of your Unity project directory
+#
+# Get latest from https://github.com/github/gitignore/blob/master/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/
+
+# Asset meta data should only be ignored when the corresponding asset is also ignored
+!/[Aa]ssets/**/*.meta
+
+# 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
+
+# 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/*

+ 14 - 0
ChangeLog.md

@@ -0,0 +1,14 @@
+# KairoEngine.UI Change Log
+
+### v0.1.1
+
+- Refactored ``ColumnMenuUI`` into an extra base class called ``MenuUI``. Both classes work the same, but the column can render submenus.
+- Imported the legacy ``ActivityMessage``, ``ActivityMessageController`` and ``ActivityMessageUI`` from the Max Raider project. Then assets where refactored to use the new UI namespace. 
+- Created ``UiManager`` methods to register, unregister, show and hide interface elements. Also created the ``UiSystemElementExample`` that implements the ``IUiSystemElement`` interface.
+- Removed the prefabs **FloatingValuesPrefab** and the **FloatingHealthBarPrefab**. Also removed references to them in the ``UiSystemModule`` loader. Both of this assets depended on code from the **CharacterSystem** module.
+- Removed the Dialogue folder containing the ``DialogueManager`` and ``SpeechBuble`` scripts. They require the **NodeCanvas** package which should not be require for this package.
+- Removed old dependencies in runtime assembly file
+
+### v0.1.0
+
+- Initial version from Max Raider.

+ 7 - 0
ChangeLog.md.meta

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

+ 8 - 0
Docs.meta

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

+ 5 - 0
Docs/Tooltips.md

@@ -0,0 +1,5 @@
+# Tooltips
+
+The Tooltip system is a part of the [UI package](../Readme.md) that manages showing, hiding and managing tooltips.
+
+

+ 7 - 0
Docs/Tooltips.md.meta

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

+ 8 - 0
Editor.meta

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

+ 8 - 0
Prefabs.meta

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

+ 361 - 0
Prefabs/ActivityMessage.prefab

@@ -0,0 +1,361 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &614678003389363430
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6545386760744466189}
+  - component: {fileID: 4698823716394155074}
+  - component: {fileID: 4102275887954244000}
+  m_Layer: 0
+  m_Name: MessageText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6545386760744466189
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614678003389363430}
+  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: 2580584276516975465}
+  m_Father: {fileID: 6443834885651354899}
+  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.5, y: 0.5}
+--- !u!222 &4698823716394155074
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614678003389363430}
+  m_CullTransparentMesh: 0
+--- !u!114 &4102275887954244000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 614678003389363430}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: "<size=30><sprite=5></size> <b>New Clue:</b> Steins of blood on \nthe sink
+    left by the killer washing \nhis hands aftwards"
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 9e763638319e10443abbee71efdadc5b, type: 2}
+  m_sharedMaterial: {fileID: 1867558077309050534, guid: 9e763638319e10443abbee71efdadc5b,
+    type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 16777215
+  m_fontColor: {r: 1, g: 1, b: 1, a: 0}
+  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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 18
+  m_fontSizeBase: 18
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 8
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 10, y: 8, z: 8, w: 8}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &829462558567722223
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2580584276516975465}
+  - component: {fileID: 567791391709243972}
+  m_Layer: 0
+  m_Name: TMP SubMeshUI [TextMeshPro/Sprite]
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2580584276516975465
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 829462558567722223}
+  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: 6545386760744466189}
+  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: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &567791391709243972
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 829462558567722223}
+  m_CullTransparentMesh: 0
+--- !u!1 &3358351919906791836
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6443834885651354899}
+  - component: {fileID: 8282453964378322812}
+  - component: {fileID: 4493079208567175465}
+  - component: {fileID: 7323877514386933844}
+  - component: {fileID: 6758995290570285894}
+  - component: {fileID: 892465510631762317}
+  m_Layer: 0
+  m_Name: ActivityMessage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6443834885651354899
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.8, y: 0.8, z: 0.8}
+  m_Children:
+  - {fileID: 6545386760744466189}
+  m_Father: {fileID: 0}
+  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.5, y: 0.5}
+--- !u!222 &8282453964378322812
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  m_CullTransparentMesh: 0
+--- !u!114 &4493079208567175465
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  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: 0}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 6fc45c9721fda3f4a97804fc3535a740, type: 3}
+  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: 2
+--- !u!114 &7323877514386933844
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  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: 2
+  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: 21300000, guid: 6e51d147d909c1043a82cfcde36a4f8b,
+      type: 3}
+    m_PressedSprite: {fileID: 21300000, guid: 55f8b441584104c4ab85039a0e8b2fcf, type: 3}
+    m_SelectedSprite: {fileID: 21300000, guid: 353576b41b7482140b91077a2fff93cb, type: 3}
+    m_DisabledSprite: {fileID: 21300000, guid: 19335ad27efccc0419ea918d2127d541, type: 3}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 4493079208567175465}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 0}
+        m_MethodName: OnClick
+        m_Mode: 1
+        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 &6758995290570285894
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 2
+    m_Right: 2
+    m_Top: 2
+    m_Bottom: 0
+  m_ChildAlignment: 0
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 0
+  m_ChildForceExpandHeight: 0
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+--- !u!114 &892465510631762317
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3358351919906791836}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 00b9cd5ce0aa4d1438632e0b036719d0, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  textUi: {fileID: 4102275887954244000}
+  buttonImage: {fileID: 4493079208567175465}
+  message:
+    text: 
+  autoHide: 1
+  hideTimer: 5
+  fadeIn: 1
+  fadeOut: 1
+  fadeTimer: 0.1

+ 7 - 0
Prefabs/ActivityMessage.prefab.meta

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

+ 692 - 0
Prefabs/ActivityMessageController.prefab

@@ -0,0 +1,692 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &271749360604942289
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749360604942294}
+  - component: {fileID: 271749360604942293}
+  - component: {fileID: 271749360604942292}
+  - component: {fileID: 271749360604942295}
+  m_Layer: 0
+  m_Name: Scroll View
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749360604942294
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360604942289}
+  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: 271749360850247145}
+  - {fileID: 271749360658939879}
+  m_Father: {fileID: 271749360850810029}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 1}
+  m_AnchorMax: {x: 0.5, y: 1}
+  m_AnchoredPosition: {x: 437.22, y: -360}
+  m_SizeDelta: {x: 405.5, y: 720}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &271749360604942293
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360604942289}
+  m_CullTransparentMesh: 0
+--- !u!114 &271749360604942292
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360604942289}
+  m_Enabled: 0
+  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: 0}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, 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!114 &271749360604942295
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360604942289}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Content: {fileID: 271749361901858027}
+  m_Horizontal: 0
+  m_Vertical: 1
+  m_MovementType: 1
+  m_Elasticity: 0.1
+  m_Inertia: 0
+  m_DecelerationRate: 0.135
+  m_ScrollSensitivity: 1
+  m_Viewport: {fileID: 271749360850247145}
+  m_HorizontalScrollbar: {fileID: 0}
+  m_VerticalScrollbar: {fileID: 271749360658939876}
+  m_HorizontalScrollbarVisibility: 2
+  m_VerticalScrollbarVisibility: 2
+  m_HorizontalScrollbarSpacing: -3
+  m_VerticalScrollbarSpacing: -3
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &271749360613801841
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749360613801846}
+  - component: {fileID: 271749360613801847}
+  m_Layer: 0
+  m_Name: ActivityMessageController
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &271749360613801846
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360613801841}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0.00003528595, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 271749360850810029}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &271749360613801847
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360613801841}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: ad001307b2530604c8a17cf8c788707f, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  activityMessagesContainer: {fileID: 271749361901858027}
+  activityMessageUiPrefab: {fileID: 3358351919906791836, guid: 46d6d62b3b1dcff45ad2c8154602df8c,
+    type: 3}
+  messages: []
+  activeMessages: []
+--- !u!1 &271749360658939878
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749360658939879}
+  - component: {fileID: 271749360658939898}
+  - component: {fileID: 271749360658939877}
+  - component: {fileID: 271749360658939876}
+  m_Layer: 0
+  m_Name: Scrollbar Vertical
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749360658939879
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360658939878}
+  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: 271749361873519370}
+  m_Father: {fileID: 271749360604942294}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 12, y: 0}
+  m_Pivot: {x: 1, y: 1}
+--- !u!222 &271749360658939898
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360658939878}
+  m_CullTransparentMesh: 0
+--- !u!114 &271749360658939877
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360658939878}
+  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: 0.47058824}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 6fc45c9721fda3f4a97804fc3535a740, type: 3}
+  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: 10
+--- !u!114 &271749360658939876
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360658939878}
+  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: 271749361940287297}
+  m_HandleRect: {fileID: 271749361940287296}
+  m_Direction: 2
+  m_Value: 0
+  m_Size: 1
+  m_NumberOfSteps: 0
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &271749360850247144
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749360850247145}
+  - component: {fileID: 271749360850247148}
+  - component: {fileID: 271749360850247151}
+  - component: {fileID: 271749360850247150}
+  m_Layer: 0
+  m_Name: Viewport
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749360850247145
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850247144}
+  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: 271749361901858027}
+  m_Father: {fileID: 271749360604942294}
+  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: -9, y: 0}
+  m_Pivot: {x: 0, y: 1}
+--- !u!222 &271749360850247148
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850247144}
+  m_CullTransparentMesh: 0
+--- !u!114 &271749360850247151
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850247144}
+  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: 0
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10917, 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!114 &271749360850247150
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850247144}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ShowMaskGraphic: 0
+--- !u!1 &271749360850810028
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749360850810029}
+  - component: {fileID: 271749360850810022}
+  - component: {fileID: 271749360850810017}
+  - component: {fileID: 271749360850810016}
+  - component: {fileID: 271749360850810019}
+  - component: {fileID: 271749360850810018}
+  m_Layer: 0
+  m_Name: CanvasActivityMessages
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749360850810029
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  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:
+  - {fileID: 271749360604942294}
+  m_Father: {fileID: 271749360613801846}
+  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!223 &271749360850810022
+Canvas:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  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: 25
+  m_SortingLayerID: 0
+  m_SortingOrder: 2
+  m_TargetDisplay: 0
+--- !u!114 &271749360850810017
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  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: 1
+  m_ReferenceResolution: {x: 1280, y: 720}
+  m_ScreenMatchMode: 0
+  m_MatchWidthOrHeight: 0
+  m_PhysicalUnit: 3
+  m_FallbackScreenDPI: 96
+  m_DefaultSpriteDPI: 96
+  m_DynamicPixelsPerUnit: 1
+--- !u!114 &271749360850810016
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  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: 3895
+--- !u!114 &271749360850810019
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0b148fe25e99eb48b9724523833bab1, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Delegates: []
+--- !u!114 &271749360850810018
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749360850810028}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2dab588a1ee73f743ac3fc3cf6118430, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+--- !u!1 &271749361873519477
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749361873519370}
+  m_Layer: 0
+  m_Name: Sliding Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749361873519370
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361873519477}
+  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: 271749361940287296}
+  m_Father: {fileID: 271749360658939879}
+  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 &271749361901858026
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749361901858027}
+  - component: {fileID: 271749361901858030}
+  - component: {fileID: 271749361901858025}
+  - component: {fileID: 271749361901858024}
+  m_Layer: 0
+  m_Name: ActivityMessagesContainer
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749361901858027
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361901858026}
+  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: 271749360850247145}
+  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: -0.000091552734, y: 0.000007867813}
+  m_SizeDelta: {x: 391.1, y: 0}
+  m_Pivot: {x: 1, y: 1}
+--- !u!222 &271749361901858030
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361901858026}
+  m_CullTransparentMesh: 0
+--- !u!114 &271749361901858025
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361901858026}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 0
+    m_Right: 5
+    m_Top: 0
+    m_Bottom: 0
+  m_ChildAlignment: 2
+  m_Spacing: -12
+  m_ChildForceExpandWidth: 0
+  m_ChildForceExpandHeight: 0
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 1
+  m_ChildScaleHeight: 0
+--- !u!114 &271749361901858024
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361901858026}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 0
+  m_VerticalFit: 2
+--- !u!1 &271749361940287299
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 271749361940287296}
+  - component: {fileID: 271749361940287302}
+  - component: {fileID: 271749361940287297}
+  m_Layer: 0
+  m_Name: Handle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &271749361940287296
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361940287299}
+  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: 271749361873519370}
+  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!222 &271749361940287302
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361940287299}
+  m_CullTransparentMesh: 0
+--- !u!114 &271749361940287297
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 271749361940287299}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 21300000, guid: 6fc45c9721fda3f4a97804fc3535a740, type: 3}
+  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: 10

+ 7 - 0
Prefabs/ActivityMessageController.prefab.meta

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

+ 8 - 0
Prefabs/ConfigOptions.meta

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

+ 476 - 0
Prefabs/ConfigOptions/CheckboxConfigOptionPrefab.prefab

@@ -0,0 +1,476 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &302868442627836354
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8070110370083390555}
+  - component: {fileID: 1604644818125250303}
+  - component: {fileID: 3453163273020864656}
+  - component: {fileID: 4651745681808387437}
+  - component: {fileID: 1863955463291256773}
+  m_Layer: 0
+  m_Name: CheckboxConfigOptionPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8070110370083390555
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 302868442627836354}
+  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: 1606029660846019791}
+  - {fileID: 9135299795057505097}
+  m_Father: {fileID: 0}
+  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: 878.895, y: 65.198364}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1604644818125250303
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 302868442627836354}
+  m_CullTransparentMesh: 0
+--- !u!114 &3453163273020864656
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 302868442627836354}
+  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: 0.0627451}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  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!114 &4651745681808387437
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 302868442627836354}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 460bbea74d2a0b1459abb106bd7882d4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  header: 
+  content: 
+--- !u!114 &1863955463291256773
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 302868442627836354}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: aadc7e758f938c04aab0e93fae40e106, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  titleText: {fileID: 5222773089100869126}
+  tooltipTrigger: {fileID: 4651745681808387437}
+  checkbox: {fileID: 5292436626405083028}
+  configOption: {fileID: 0}
+--- !u!1 &4323547976165648678
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7132573976861659050}
+  - component: {fileID: 5704316845869064808}
+  - component: {fileID: 7600498141476459472}
+  m_Layer: 0
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7132573976861659050
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4323547976165648678}
+  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: 3191085400341539257}
+  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: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5704316845869064808
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4323547976165648678}
+  m_CullTransparentMesh: 0
+--- !u!114 &7600498141476459472
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4323547976165648678}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  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 &5125061772566113014
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1606029660846019791}
+  - component: {fileID: 8074188594516354635}
+  - component: {fileID: 5222773089100869126}
+  m_Layer: 0
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1606029660846019791
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125061772566113014}
+  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: 8070110370083390555}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 252.75, y: -33}
+  m_SizeDelta: {x: 460.4984, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8074188594516354635
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125061772566113014}
+  m_CullTransparentMesh: 0
+--- !u!114 &5222773089100869126
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5125061772566113014}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Master Volume
+  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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5221927494218478403
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 9135299795057505097}
+  - component: {fileID: 5292436626405083028}
+  m_Layer: 0
+  m_Name: Toggle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &9135299795057505097
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5221927494218478403}
+  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: 3191085400341539257}
+  m_Father: {fileID: 8070110370083390555}
+  m_RootOrder: 1
+  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: 83.6, y: -0.40082}
+  m_SizeDelta: {x: 21.588135, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &5292436626405083028
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5221927494218478403}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, 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: 3760458514356036869}
+  toggleTransition: 1
+  graphic: {fileID: 7600498141476459472}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 1
+--- !u!1 &9219804608866448509
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3191085400341539257}
+  - component: {fileID: 5928792072434259795}
+  - component: {fileID: 3760458514356036869}
+  m_Layer: 0
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3191085400341539257
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9219804608866448509}
+  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: 7132573976861659050}
+  m_Father: {fileID: 9135299795057505097}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 10, y: -10}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5928792072434259795
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9219804608866448509}
+  m_CullTransparentMesh: 0
+--- !u!114 &3760458514356036869
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 9219804608866448509}
+  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_Maskable: 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

+ 7 - 0
Prefabs/ConfigOptions/CheckboxConfigOptionPrefab.prefab.meta

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

+ 1430 - 0
Prefabs/ConfigOptions/DropdownConfigOptionPrefab.prefab

@@ -0,0 +1,1430 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1150141688531131493
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7222881428386763260}
+  - component: {fileID: 2127608936042384216}
+  - component: {fileID: 2607029243016867127}
+  - component: {fileID: 5425796274402326730}
+  - component: {fileID: 6061111867959489547}
+  m_Layer: 0
+  m_Name: DropdownConfigOptionPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7222881428386763260
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1150141688531131493}
+  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: 2129038844303098216}
+  - {fileID: 8260392282685156407}
+  m_Father: {fileID: 0}
+  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: 878.895, y: 65.198364}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2127608936042384216
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1150141688531131493}
+  m_CullTransparentMesh: 0
+--- !u!114 &2607029243016867127
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1150141688531131493}
+  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: 0.0627451}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  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!114 &5425796274402326730
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1150141688531131493}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 460bbea74d2a0b1459abb106bd7882d4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  header: 
+  content: 
+  tooltipType: 
+--- !u!114 &6061111867959489547
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1150141688531131493}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 19458c13e1eb8b040b4fca6d6f4e2410, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  titleText: {fileID: 4879960843398527905}
+  tooltipTrigger: {fileID: 5425796274402326730}
+  dropdown: {fileID: 8733446531798366295}
+  configOption: {fileID: 0}
+--- !u!1 &1360241696557173836
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 57124754871931376}
+  - component: {fileID: 7248331709769435899}
+  - component: {fileID: 3461336307704266408}
+  m_Layer: 0
+  m_Name: Handle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &57124754871931376
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1360241696557173836}
+  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: 8501054419218689758}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 0.2}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7248331709769435899
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1360241696557173836}
+  m_CullTransparentMesh: 0
+--- !u!114 &3461336307704266408
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1360241696557173836}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 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!1 &1377508625733017055
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4229273561292579420}
+  - component: {fileID: 760030756299717593}
+  - component: {fileID: 2211950775146440010}
+  m_Layer: 0
+  m_Name: Item Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4229273561292579420
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1377508625733017055}
+  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: 7183716989047730303}
+  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: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &760030756299717593
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1377508625733017055}
+  m_CullTransparentMesh: 0
+--- !u!114 &2211950775146440010
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1377508625733017055}
+  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: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  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 &1634840001755861133
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3130971421968258739}
+  - component: {fileID: 7351436441847594379}
+  - component: {fileID: 4135212022155252797}
+  - component: {fileID: 671342354445394260}
+  m_Layer: 0
+  m_Name: Scrollbar
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3130971421968258739
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1634840001755861133}
+  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: 8501054419218689758}
+  m_Father: {fileID: 2135206773618486357}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 0}
+  m_Pivot: {x: 1, y: 1}
+--- !u!222 &7351436441847594379
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1634840001755861133}
+  m_CullTransparentMesh: 0
+--- !u!114 &4135212022155252797
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1634840001755861133}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, 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!114 &671342354445394260
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1634840001755861133}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    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: 3461336307704266408}
+  m_HandleRect: {fileID: 57124754871931376}
+  m_Direction: 2
+  m_Value: 0
+  m_Size: 0.2
+  m_NumberOfSteps: 0
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &2708909874179275066
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3956663235657985886}
+  - component: {fileID: 8892690373185163705}
+  - component: {fileID: 1622431099140264684}
+  m_Layer: 0
+  m_Name: Arrow
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3956663235657985886
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2708909874179275066}
+  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: 8260392282685156407}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0.5}
+  m_AnchorMax: {x: 1, y: 0.5}
+  m_AnchoredPosition: {x: -15, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8892690373185163705
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2708909874179275066}
+  m_CullTransparentMesh: 0
+--- !u!114 &1622431099140264684
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2708909874179275066}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0}
+  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 &3053537459725985224
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2135206773618486357}
+  - component: {fileID: 5152250982059653989}
+  - component: {fileID: 8708010112130806085}
+  - component: {fileID: 2203110446840679523}
+  m_Layer: 0
+  m_Name: Template
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &2135206773618486357
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3053537459725985224}
+  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: 864097767100413535}
+  - {fileID: 3130971421968258739}
+  m_Father: {fileID: 8260392282685156407}
+  m_RootOrder: 2
+  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: 2}
+  m_SizeDelta: {x: 0, y: 150}
+  m_Pivot: {x: 0.5, y: 1}
+--- !u!222 &5152250982059653989
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3053537459725985224}
+  m_CullTransparentMesh: 0
+--- !u!114 &8708010112130806085
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3053537459725985224}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 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!114 &2203110446840679523
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3053537459725985224}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Content: {fileID: 7822373701629455710}
+  m_Horizontal: 0
+  m_Vertical: 1
+  m_MovementType: 2
+  m_Elasticity: 0.1
+  m_Inertia: 1
+  m_DecelerationRate: 0.135
+  m_ScrollSensitivity: 30
+  m_Viewport: {fileID: 864097767100413535}
+  m_HorizontalScrollbar: {fileID: 0}
+  m_VerticalScrollbar: {fileID: 671342354445394260}
+  m_HorizontalScrollbarVisibility: 0
+  m_VerticalScrollbarVisibility: 2
+  m_HorizontalScrollbarSpacing: 0
+  m_VerticalScrollbarSpacing: -3
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &5051573318896427005
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8260392282685156407}
+  - component: {fileID: 1333202744304426767}
+  - component: {fileID: 8604523594778984528}
+  - component: {fileID: 8733446531798366295}
+  m_Layer: 0
+  m_Name: Dropdown
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8260392282685156407
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5051573318896427005}
+  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: 4613716233287342575}
+  - {fileID: 3956663235657985886}
+  - {fileID: 2135206773618486357}
+  m_Father: {fileID: 7222881428386763260}
+  m_RootOrder: 1
+  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: 244.2, y: -0.40082}
+  m_SizeDelta: {x: 338.40613, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1333202744304426767
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5051573318896427005}
+  m_CullTransparentMesh: 0
+--- !u!114 &8604523594778984528
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5051573318896427005}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 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!114 &8733446531798366295
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5051573318896427005}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    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: 8604523594778984528}
+  m_Template: {fileID: 2135206773618486357}
+  m_CaptionText: {fileID: 5520352312737896371}
+  m_CaptionImage: {fileID: 0}
+  m_Placeholder: {fileID: 0}
+  m_ItemText: {fileID: 5336797492772221805}
+  m_ItemImage: {fileID: 0}
+  m_Value: 0
+  m_Options:
+    m_Options: []
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_AlphaFadeSpeed: 0.15
+--- !u!1 &5496571287347021076
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 9154861965177085425}
+  - component: {fileID: 1970600585976928848}
+  - component: {fileID: 5336797492772221805}
+  m_Layer: 0
+  m_Name: Item Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &9154861965177085425
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5496571287347021076}
+  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: 7183716989047730303}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 5, y: -0.5}
+  m_SizeDelta: {x: -30, y: -3}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1970600585976928848
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5496571287347021076}
+  m_CullTransparentMesh: 0
+--- !u!114 &5336797492772221805
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5496571287347021076}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Option A
+  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: 4294967295
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: 0
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5538862927806381905
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2129038844303098216}
+  - component: {fileID: 8921447538178814956}
+  - component: {fileID: 4879960843398527905}
+  m_Layer: 0
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2129038844303098216
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5538862927806381905}
+  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: 7222881428386763260}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 252.75, y: -33}
+  m_SizeDelta: {x: 460.4984, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8921447538178814956
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5538862927806381905}
+  m_CullTransparentMesh: 0
+--- !u!114 &4879960843398527905
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5538862927806381905}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Master Volume
+  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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &5766076578165580165
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 864097767100413535}
+  - component: {fileID: 3604650816156621661}
+  - component: {fileID: 5219053891466674688}
+  - component: {fileID: 5813384179437502439}
+  m_Layer: 0
+  m_Name: Viewport
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &864097767100413535
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5766076578165580165}
+  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: 7822373701629455710}
+  m_Father: {fileID: 2135206773618486357}
+  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: -18, y: 0}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &3604650816156621661
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5766076578165580165}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_ShowMaskGraphic: 0
+--- !u!222 &5219053891466674688
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5766076578165580165}
+  m_CullTransparentMesh: 0
+--- !u!114 &5813384179437502439
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5766076578165580165}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10917, 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!1 &6843390793008918750
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1272848186938150244}
+  - component: {fileID: 4129026125259315157}
+  - component: {fileID: 2958254825485182143}
+  m_Layer: 0
+  m_Name: Item Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1272848186938150244
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6843390793008918750}
+  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: 7183716989047730303}
+  m_RootOrder: 1
+  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: 10, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4129026125259315157
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6843390793008918750}
+  m_CullTransparentMesh: 0
+--- !u!114 &2958254825485182143
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6843390793008918750}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  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 &6912074957994046641
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8501054419218689758}
+  m_Layer: 0
+  m_Name: Sliding Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8501054419218689758
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6912074957994046641}
+  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: 57124754871931376}
+  m_Father: {fileID: 3130971421968258739}
+  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 &7177957567138485625
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7183716989047730303}
+  - component: {fileID: 7630373483536858649}
+  m_Layer: 0
+  m_Name: Item
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7183716989047730303
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7177957567138485625}
+  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: 4229273561292579420}
+  - {fileID: 1272848186938150244}
+  - {fileID: 9154861965177085425}
+  m_Father: {fileID: 7822373701629455710}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 1, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &7630373483536858649
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7177957567138485625}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    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: 2211950775146440010}
+  toggleTransition: 1
+  graphic: {fileID: 2958254825485182143}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 1
+--- !u!1 &7501405785458080272
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7822373701629455710}
+  m_Layer: 0
+  m_Name: Content
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7822373701629455710
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7501405785458080272}
+  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: 7183716989047730303}
+  m_Father: {fileID: 864097767100413535}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 28}
+  m_Pivot: {x: 0.5, y: 1}
+--- !u!1 &7828601162754215107
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4613716233287342575}
+  - component: {fileID: 8169528790797610778}
+  - component: {fileID: 5520352312737896371}
+  m_Layer: 0
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4613716233287342575
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7828601162754215107}
+  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: 8260392282685156407}
+  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: -7.5, y: -0.5}
+  m_SizeDelta: {x: -35, y: -13}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8169528790797610778
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7828601162754215107}
+  m_CullTransparentMesh: 0
+--- !u!114 &5520352312737896371
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7828601162754215107}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 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: 4281479730
+  m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 14
+  m_fontSizeBase: 14
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

+ 7 - 0
Prefabs/ConfigOptions/DropdownConfigOptionPrefab.prefab.meta

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

+ 626 - 0
Prefabs/ConfigOptions/SliderConfigOptionPrefab.prefab

@@ -0,0 +1,626 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &369477202756923210
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7849414696153365634}
+  - component: {fileID: 179974141140983485}
+  - component: {fileID: 489170928324921769}
+  m_Layer: 0
+  m_Name: Fill
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &7849414696153365634
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 369477202756923210}
+  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: 5100495123413527520}
+  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: 10, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &179974141140983485
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 369477202756923210}
+  m_CullTransparentMesh: 0
+--- !u!114 &489170928324921769
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 369477202756923210}
+  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_Maskable: 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!1 &2312159652015685310
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5466450024183690023}
+  - component: {fileID: 3631772941817375107}
+  - component: {fileID: 850732248741564396}
+  - component: {fileID: 785252698027527557}
+  - component: {fileID: 7254212438588250641}
+  m_Layer: 0
+  m_Name: SliderConfigOptionPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5466450024183690023
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2312159652015685310}
+  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: 3633194052907131827}
+  - {fileID: 4888063579099060772}
+  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: 2.4, y: 154.4}
+  m_SizeDelta: {x: 878.895, y: 65.198364}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3631772941817375107
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2312159652015685310}
+  m_CullTransparentMesh: 0
+--- !u!114 &850732248741564396
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2312159652015685310}
+  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: 0.0627451}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  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!114 &785252698027527557
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2312159652015685310}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9926ea0128b71c6459527bbbd07ddc1a, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  titleText: {fileID: 7807400868813412730}
+  tooltipTrigger: {fileID: 7254212438588250641}
+  slider: {fileID: 7375401842588411818}
+  configOption: {fileID: 0}
+--- !u!114 &7254212438588250641
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2312159652015685310}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 460bbea74d2a0b1459abb106bd7882d4, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  header: 
+  content: 
+--- !u!1 &2414503377083213417
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4888063579099060772}
+  - component: {fileID: 7375401842588411818}
+  m_Layer: 0
+  m_Name: Slider
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4888063579099060772
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2414503377083213417}
+  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: 8467748807684413056}
+  - {fileID: 5100495123413527520}
+  - {fileID: 23412695982940187}
+  m_Father: {fileID: 5466450024183690023}
+  m_RootOrder: 1
+  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: 244.74014, y: -0.40082}
+  m_SizeDelta: {x: 344.28027, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &7375401842588411818
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2414503377083213417}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, 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: 8479722617479814419}
+  m_FillRect: {fileID: 7849414696153365634}
+  m_HandleRect: {fileID: 8570788710206878929}
+  m_Direction: 0
+  m_MinValue: 0
+  m_MaxValue: 1
+  m_WholeNumbers: 0
+  m_Value: 0
+  m_OnValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+--- !u!1 &2972366639864367194
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8570788710206878929}
+  - component: {fileID: 5952608216907153203}
+  - component: {fileID: 8479722617479814419}
+  m_Layer: 0
+  m_Name: Handle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8570788710206878929
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2972366639864367194}
+  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: 23412695982940187}
+  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: 20, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5952608216907153203
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2972366639864367194}
+  m_CullTransparentMesh: 0
+--- !u!114 &8479722617479814419
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2972366639864367194}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
+  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 &6564031827138128150
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8467748807684413056}
+  - component: {fileID: 3118516221164455964}
+  - component: {fileID: 7657661143718478242}
+  m_Layer: 0
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8467748807684413056
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6564031827138128150}
+  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: 4888063579099060772}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.25}
+  m_AnchorMax: {x: 1, y: 0.75}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3118516221164455964
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6564031827138128150}
+  m_CullTransparentMesh: 0
+--- !u!114 &7657661143718478242
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6564031827138128150}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, 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!1 &6947722011158379997
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 23412695982940187}
+  m_Layer: 0
+  m_Name: Handle Slide Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &23412695982940187
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6947722011158379997}
+  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: 8570788710206878929}
+  m_Father: {fileID: 4888063579099060772}
+  m_RootOrder: 2
+  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: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &7151031544161508746
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3633194052907131827}
+  - component: {fileID: 6066127099285524791}
+  - component: {fileID: 7807400868813412730}
+  m_Layer: 0
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3633194052907131827
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7151031544161508746}
+  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: 5466450024183690023}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 252.75, y: -33}
+  m_SizeDelta: {x: 460.4984, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &6066127099285524791
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7151031544161508746}
+  m_CullTransparentMesh: 0
+--- !u!114 &7807400868813412730
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7151031544161508746}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Master Volume
+  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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 36
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &7745346403846424351
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5100495123413527520}
+  m_Layer: 0
+  m_Name: Fill Area
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &5100495123413527520
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7745346403846424351}
+  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: 7849414696153365634}
+  m_Father: {fileID: 4888063579099060772}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.25}
+  m_AnchorMax: {x: 1, y: 0.75}
+  m_AnchoredPosition: {x: -5, y: 0}
+  m_SizeDelta: {x: -20, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}

+ 7 - 0
Prefabs/ConfigOptions/SliderConfigOptionPrefab.prefab.meta

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

+ 152 - 0
Prefabs/FloatingMessagePrefab.prefab

@@ -0,0 +1,152 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &976062565190250960
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4067326173354001230}
+  - component: {fileID: 3777598747049180007}
+  - component: {fileID: 1537233377077319691}
+  - component: {fileID: 8105374117417748283}
+  m_Layer: 0
+  m_Name: FloatingMessagePrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &4067326173354001230
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 976062565190250960}
+  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: 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: -18, y: 58.400024}
+  m_SizeDelta: {x: 350, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3777598747049180007
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 976062565190250960}
+  m_CullTransparentMesh: 0
+--- !u!114 &1537233377077319691
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 976062565190250960}
+  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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: New 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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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: 11400000, guid: dde15fa8b7c9d2742a11457cdea47bf3, type: 2}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 18
+  m_fontSizeBase: 18
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 2
+  m_VerticalAlignment: 512
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!114 &8105374117417748283
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 976062565190250960}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2b1ba21e1a5b5f64abb1d0d724dd7b64, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  textMesh: {fileID: 1537233377077319691}
+  rectTransform: {fileID: 4067326173354001230}
+  lifetime: 1

+ 7 - 0
Prefabs/FloatingMessagePrefab.prefab.meta

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

+ 433 - 0
Prefabs/TooltipPrefabExample.prefab

@@ -0,0 +1,433 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1285702112934205050
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1285702112934205051}
+  - component: {fileID: 1285702112934205045}
+  - component: {fileID: 1285702112934205044}
+  - component: {fileID: 1285702112934205047}
+  - component: {fileID: 1285702112934205046}
+  - component: {fileID: 1285702112934205049}
+  - component: {fileID: 1285702112934205048}
+  m_Layer: 0
+  m_Name: TooltipPrefabExample
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1285702112934205051
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  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: 1285702114589112601}
+  - {fileID: 1285702113314851623}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 632.5743, y: 57.128662}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.32425743, y: 1.0991932}
+--- !u!222 &1285702112934205045
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  m_CullTransparentMesh: 0
+--- !u!114 &1285702112934205044
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  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: 0.1509434, g: 0.1509434, b: 0.1509434, a: 0.92156863}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 0}
+  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!114 &1285702112934205047
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 4
+    m_Right: 4
+    m_Top: 4
+    m_Bottom: 4
+  m_ChildAlignment: 0
+  m_Spacing: 4
+  m_ChildForceExpandWidth: 0
+  m_ChildForceExpandHeight: 0
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
+--- !u!114 &1285702112934205046
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_HorizontalFit: 2
+  m_VerticalFit: 2
+--- !u!114 &1285702112934205049
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 0
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: 400
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!114 &1285702112934205048
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702112934205050}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4a7ff3a1ca8a0224eba42502e6740e19, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  headerField: {fileID: 1285702114589112598}
+  contentField: {fileID: 1285702113314851620}
+  layoutElement: {fileID: 1285702112934205049}
+  rectTransform: {fileID: 1285702112934205051}
+  characterWrapLimit: 80
+  positionOffset: {x: 10, y: -50}
+--- !u!1 &1285702113314851622
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1285702113314851623}
+  - component: {fileID: 1285702113314851621}
+  - component: {fileID: 1285702113314851620}
+  m_Layer: 0
+  m_Name: ContentText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1285702113314851623
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702113314851622}
+  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: 1285702112934205051}
+  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.5, y: 0.5}
+--- !u!222 &1285702113314851621
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702113314851622}
+  m_CullTransparentMesh: 0
+--- !u!114 &1285702113314851620
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702113314851622}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 'This is a description text... A very long description.
+
+    With multiple
+    lines of text.
+
+    Short ones.
+
+    And very, very, very, very very, very very
+    long lines with line breaks after the character limit.'
+  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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 18
+  m_fontSizeBase: 18
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!1 &1285702114589112600
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1285702114589112601}
+  - component: {fileID: 1285702114589112599}
+  - component: {fileID: 1285702114589112598}
+  m_Layer: 0
+  m_Name: HeaderText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1285702114589112601
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702114589112600}
+  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: 1285702112934205051}
+  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.5, y: 0.5}
+--- !u!222 &1285702114589112599
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702114589112600}
+  m_CullTransparentMesh: 0
+--- !u!114 &1285702114589112598
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1285702114589112600}
+  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_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: Tooltip Header 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: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, 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_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 24
+  m_fontSizeBase: 24
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 1
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  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: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 1
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

+ 7 - 0
Prefabs/TooltipPrefabExample.prefab.meta

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

+ 73 - 0
Readme.md

@@ -0,0 +1,73 @@
+# 📦 KairoEngine.UI.v0.1.2
+
+The **UI** package contains the ``UiSystem`` component and the ``UiSystemModule``. The module loads the Ui System in place which manages canvases with UI data. The system now which canvases are enabled and has a global toggle for all the game UI.
+
+Also this package contains a set of new interface elements to be used in the design of a game. These elements are the **UiAnimator**, **FadeTransition**, **FloatingText**, **MessageBox**, **ProgressBar**, **Tooltip**, **ActivityMessages**, **ContextMenu**, **ModalWindow** and **LoadingScreen**. All these elements come with a unique style and can be tweeked or changed in to different aesthetics.
+
+Finally the package also contains a set of standard unity UI prefabs dressed in the same style as the rest of the UI elements. These elements are the **Window**, **Panel**, **Button**, **ToggleButtom**, **Checkbox**, **RadioButton**, **DropdownListButton**, **TextField**, **TextArea** and **Slider**.
+
+### 🛑Required packages
+
+- ``KairoEngine.Core``
+- `Unity.TextMeshPro`
+- `LeanTween`
+
+### 📄Namespaces
+
+- `KairoEngine.UI`
+
+### 📙Modules
+
+- **UI module** – Loads the UISystem that manages interface elements
+
+### 🔷Components
+
+- `UIAnimator` – A generic component that animates a piece of the interface
+
+### ✔Getting Started
+
+##### Add the Ui Module
+
+Find or create the ``GameConfig`` file, click add new module and select the **UI Module** in the module type field. 
+
+Once the ``GameConfig`` is loaded on the game start, the base UI system will be instantiated in your game. This will create or find a *UI* GameObject inside the *GameManager* GameObject and add a ``UiSystem`` component to it. The rest of the game UI can be put as a child of *GameManager/UI*.
+
+##### New Interface elements
+
+More information on the interface elements included in the UI package can be found on each elements documentation:
+
+- [UiAnimator]() – A generic component that animates a peice of the interface.
+
+- [FadeTransition]() – A subsystem that fades the screen to a color and back again. It can trigger and listen to events.
+
+- [FloatingText]() – A subsystem that listens for events, manages and instantiates animated text in the world.
+
+- [MessageBox]() – A prefab containing a window with a title, message and buttons that require imidiate action.
+
+- [ProgressBar]() – A prefab containing a bar representing the total and completed percentage of a task.
+
+- [Tooltip](Docs/Tooltips.md)  – A subsystem that show tooltips when hovering the mouse over a certain object.
+
+- [ActivityMessages]() – A subsystem that receives messages and then shows them to the player. These messages can be sticky, can fade with time, can be changed by events and can fire functions when clicked.
+
+- [ContextMenu]() – A prefab that draws a context menu with sevaral buttons, separators and submenus.
+
+- [ModalWindow]() – A prefab containing a window that is shown on top of other UI.
+
+- [LoadingScreen]() – A subsystem that shows a loading screen. It can trigger and listen to events.
+
+##### Register Ui Elements in the UiSystem
+
+Once you start creating interface elements for your game, you will want to register them with the ``UiSystem`` so that they can be shown and hidden correctly.
+
+### 📚 Explanation
+
+The UI package adds new functionality for designing game user interfaces and tools for managing those interfaces in runtime. 
+
+### Tutorials
+
+### Reference
+
+### 🧰Functions
+
+### 🎈Back Log

+ 7 - 0
Readme.md.meta

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

+ 8 - 0
Runtime.meta

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

+ 8 - 0
Runtime/ActivityMessages.meta

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

+ 18 - 0
Runtime/ActivityMessages/ActivityMessage.cs

@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace KairoEngine.UI.ActivityMessages
+{
+    [System.Serializable]
+    public class ActivityMessage
+    {
+        public string text;
+
+        public ActivityMessage(string text)
+        {
+            this.text = text;
+        }
+    }
+}
+

+ 11 - 0
Runtime/ActivityMessages/ActivityMessage.cs.meta

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

+ 127 - 0
Runtime/ActivityMessages/ActivityMessageController.cs

@@ -0,0 +1,127 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using KairoEngine.Core;
+using KairoEngine.UI;
+
+namespace KairoEngine.UI.ActivityMessages
+{
+    //* This is the simplest possible implementation of this controller
+    // Todo: Add icons to activity messages
+    // Todo: Add autohide prorperty to messages
+    // Todo: Cleanup list of activeMessages that have been destroyed
+
+    /// <summary>
+    /// Controller for showing activity messages to the player. 
+    /// Use the ActivityMessageEvents.Send() to send a message to this controller.
+    /// </summary>
+    public class ActivityMessageController : MonoBehaviour , IUiSystemElement
+    {
+        [Tooltip("The container that will hold all the activity message GameObjects.")]
+        [LabelText("MSG Container")] public Transform activityMessagesContainer;
+
+        [Tooltip("The GameObject prefab for the ActivityMessage.")]
+        [LabelText("MSG Prefab")] public GameObject activityMessageUiPrefab;
+
+        public List<ActivityMessage> messages;
+        public List<ActivityMessageUi> activeMessages;
+
+        public Canvas canvas;
+        public bool startVisible = false;
+
+        private bool isVisible = true;
+
+        private void Start()
+        {
+            if(startVisible) UiManager.ShowElement(this);
+            else UiManager.HideElement(this);
+        }
+
+        private void OnEnable()
+        {
+            UiManager.RegisterElement("ActivityMessages", this, this.transform, isVisible);
+            ActivityMessageEvents.OnActivityMessage += NewActivityMessage;
+            ActivityMessageEvents.OnTimedActivityMessage += NewTimedActivityMessage;
+            ActivityMessageEvents.OnStickyActivityMessage += NewStickyActivityMessage;
+            ActivityMessageEvents.OnUpdateActivityMessage += UpdateActivityMessage;
+            ActivityMessageEvents.OnRemoveActivityMessage += RemoveActivityMessage;
+        }
+
+        private void OnDisable()
+        {
+            UiManager.UnregisterElement(this);
+            ActivityMessageEvents.OnActivityMessage -= NewActivityMessage;
+            ActivityMessageEvents.OnTimedActivityMessage -= NewTimedActivityMessage;
+            ActivityMessageEvents.OnStickyActivityMessage -= NewStickyActivityMessage;
+            ActivityMessageEvents.OnUpdateActivityMessage -= UpdateActivityMessage;
+            ActivityMessageEvents.OnRemoveActivityMessage -= RemoveActivityMessage;
+        }
+
+        public void Hide()
+        {
+            isVisible = false;
+            canvas.gameObject.SetActive(false);
+        }
+
+        public void Show()
+        {
+            isVisible = true;
+            canvas.gameObject.SetActive(true);
+        }
+
+        public bool IsVisible() => isVisible;
+
+        private void NewActivityMessage(string msg)
+        {
+            ActivityMessage message = new ActivityMessage(msg);
+            CreateMessage(message).Setup(this, message);
+        }
+
+        private void NewTimedActivityMessage(string msg, float time)
+        {
+            ActivityMessage message = new ActivityMessage(msg);
+            CreateMessage(message).Setup(this, message, time);
+        }
+
+        private void NewStickyActivityMessage(string msg, bool sticky)
+        {
+            ActivityMessage message = new ActivityMessage(msg);
+            CreateMessage(message).Setup(this, message, sticky);
+        }
+
+        private void UpdateActivityMessage(string oldText, string newText, float time, bool sticky)
+        {
+            for (int i = 0; i < activeMessages.Count; i++)
+            {
+                if(activeMessages[i].message.text == oldText)
+                {
+                    activeMessages[i].message.text = newText;
+                    activeMessages[i].Setup(this, activeMessages[i].message, time, sticky);
+                    return;
+                }
+            }
+        }
+
+        private void RemoveActivityMessage(string text)
+        {
+            for (int i = 0; i < activeMessages.Count; i++)
+            {
+                if(activeMessages[i].message.text == text)
+                {
+                    activeMessages[i].Remove(this);
+                    return;
+                }
+            }
+        }
+
+        private ActivityMessageUi CreateMessage(ActivityMessage message)
+        {
+            messages.Add(message);
+            GameObject obj = Instantiate(activityMessageUiPrefab, activityMessagesContainer);
+            ActivityMessageUi msgUi = obj.GetComponent<ActivityMessageUi>();
+            activeMessages.Add(msgUi);
+            return msgUi;
+        }
+    }
+}

+ 11 - 0
Runtime/ActivityMessages/ActivityMessageController.cs.meta

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

+ 103 - 0
Runtime/ActivityMessages/ActivityMessageUi.cs

@@ -0,0 +1,103 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using TMPro;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.ActivityMessages
+{
+    public class ActivityMessageUi : MonoBehaviour
+    {
+        public TextMeshProUGUI textUi;
+        public Image buttonImage;
+        public ActivityMessage message;
+        public bool autoHide = true;
+
+        public float hideTimer = 5f;
+        private float hideCounter = 0f;
+
+        public bool fadeIn = true;
+        public bool fadeOut = true;
+
+        public float fadeTimer = 0.5f;
+        private float fadeCounter = 0f;
+
+        private bool isFading = false;
+        private bool hasFadedIn = false;
+        private ActivityMessageController controller;
+
+        private void Update()
+        {
+            if (fadeIn && !hasFadedIn)
+            {
+                fadeCounter += Time.deltaTime;
+                Color color = textUi.color;
+                color.a = fadeCounter / fadeTimer;
+                textUi.color = color;
+                buttonImage.color = color;
+                if (fadeCounter >= fadeTimer)
+                {
+                    fadeCounter = 0f;
+                    hasFadedIn = true;
+                }
+            }
+            if (autoHide && hasFadedIn || fadeIn == false)
+            {
+                hideCounter += Time.deltaTime;
+                if(hideCounter >= hideTimer)
+                {
+                    hideCounter = 0f;
+                    isFading = true;
+                }
+            }
+            if (fadeOut && isFading)
+            {
+                fadeCounter += Time.deltaTime;
+                Color color = textUi.color;
+                color.a = 1f - (fadeCounter / fadeTimer);
+                textUi.color = color;
+                buttonImage.color = color;
+                if (fadeCounter >= fadeTimer)
+                {
+                    fadeCounter = 0f;
+                    if(controller != null)
+                    {
+                        controller.messages.Remove(message);
+                        controller.activeMessages.Remove(this);
+                    }
+                    Destroy(this.gameObject);
+                }
+            }
+        }
+
+        public void OnClick()
+        {
+            isFading = true;
+        }
+
+        public void Setup(ActivityMessageController controller, ActivityMessage newMessage, bool sticky = false)
+        {
+            this.controller = controller;
+            message = newMessage;
+            textUi.text = message.text;
+            autoHide = !sticky;
+        }
+
+        public void Setup(ActivityMessageController controller, ActivityMessage newMessage, float time, bool sticky = false)
+        {
+            this.controller = controller;
+            message = newMessage;
+            textUi.text = message.text;
+            hideTimer = time;
+            autoHide = !sticky;
+        }
+
+        public void Remove(ActivityMessageController controller)
+        {
+            this.controller = controller;
+            autoHide = true;
+            hideTimer = 0f;
+        }
+    }
+}

+ 11 - 0
Runtime/ActivityMessages/ActivityMessageUi.cs.meta

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

+ 8 - 0
Runtime/ConfigOptions.meta

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

+ 60 - 0
Runtime/ConfigOptions/CheckboxConfigOptionUI.cs

@@ -0,0 +1,60 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using KairoEngine.Core;
+using KairoEngine.Core.ConfigOptions;
+using KairoEngine.UI.Tooltips;
+using Sirenix.OdinInspector;
+using TMPro;
+
+namespace KairoEngine.UI.ConfigOptions
+{
+    [HideMonoScript]
+    public class CheckboxConfigOptionUI : MonoBehaviour
+    {
+        public TextMeshProUGUI titleText;
+        public TooltipTrigger tooltipTrigger;
+        public Toggle checkbox;
+        [ReadOnly] public ConfigOptionBase configOption;
+
+        public void OnEnable()
+        {
+            checkbox.onValueChanged.AddListener(delegate {OnChange(); });
+
+        }
+
+        void OnDisable()
+        {
+            checkbox.onValueChanged.RemoveListener(delegate {OnChange(); });
+        }
+
+        public void Setup(ConfigOptionBase configOption)
+        {
+            this.configOption = configOption;
+            var uiData = configOption.GetUiData();
+            titleText.text = uiData.name;
+            //tooltipTrigger.header = uiData.name;
+            tooltipTrigger.content = uiData.description;
+            checkbox.isOn = uiData.checkboxData.currentValue;
+        }
+
+        public void OnChange()
+        {
+            ApplyConfig();
+        }
+
+        private void ApplyConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "",  checkbox.isOn ? 1 : 0, 0f);
+            configOption.SetValue(data, false);
+        }
+        private void SaveConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "",  checkbox.isOn ? 1 : 0, 0f);
+            configOption.SetValue(data, true);
+        }
+    }
+}

+ 11 - 0
Runtime/ConfigOptions/CheckboxConfigOptionUI.cs.meta

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

+ 71 - 0
Runtime/ConfigOptions/ConfigOptionsUI.cs

@@ -0,0 +1,71 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using KairoEngine.Core;
+using KairoEngine.Core.ConfigOptions;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.ConfigOptions
+{
+    [HideMonoScript]
+    public class ConfigOptionsUI : MonoBehaviour
+    {
+        [LabelText("Config Options")] public List<ConfigOptionBase> list = new List<ConfigOptionBase>();
+        public GameObject sliderPrefab;
+        public GameObject checkboxPrefab;
+        public GameObject dropdownPrefab;
+        public Transform container;
+
+        private List<GameObject> configOptionsGameObjects;
+
+        private void Awake()
+        {
+            if(sliderPrefab == null) Debug.LogError("sliderPrefab is missing in ConfigOptionsUi.", this.gameObject);
+            if(checkboxPrefab == null) Debug.LogError("checkboxPrefab is missing in ConfigOptionsUi.", this.gameObject);
+            if(dropdownPrefab == null) Debug.LogError("dropdownPrefab is missing in ConfigOptionsUi.", this.gameObject);
+            if(container == null) Debug.LogError("container is missing in ConfigOptionsUi.", this.gameObject);
+        }
+
+        private void Start()
+        {
+            Timer.Execute(2000f, () => {
+                GenerateConfigMenu();
+            });
+        }
+
+        public void GenerateConfigMenu()
+        {
+            if(configOptionsGameObjects != null)
+            {
+                for (int i = 0; i < configOptionsGameObjects.Count; i++)
+                {
+                    Destroy(configOptionsGameObjects[i]);
+                }
+            }
+            configOptionsGameObjects = new List<GameObject>();
+            for (int i = 0; i < list.Count; i++)
+            {
+                GameObject obj = null;
+                switch(list[i].uiElementType)
+                {
+                    case ConfigOptionUIType.Slider:
+                        obj = Instantiate(sliderPrefab, container);
+                        obj.GetComponent<SliderConfigOptionUI>().Setup(list[i]);
+                        break;
+                    case ConfigOptionUIType.Checkbox:
+                        obj = Instantiate(checkboxPrefab, container);
+                        obj.GetComponent<CheckboxConfigOptionUI>().Setup(list[i]);
+                        break;
+                    case ConfigOptionUIType.Dropdown:
+                        obj = Instantiate(dropdownPrefab, container);
+                        obj.GetComponent<DropdownConfigOptionUI>().Setup(list[i]);
+                        break;
+                    default:
+                        break;
+                }
+                if(obj != null) configOptionsGameObjects.Add(obj);
+            }
+        }
+    }
+
+}

+ 11 - 0
Runtime/ConfigOptions/ConfigOptionsUI.cs.meta

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

+ 66 - 0
Runtime/ConfigOptions/DropdownConfigOptionUI.cs

@@ -0,0 +1,66 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using KairoEngine.Core;
+using KairoEngine.Core.ConfigOptions;
+using KairoEngine.UI.Tooltips;
+using Sirenix.OdinInspector;
+using TMPro;
+
+namespace KairoEngine.UI.ConfigOptions
+{
+    [HideMonoScript]
+    public class DropdownConfigOptionUI : MonoBehaviour
+    {
+        public TextMeshProUGUI titleText;
+        public TooltipTrigger tooltipTrigger;
+        public TMP_Dropdown dropdown;
+        [ReadOnly] public ConfigOptionBase configOption;
+
+        public void OnEnable()
+        {
+            dropdown.onValueChanged.AddListener(delegate {OnChange(); });
+
+        }
+
+        void OnDisable()
+        {
+            dropdown.onValueChanged.RemoveListener(delegate {OnChange(); });
+        }
+
+        public void Setup(ConfigOptionBase configOption)
+        {
+            this.configOption = configOption;
+            var uiData = configOption.GetUiData();
+            titleText.text = uiData.name;
+            //tooltipTrigger.header = uiData.name;
+            tooltipTrigger.content = uiData.description;
+            var options = new List<TMP_Dropdown.OptionData>();
+            for (int i = 0; i < uiData.dropdownData.options.Count; i++)
+            {
+                options.Add(new TMP_Dropdown.OptionData( uiData.dropdownData.options[i]));
+            }
+            dropdown.AddOptions(options);
+            dropdown.value = uiData.dropdownData.currentValue;
+        }
+
+        public void OnChange()
+        {
+            ApplyConfig();
+        }
+
+        private void ApplyConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "",  dropdown.value, 0f);
+            configOption.SetValue(data, false);
+        }
+        private void SaveConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "",  dropdown.value, 0f);
+            configOption.SetValue(data, true);
+        }
+    }
+}

+ 11 - 0
Runtime/ConfigOptions/DropdownConfigOptionUI.cs.meta

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

+ 75 - 0
Runtime/ConfigOptions/SliderConfigOptionUI.cs

@@ -0,0 +1,75 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using KairoEngine.Core;
+using KairoEngine.Core.ConfigOptions;
+using KairoEngine.UI.Tooltips;
+using Sirenix.OdinInspector;
+using TMPro;
+
+namespace KairoEngine.UI.ConfigOptions
+{
+    [HideMonoScript]
+    public class SliderConfigOptionUI : MonoBehaviour
+    {
+        public TextMeshProUGUI titleText;
+        public TooltipTrigger tooltipTrigger;
+        public Slider slider;
+        private Coroutine delayedSave;
+        [ReadOnly] public ConfigOptionBase configOption;
+
+        public void OnEnable()
+        {
+            slider.onValueChanged.AddListener(delegate {OnChange(); });
+
+        }
+
+        void OnDisable()
+        {
+            slider.onValueChanged.RemoveListener(delegate {OnChange(); });
+        }
+
+        public void Setup(ConfigOptionBase configOption)
+        {
+            this.configOption = configOption;
+            var uiData = configOption.GetUiData();
+            if(uiData == null) 
+            {
+                Debug.LogError("Missing configOption", this.gameObject);
+                return;
+            }
+            titleText.text = uiData.name;
+            //tooltipTrigger.header = uiData.name;
+            tooltipTrigger.content = uiData.description;
+            if(uiData.sliderData == null)
+            {
+                 Debug.LogError($"Missing sliderData in configOption for {uiData.name}", this.gameObject);
+                 return;
+            }
+            slider.minValue = uiData.sliderData.minValue;
+            slider.maxValue = uiData.sliderData.maxValue;
+            slider.value = uiData.sliderData.currentValue;
+        }
+
+        public void OnChange()
+        {
+            ApplyConfig();
+            if(delayedSave != null) StopCoroutine(delayedSave);
+            delayedSave = StartCoroutine(Timer.StartRealtime(2f, SaveConfig));
+        }
+
+        private void ApplyConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "", 0, slider.value);
+            configOption.SetValue(data, false);
+        }
+        private void SaveConfig()
+        {
+            if(configOption == null) return;
+            ConfigOptionData data = new ConfigOptionData("", "", 0, slider.value);
+            configOption.SetValue(data, true);
+        }
+    }
+}

+ 11 - 0
Runtime/ConfigOptions/SliderConfigOptionUI.cs.meta

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

+ 8 - 0
Runtime/FloatingMessages.meta

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

+ 51 - 0
Runtime/FloatingMessages/FloatingValueUi.cs

@@ -0,0 +1,51 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using TMPro;
+
+namespace KairoEngine.UI
+{
+    public class FloatingValueUi : MonoBehaviour
+    {
+        public TextMeshProUGUI textMesh;
+        public RectTransform rectTransform;
+        public float lifetime = 1f;
+
+        private Vector3 pos;
+        private float counter = 0f;
+        private float positionOffset;
+
+        public void Setup(Vector3 position, string text, float positionOffset, float lifetime, float fontSize)
+        {
+            textMesh.text = text;
+            pos = new Vector3(position.x, position.y + 2.5f, position.z);
+            this.lifetime = lifetime;
+            this.positionOffset = positionOffset;
+            textMesh.fontSize = fontSize;
+        }
+
+        public void Update()
+        {
+            textMesh.enabled = true;
+            if (pos != null && rectTransform != null)
+            {
+                pos.y += positionOffset * Time.deltaTime;
+                Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
+                rectTransform.position = screenPos;
+            }
+            counter += Time.deltaTime;
+            if(counter > lifetime)
+            {
+                Destroy(gameObject);
+            }
+            if(counter > lifetime/2)
+            {
+                float a = textMesh.color.a - (textMesh.color.a * (lifetime * 2)) * Time.deltaTime;
+                Color c = new Color(textMesh.color.r, textMesh.color.g, textMesh.color.b, a);
+                textMesh.color = c;
+            }
+            
+        }
+    }
+}

+ 11 - 0
Runtime/FloatingMessages/FloatingValueUi.cs.meta

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

+ 30 - 0
Runtime/FloatingMessages/FloatingValuesController.cs

@@ -0,0 +1,30 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using KairoEngine.Core;
+
+namespace KairoEngine.UI
+{
+    public class FloatingValuesController : MonoBehaviour
+    {
+        public GameObject floatingValueUiPrefab;
+        public Transform canvasParent;
+
+        void OnEnable()
+        {
+            FloatingMessageEvents.OnMessage += OnMessage;
+        }
+
+        void OnDisable()
+        {
+            FloatingMessageEvents.OnMessage -= OnMessage;
+        }
+
+        private void OnMessage(string message, Vector3 targetPos, float offset, float time, float fontSize)
+        {
+            GameObject obj = Instantiate(floatingValueUiPrefab, canvasParent);
+            obj.GetComponent<FloatingValueUi>().Setup(targetPos, message, offset, time, fontSize);
+        }
+    }
+}

+ 11 - 0
Runtime/FloatingMessages/FloatingValuesController.cs.meta

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

+ 8 - 0
Runtime/GameActions.meta

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

+ 125 - 0
Runtime/GameActions/UiElementGameAction.cs

@@ -0,0 +1,125 @@
+using System.Collections;
+using System.Linq;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using KairoEngine.Core;
+using KairoEngine.Core.GameActions;
+
+namespace KairoEngine.UI.GameActions
+{
+    [System.Serializable, HideReferenceObjectPicker]
+    public class UiElementGameAction : GameActionBase
+    {
+        public enum DataType
+        {
+            String,
+            Variable
+        }
+
+        public enum ActionType
+        {
+            Show,
+            Hide
+        }
+        public override string name 
+        { 
+            get
+            {
+                return "Toogle UI element";
+            }
+        }
+
+        public override GameActionsController controller { 
+            get => _controller; 
+            set 
+            {
+                _controller = value;
+                typeName = "UiElementGameAction";
+                className =  this.GetType().AssemblyQualifiedName;
+                GetCompatibleVariablenames();
+            }
+        }
+        public override string GetTypeName() => "UiElementGameAction";
+        public override string GetActionName() => "UI/Toggle Ui Element";
+
+        [FoldoutGroup("@name")] public ActionType actionType = ActionType.Show;
+        [FoldoutGroup("@name")]  public DataType dataType = DataType.String;
+        
+        [FoldoutGroup("@name"), ShowIf("@dataType == DataType.String")]
+        public string uiElementName = "UI Element Name";
+
+        [FoldoutGroup("@name"), ShowIf("@dataType == DataType.Variable")]
+        [ValueDropdown("possibleVariables", IsUniqueList = false)]
+        public string uiElementVariable;
+
+        private IEnumerable possibleVariables = new ValueDropdownList<string>();
+
+        public UiElementGameAction(GameActionsController controller) : base(controller)
+        {
+            this.controller = controller;
+            className =  this.GetType().AssemblyQualifiedName;
+        }
+
+        public override void Start()
+        {
+            string uiElement = "";
+            if(dataType == DataType.String) uiElement = uiElementName;
+            else uiElement = GetVariable(uiElementVariable);
+            if(actionType == ActionType.Show) UiManager.ShowElement(uiElement);
+            else UiManager.HideElement(uiElement);
+            _done = true;
+            _started = true;
+        }
+
+        public override void Update() { }
+
+        public override void Restart()
+        {
+            _done = false;
+            _started = false;
+        }
+
+        private void GetCompatibleVariablenames()
+        {
+            if(_controller == null) return;
+            if(_controller.context == null) return;
+            possibleVariables = _controller.context.variables
+                .Where(x => x.GetTypeName() is "GameActionContextString")
+                .Select(x => new ValueDropdownItem(x.name, x.name)); 
+        }
+
+        public static UiElementGameAction JSONToUiElementGameAction(string data)
+        {
+            return JsonUtility.FromJson<UiElementGameAction>(data);
+        }
+
+        private UiElementGameAction Duplicate(GameActionsController controller = null)
+        {
+            UiElementGameAction action = new UiElementGameAction(controller == null ? this.controller : controller);
+            action.controller = controller;
+            action.actionType = actionType;
+            action.dataType = dataType;
+            action.uiElementName = uiElementName;
+            action.uiElementVariable = uiElementVariable;
+            return action;
+        }
+
+        private string GetVariable(string title)
+        {
+            if(controller == null) return "";
+            if(controller.context == null) return "";
+            for (int i = 0; i < controller.context.variables.Count; i++)
+            {
+                if(controller.context.variables[i].name == title)
+                {
+                    string value = controller.context.variables[i].GetValue<string>("");
+                    if(value != "") return value;
+                }
+            }
+            return "";
+        }
+
+    }
+}
+

+ 11 - 0
Runtime/GameActions/UiElementGameAction.cs.meta

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

+ 19 - 0
Runtime/GameVersionText.cs

@@ -0,0 +1,19 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using TMPro;
+
+namespace KairoEngine.UI
+{
+    public class GameVersionText : MonoBehaviour
+    {
+        public TextMeshProUGUI text;
+        public string appendText = "v";
+        
+        void Start()
+        {
+            text.text = $"{appendText}{Application.version}";
+        }
+    }
+}
+

+ 11 - 0
Runtime/GameVersionText.cs.meta

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

+ 11 - 0
Runtime/IUiSystemElement.cs

@@ -0,0 +1,11 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public interface IUiSystemElement
+{
+    void Show();
+    void Hide();
+
+    bool IsVisible();
+}

+ 11 - 0
Runtime/IUiSystemElement.cs.meta

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

+ 8 - 0
Runtime/InteractionHandler.meta

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

+ 20 - 0
Runtime/InteractionHandler/ButtonData.cs

@@ -0,0 +1,20 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using TMPro;
+
+namespace KairoEngine.UI.InteractionHandler
+{
+    public class ButtonData : MonoBehaviour
+    {
+        public TextMeshProUGUI headerComponent;
+        public Image graphicComponent;
+
+        public void Setup(string text, Sprite graphic = null)
+        {
+            if(headerComponent != null && !string.IsNullOrEmpty(text)) headerComponent.text = text;
+            if(graphic != null && graphicComponent != null) graphicComponent.sprite = graphic;
+        }
+    }
+}

+ 11 - 0
Runtime/InteractionHandler/ButtonData.cs.meta

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

+ 20 - 0
Runtime/InteractionHandler/ClickHandler.cs

@@ -0,0 +1,20 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.InteractionHandler
+{
+    public class ClickHandler : MonoBehaviour
+    {
+        public string title = "";
+        [ShowInInspector] public IClickHandler receiver;
+
+        public void OnClick()
+        {
+            if(receiver != null) receiver.OnClick(title);
+            else Debug.LogError("ClickHandler has no receiver!", this.gameObject);
+        }
+    }
+}
+

+ 11 - 0
Runtime/InteractionHandler/ClickHandler.cs.meta

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

+ 11 - 0
Runtime/InteractionHandler/IClickHandler.cs

@@ -0,0 +1,11 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace KairoEngine.UI.InteractionHandler
+{
+    public interface IClickHandler
+    {
+        void OnClick(string title);
+    }
+}

+ 11 - 0
Runtime/InteractionHandler/IClickHandler.cs.meta

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

+ 18 - 0
Runtime/KairoEngine.UI.asmdef

@@ -0,0 +1,18 @@
+{
+    "name": "KairoEngine.UI",
+    "references": [
+        "GUID:7e5ae6a38d1532248b4c890eca668b06",
+        "GUID:6055be8ebefd69e48b49212b09b47b2f",
+        "GUID:b94f6d64f53ebc74eb2ad4b5652e23e8",
+        "GUID:560b04d1a97f54a4e82edc0cbbb69285"
+    ],
+    "includePlatforms": [],
+    "excludePlatforms": [],
+    "allowUnsafeCode": false,
+    "overrideReferences": false,
+    "precompiledReferences": [],
+    "autoReferenced": true,
+    "defineConstraints": [],
+    "versionDefines": [],
+    "noEngineReferences": false
+}

+ 7 - 0
Runtime/KairoEngine.UI.asmdef.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 142285d3db5e7e849b02ea3a75bc2de7
+AssemblyDefinitionImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 0
Runtime/MenuComponents.meta

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

+ 105 - 0
Runtime/MenuComponents/ColumnMenuUI.cs

@@ -0,0 +1,105 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using TMPro;
+using Sirenix.OdinInspector;
+using KairoEngine.UI.Tooltips;
+using KairoEngine.UI.InteractionHandler;
+
+namespace KairoEngine.UI
+{
+    [HideMonoScript]
+    public class ColumnMenuUI : MenuUI
+    {
+        
+        [BoxGroup("Settings"), OnInspectorInit("EditorSetup")] public GameObject subMenuPrefab;
+        [BoxGroup("Settings")] public RectTransform subMenusParent;
+        private GameObject mainMenu;
+        private List<GameObject> subMenus = new List<GameObject>();
+
+        public override void Start()
+        {
+            useSubMenus = true;
+            if(handler == null) handler = gameObject.GetComponent<IClickHandler>();
+            if(createMenuOnStart) 
+            {
+                DestroyMenu();
+                CreateMenu();
+            }
+        }
+
+        public override void OnClick(string title)
+        {
+             for (int i = 0; i < buttons.Count; i++)
+             {
+                 if(buttons[i].title == title)
+                 {
+                    if(buttons[i].subMenuParent) OpenSubMenu(title);
+                    if(buttons[i].action != "" && handler != null)
+                    {
+                        handler.OnClick(buttons[i].action);
+                    }
+                 }
+             }
+        }
+
+        public override void CreateMenu() => CreateMenus();
+
+        public void CreateMenus()
+        {
+            mainMenu = Instantiate(subMenuPrefab, menuParent);
+            for (int i = 0; i < buttons.Count; i++)
+            {
+                if(string.IsNullOrEmpty(buttons[i].parent))
+                {
+                    var btn = CreateButton(buttons[i], mainMenu.transform);
+                    buttons[i].button = btn;
+                    var subMenu = Instantiate(subMenuPrefab, subMenusParent);
+                    subMenu.name = $"SubMenu {buttons[i].title}";
+                    for (int a = 0; a < buttons.Count; a++)
+                    {
+                        if(buttons[a].parent == buttons[i].title)
+                        {
+                            var subBtn = CreateButton(buttons[a], subMenu.transform);
+                            buttons[a].button = subBtn;
+                        }
+                    }
+                    subMenu.SetActive(false);
+                    subMenus.Add(subMenu);
+                }
+            }
+        }
+
+        public override void DestroyMenu() => DestroyMenus();
+
+        public void DestroyMenus()
+        {
+            for (int i = 0; i < subMenus.Count; i++)
+            {
+                Destroy(subMenus[i]);
+            }
+            subMenus = new List<GameObject>();
+            #if UNITY_EDITOR
+            DestroyImmediate(mainMenu);
+            #else
+            Destroy(mainMenu);
+            #endif
+            buttons = new List<MenuButtomData>();
+        }
+
+        public void OpenSubMenu(string title)
+        {
+            for (int i = 0; i < subMenus.Count; i++)
+            {
+                if($"SubMenu {title}" == subMenus[i].name) subMenus[i].SetActive(true);
+                else subMenus[i].SetActive(false);
+            }
+        }
+
+        public void EditorSetup()
+        {
+            useSubMenus = true;
+        }
+    }
+}

+ 11 - 0
Runtime/MenuComponents/ColumnMenuUI.cs.meta

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

+ 22 - 0
Runtime/MenuComponents/MenuAction.cs

@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using KairoEngine.Core.GameActions;
+
+namespace KairoEngine.UI
+{
+    [System.Serializable]
+    public class MenuAction
+    {
+        [FoldoutGroup("@title")] public string title = "action_name";
+
+        [FoldoutGroup("@title"), InlineProperty, HideLabel] public GameActionsController actionsController;
+
+        public void Execute()
+        {
+            actionsController.Restart();
+            actionsController.Start();
+        }
+    }
+}

+ 11 - 0
Runtime/MenuComponents/MenuAction.cs.meta

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

+ 25 - 0
Runtime/MenuComponents/MenuButtomData.cs

@@ -0,0 +1,25 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI
+{
+    [System.Serializable]
+    public class MenuButtomData
+    {
+        [HideInInspector] public string name { get { return $"{parent}{(useSubMenus ? "/" : string.Empty)}{title}"; } }
+        [FoldoutGroup("@name")] public string title = "";
+        [FoldoutGroup("@name")] public string action= "";
+        [FoldoutGroup("@name")] public Sprite graphic;
+        [FoldoutGroup("@name")] public string description= "";
+        [FoldoutGroup("@name")] public bool showTooltip = true;
+        [FoldoutGroup("@name"), ShowIf("@showTooltip")] public string tooltipType = "";
+        [FoldoutGroup("@name")] public bool isInteractable = true;
+        [HideInInspector] public bool useSubMenus = true;
+        [FoldoutGroup("@name"), Tooltip("Title of the parent button."), ShowIf("@useSubMenus")] public string parent= "";
+        [FoldoutGroup("@name"), Tooltip("Is this button the parent of other buttons?"), ShowIf("@useSubMenus")] public bool subMenuParent = false;
+        [HideInInspector] public GameObject button;
+    }
+}
+

+ 11 - 0
Runtime/MenuComponents/MenuButtomData.cs.meta

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

+ 41 - 0
Runtime/MenuComponents/MenuController.cs

@@ -0,0 +1,41 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+using KairoEngine.Core.GameActions;
+using KairoEngine.UI.InteractionHandler;
+
+namespace KairoEngine.UI
+{
+    [HideMonoScript]
+    public class MenuController : MonoBehaviour, IClickHandler
+    {
+        [InlineProperty, HideLabel] public GameActionContext context = new GameActionContext();
+        
+        [OnCollectionChanged("SetupActions"), PropertySpace(4,0), ListDrawerSettings(DraggableItems = false)] 
+        public List<MenuAction> menuActions = new List<MenuAction>();
+
+        public void OnClick(string title)
+        {
+            for (int i = 0; i < menuActions.Count; i++)
+            {
+                if(menuActions[i].title == title) menuActions[i].Execute();
+            }
+        }
+
+        private void SetupActions()
+        {
+            for (int i = 0; i < menuActions.Count; i++)
+            {
+                if(menuActions[i] != null)
+                {
+                    if(menuActions[i].actionsController != null)
+                    {
+                        menuActions[i].actionsController.context = context;
+                    }
+                }
+                
+            }
+        }
+    }
+}

+ 11 - 0
Runtime/MenuComponents/MenuController.cs.meta

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

+ 137 - 0
Runtime/MenuComponents/MenuUI.cs

@@ -0,0 +1,137 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using TMPro;
+using Sirenix.OdinInspector;
+using UnityEngine.UI;
+using KairoEngine.UI.Tooltips;
+using KairoEngine.UI.InteractionHandler;
+
+namespace KairoEngine.UI
+{
+    [HideMonoScript]
+    public class MenuUI : MonoBehaviour, IClickHandler, IUiSystemElement
+    {
+        [BoxGroup("Settings")] public string elementTitle = "New UI Element";
+        [BoxGroup("Settings")] public bool createMenuOnStart = true;
+        [BoxGroup("Settings")] public bool visibleOnStart = true;
+        [BoxGroup("Settings")] public GameObject buttonPrefab;
+        [BoxGroup("Settings")] public RectTransform menuParent;
+        [BoxGroup("Settings")] public Canvas menuCanvas;
+
+        [PropertySpace(4,4), OnCollectionChanged("UpdateButtonData")] public List<MenuButtomData> buttons = new List<MenuButtomData>();
+
+        private bool isVisible = false;
+        [HideInInspector] public IClickHandler handler;
+        [HideInInspector] public bool useSubMenus = false;
+
+        public virtual void Start()
+        {
+            if(handler == null) handler = gameObject.GetComponent<IClickHandler>();
+            if(createMenuOnStart) 
+            {
+                DestroyMenu();
+                CreateMenu();
+            }
+            if(visibleOnStart) UiManager.ShowElement(this);
+            else UiManager.HideElement(this);
+        }
+
+        private void OnDisable()
+        {
+            UiManager.UnregisterElement(this);
+        }
+
+        private void OnEnable()
+        {
+            UiManager.RegisterElement(elementTitle, this, this.transform, isVisible);
+        }
+
+        public virtual void OnClick(string title)
+        {
+            for (int i = 0; i < buttons.Count; i++)
+            {
+                if(buttons[i].title == title)
+                {
+                    if(buttons[i].action != "" && handler != null)
+                    {
+                        handler.OnClick(buttons[i].action);
+                    }
+                }
+            }
+        }
+
+        public void Hide()
+        {
+            menuCanvas.gameObject.SetActive(false);
+            isVisible = false;
+        }
+
+        public void Show()
+        {
+            menuCanvas.gameObject.SetActive(true);
+            isVisible = true;
+        }
+
+        public bool IsVisible() => isVisible;
+
+        public virtual GameObject CreateButton(MenuButtomData data, Transform parent)
+        {
+            var btn = Instantiate(buttonPrefab, parent);
+            ClickHandler clickHandler = btn.GetComponent<ClickHandler>();
+            if(clickHandler != null) 
+            {
+                clickHandler.receiver = this;
+                clickHandler.title = data.title;
+            }
+            ButtonData buttonData = btn.GetComponent<ButtonData>();
+            if(buttonData != null) buttonData.Setup(data.title, data.graphic);
+            TooltipTrigger tooltip = btn.GetComponent<TooltipTrigger>();
+            if(tooltip != null) 
+            {
+                if(data.showTooltip)
+                {
+                    tooltip.header = data.title;
+                    tooltip.content = data.description;
+                    tooltip.tooltipType = data.tooltipType;
+                }
+                else tooltip.enabled = false;
+            }
+            Button buttonComponent = btn.GetComponent<Button>();
+            if(buttonComponent != null) buttonComponent.interactable = data.isInteractable;
+            return btn;
+        }
+
+        [ButtonGroup("Buttons"), Button("Create Menu")]
+        public virtual void CreateMenu()
+        {
+            for (int i = 0; i < buttons.Count; i++)
+            {
+                var btn = CreateButton(buttons[i], menuParent);
+                buttons[i].button = btn;
+            }
+        }
+
+        [ButtonGroup("Buttons"), Button("Destroy Menu")]
+        public virtual void DestroyMenu()
+        {
+            for (int i = 0; i < buttons.Count; i++)
+            {
+                #if UNITY_EDITOR
+                DestroyImmediate(buttons[i].button);
+                #else
+                Destroy(buttons[i].button);
+                #endif
+            }
+        }
+
+        private void UpdateButtonData()
+        {
+            for (int i = 0; i < buttons.Count; i++)
+            {
+                buttons[i].useSubMenus = useSubMenus;
+            }
+        }
+    }
+}
+

+ 11 - 0
Runtime/MenuComponents/MenuUI.cs.meta

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

+ 35 - 0
Runtime/ModalWindowController.cs

@@ -0,0 +1,35 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace KairoEngine.UI
+{
+    public class ModalWindowController : MonoBehaviour, IUiSystemElement
+    {
+        public string elementName = "NewModalWindow";
+        public Canvas canvas;
+        private bool isVisible = false;
+
+        private void Start()
+        {
+            UiManager.RegisterElement(elementName, this, this.transform, false);
+        }
+
+        public void Hide()
+        {
+            isVisible = false;
+            canvas.gameObject.SetActive(false);
+        }
+
+        public void Show()
+        {
+            isVisible = true;
+            canvas.gameObject.SetActive(true);
+        }
+
+        public bool IsVisible() => isVisible;
+
+        private void OnEnable() => UiManager.RegisterElement(elementName, this, this.transform, isVisible);
+        private void OnDisable() => UiManager.UnregisterElement(this);
+    }
+}

+ 11 - 0
Runtime/ModalWindowController.cs.meta

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

+ 51 - 0
Runtime/MouseInputUIBlocker.cs

@@ -0,0 +1,51 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.EventSystems;
+using KairoEngine.Core;
+
+namespace KairoEngine.UI
+{
+    [RequireComponent(typeof(EventTrigger))]
+    public class MouseInputUIBlocker : MonoBehaviour
+    {
+        public static bool BlockedByUI;
+        private EventTrigger eventTrigger;
+
+        private void Start()
+        {
+            eventTrigger = GetComponent<EventTrigger>();
+            if (eventTrigger != null)
+            {
+                EventTrigger.Entry enterUIEntry = new EventTrigger.Entry();
+                // Pointer Enter
+                enterUIEntry.eventID = EventTriggerType.PointerEnter;
+                enterUIEntry.callback.AddListener((eventData) => { EnterUI(); });
+                eventTrigger.triggers.Add(enterUIEntry);
+
+                //Pointer Exit
+                EventTrigger.Entry exitUIEntry = new EventTrigger.Entry();
+                exitUIEntry.eventID = EventTriggerType.PointerExit;
+                exitUIEntry.callback.AddListener((eventData) => { ExitUI(); });
+                eventTrigger.triggers.Add(exitUIEntry);
+            }
+            EventManager.request.Bind("IsPointerBlockedByUI", IsBlockedByUI);
+        }
+
+        private void OnDisable()
+        {
+            BlockedByUI = false;
+        }
+
+        public void EnterUI()
+        {
+            BlockedByUI = true;
+        }
+        public void ExitUI()
+        {
+            BlockedByUI = false;
+        }
+        public bool IsBlockedByUI() => BlockedByUI;
+
+    }
+}

+ 11 - 0
Runtime/MouseInputUIBlocker.cs.meta

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

+ 8 - 0
Runtime/Slideshow.meta

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

+ 60 - 0
Runtime/Slideshow/SlideData.cs

@@ -0,0 +1,60 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI
+{
+    [System.Serializable]
+    public class SlideData
+    {
+        [FoldoutGroup("@title")] public string title = "New Slide";
+        [FoldoutGroup("@title")] public bool skipable = true;
+        [FoldoutGroup("@title")] public Image image;
+        [FoldoutGroup("@title")] public float delay = 0.5f;
+        [FoldoutGroup("@title")] public float duration = 3f;
+        [FoldoutGroup("@title")] public UiAnimator uiAnimator;
+
+        private float counter = 0;
+        private bool hasDelayed = false;
+
+        public void Show()
+        {
+            //Debug.Log("Showing slide " + title);
+            image.gameObject.SetActive(true);
+            counter = 0f;
+            hasDelayed = false;
+        }
+
+        public void Hide()
+        {
+            if(uiAnimator) uiAnimator.Disable();
+            else image.gameObject.SetActive(false);
+        }
+
+        public bool UpdateSlide()
+        {
+            counter += Time.deltaTime;
+            if(!hasDelayed) 
+            {
+                if(counter > delay) 
+                {
+                    Show();
+                    hasDelayed = true;
+                }
+            }
+            else
+            {
+                if(counter > duration) 
+                {
+                    //Debug.Log("Showing slide " + title + " is done");
+                    return true;
+                }
+                else return false;
+            }
+            return false;
+        }
+
+    }
+}

+ 11 - 0
Runtime/Slideshow/SlideData.cs.meta

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

+ 49 - 0
Runtime/Slideshow/SlideshowController.cs

@@ -0,0 +1,49 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using Sirenix.OdinInspector;
+using KairoEngine.Core.GameActions;
+
+namespace KairoEngine.UI
+{
+    [HideMonoScript]
+    public class SlideshowController : MonoBehaviour
+    {
+        [SerializeField, ShowInInspector] private List<SlideData> slides = new List<SlideData>();
+
+        public bool executeOnStart = true;
+
+        [HideLabel, InlineProperty, FoldoutGroup("OnEnd")] public GameActionsController endActionController = new GameActionsController();
+        private bool started = false;
+        private bool finished = false;
+        private int slideIndex = 0;
+
+        private void Start()
+        {
+            for (int i = 0; i < slides.Count; i++) slides[i].Hide();
+            if(executeOnStart) started = true;
+        }
+
+        private void Update()
+        {
+            if(started == false) return;
+            if(finished == true) return;
+            if(slideIndex >= slides.Count) 
+            {
+                endActionController.Start();
+                finished = true;
+                return;
+            }
+            var done = slides[slideIndex].UpdateSlide();
+            if(done)
+            {
+                slides[slideIndex].Hide();
+                slideIndex += 1;
+            }
+        }
+
+        public void StartSlideShow() => started = true;
+        
+    }
+}

+ 11 - 0
Runtime/Slideshow/SlideshowController.cs.meta

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

+ 79 - 0
Runtime/SoundConfigurationsUI.cs

@@ -0,0 +1,79 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.Audio;
+using Sirenix.OdinInspector;
+using KairoEngine.Core;
+
+namespace KairoEngine.UI
+{
+    public class SoundConfigurationsUI : MonoBehaviour
+    {
+        public AudioMixerGroup masterMixer;
+        public Slider masterVolumeSlider;
+        public string masterVolumeName = "masterVolume";
+
+        public Slider musicVolumeSlider;
+        public string musicVolumeName = "musicVolume";
+
+        public Slider sfxVolumeSlider;
+        public string sfxVolumeName = "sfxVolume";
+
+        float masterVolume = 1;
+        float musicVolume = 1;
+        float sfxVolume = 1;
+
+        Coroutine delayedSave;
+        
+        public void OnEnable()
+        {
+            masterVolumeSlider.onValueChanged.AddListener(delegate {UpdateMasterVolume(); });
+            musicVolumeSlider.onValueChanged.AddListener(delegate {UpdateMusicVolume(); });
+            sfxVolumeSlider.onValueChanged.AddListener(delegate {UpdateSfxVolume(); });
+        }
+
+        void OnDisable()
+        {
+            masterVolumeSlider.onValueChanged.RemoveListener(delegate {UpdateMasterVolume(); });
+            musicVolumeSlider.onValueChanged.RemoveListener(delegate {UpdateMusicVolume(); });
+            sfxVolumeSlider.onValueChanged.RemoveListener(delegate {UpdateSfxVolume(); });
+        }
+
+        private void UpdateMasterVolume() =>  UpdateVolume(masterVolumeName, masterVolumeSlider, ref masterVolume); 
+        private void UpdateMusicVolume() =>  UpdateVolume(musicVolumeName, musicVolumeSlider, ref musicVolume);
+        private void UpdateSfxVolume() =>  UpdateVolume(sfxVolumeName, sfxVolumeSlider, ref sfxVolume);
+
+        void Start() => LoadConfig();
+
+        void UpdateVolume(string volumeName, Slider slider, ref float volume)
+        {
+            masterMixer.audioMixer.SetFloat(volumeName, Mathf.Log10(slider.value) * 20);
+            volume = slider.value;
+            if(delayedSave != null) StopCoroutine(delayedSave);
+            delayedSave = StartCoroutine(Timer.StartRealtime(2f, SaveConfig));
+        }
+
+        void LoadConfig()
+        {
+            masterVolume = PlayerPrefs.GetFloat("MasterVolume", masterVolume);
+            musicVolume = PlayerPrefs.GetFloat("MusicVolume", musicVolume);
+            sfxVolume = PlayerPrefs.GetFloat("SFXVolume", sfxVolume);
+            masterVolumeSlider.value = masterVolume;
+            musicVolumeSlider.value = musicVolume;
+            sfxVolumeSlider.value = sfxVolume;
+            masterMixer.audioMixer.SetFloat(masterVolumeName, Mathf.Log10(masterVolume) * 20);
+            masterMixer.audioMixer.SetFloat(musicVolumeName, Mathf.Log10(musicVolume) * 20);
+            masterMixer.audioMixer.SetFloat(sfxVolumeName, Mathf.Log10(sfxVolume) * 20);
+        }
+
+        void SaveConfig()
+        {
+            PlayerPrefs.SetFloat("MasterVolume", masterVolume);
+            PlayerPrefs.SetFloat("MusicVolume", musicVolume);
+            PlayerPrefs.SetFloat("SFXVolume", sfxVolume);
+            Debug.Log($"Master: {masterVolume} | Music: {musicVolume} | SFX: {sfxVolume}");
+        }
+
+    }
+}

+ 11 - 0
Runtime/SoundConfigurationsUI.cs.meta

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

+ 8 - 0
Runtime/Tooltips.meta

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

+ 64 - 0
Runtime/Tooltips/Tooltip.cs

@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using TMPro;
+using KairoEngine.UI;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.Tooltips
+{
+    [HideMonoScript, ExecuteInEditMode()]
+    public class Tooltip : MonoBehaviour
+    {
+        public TextMeshProUGUI headerField;
+        public TextMeshProUGUI contentField;
+        public LayoutElement layoutElement;
+        public RectTransform rectTransform;
+        public int characterWrapLimit;
+        public Vector2 positionOffset = new Vector2(10, 10);
+        public string header = "";
+
+        private void Awake()
+        {
+            if(rectTransform == null) rectTransform = GetComponent<RectTransform>();
+        }
+
+
+        private void Update()
+        {
+            if(headerField == null || contentField == null || layoutElement == null || rectTransform == null) return;
+            if(Application.isEditor) UpdateLayout();
+            Vector2 position = Input.mousePosition;
+            // Todo: Position tooltip left/right/up/donw the mouse pointer dependending on size and screen position.
+            float pivotX = position.x / Screen.width;
+            float pivotY = position.y / Screen.height;
+            rectTransform.pivot = new Vector2(pivotX, pivotY);
+            position += positionOffset;
+            transform.position = position;
+        }
+
+        public void SetText(string content, string header = "")
+        {
+            if(string.IsNullOrEmpty(header)) headerField.gameObject.SetActive(false);
+            else 
+            {
+                this.header = header;
+                headerField.text = header;
+                headerField.gameObject.SetActive(true);
+            }
+            contentField.text = content;
+            UpdateLayout();
+        }
+
+        public void UpdateLayout()
+        {
+            
+            int headerLength = headerField.text.Length;
+            int contentLength = contentField.text.Length;
+
+            layoutElement.enabled = (headerLength > characterWrapLimit || contentLength > characterWrapLimit) ? true : false;
+        }
+    }
+}
+

+ 11 - 0
Runtime/Tooltips/Tooltip.cs.meta

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

+ 69 - 0
Runtime/Tooltips/TooltipSystem.cs

@@ -0,0 +1,69 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using KairoEngine.UI;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI.Tooltips
+{
+    public class TooltipSystem : SerializedMonoBehaviour
+    {
+        public static TooltipSystem instance;
+        [ReadOnly] public Tooltip tooltip;
+        
+        public Dictionary<string, Tooltip> tooltipList = new Dictionary<string, Tooltip>();
+        public float delayTime = 0.8f;
+
+        public void Awake()
+        {
+            if(instance == null) instance = this;
+            else Destroy(this.gameObject);
+            if(tooltip == null) Debug.LogError("No tooltip is assigned in TooltipSystem", this.gameObject);
+            else tooltip.gameObject.SetActive(false);
+        }
+
+        public static void Show(string content, string header = "", string tooltipType = "")
+        {
+            if(!HasInstance()) return;
+            foreach(KeyValuePair<string, Tooltip> keyValue in instance.tooltipList)
+            {
+                string key = keyValue.Key;
+                if(key == tooltipType)
+                {
+                    instance.tooltip = keyValue.Value;
+                }
+            }
+            if(instance.tooltip != null)
+            {
+                instance.tooltip.SetText(content, header);
+                instance.tooltip.gameObject.SetActive(true);
+            }
+            else Debug.LogError($"The Tooltip type named \'{tooltipType}\' could not be found.", instance.gameObject);
+        }
+
+        public static void Hide()
+        {
+            if(!HasInstance()) return;
+            if(instance.tooltip == null) return;
+            instance.tooltip.gameObject.SetActive(false);
+            instance.tooltip = null;
+        }
+
+        public static bool HasInstance()
+        {
+            if(instance == null)
+            {
+                Debug.LogWarning("There is no active TooltipSystem");
+                return false;
+            }
+            else return true;
+        }
+
+        public static float GetDelay()
+        {
+            if(!HasInstance()) return 0.5f;
+            else return instance.delayTime;
+        }
+    }
+}
+

+ 11 - 0
Runtime/Tooltips/TooltipSystem.cs.meta

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

+ 51 - 0
Runtime/Tooltips/TooltipTrigger.cs

@@ -0,0 +1,51 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.EventSystems;
+
+namespace KairoEngine.UI.Tooltips
+{
+    public class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
+    {
+        private static LTDescr delay;
+        public string header;
+        public string content;
+        public string tooltipType = "";
+        public void OnPointerEnter(PointerEventData eventData)
+        {
+            if(MouseInputUIBlocker.BlockedByUI) return;
+            if(string.IsNullOrEmpty(header) && string.IsNullOrEmpty(content)) return;
+            delay = LeanTween.delayedCall(TooltipSystem.GetDelay(), () =>
+            {
+                TooltipSystem.Show(content, header, tooltipType);
+            });
+            
+        }
+
+        public void OnPointerExit(PointerEventData eventData)
+        {
+            if(delay != null) LeanTween.cancel(delay.uniqueId);
+            TooltipSystem.Hide();
+        }
+
+        public void OnMouseEnter()
+        {
+            if(MouseInputUIBlocker.BlockedByUI) return;
+            if(string.IsNullOrEmpty(header) && string.IsNullOrEmpty(content)) return;
+            delay = LeanTween.delayedCall(TooltipSystem.GetDelay(), () =>
+            {
+                TooltipSystem.Show(content, header, tooltipType);
+            });
+            
+        }
+
+        public void OnMouseExit()
+        {
+            if(delay != null) LeanTween.cancel(delay.uniqueId);
+            TooltipSystem.Hide();
+        }
+
+    }
+}
+

+ 11 - 0
Runtime/Tooltips/TooltipTrigger.cs.meta

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

+ 114 - 0
Runtime/TransitionController.cs

@@ -0,0 +1,114 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using Sirenix.OdinInspector;
+using KairoEngine.Core;
+using UniRx;
+
+namespace KairoEngine.UI
+{
+    // Todo: Send events when fade starts and ends
+
+    /// <summary>
+    /// Controls a fade to black and fade from black curtain to use as transitions in the game.
+    /// </summary>
+    [HideMonoScript]
+    public class TransitionController : MonoBehaviour
+    {
+        public static TransitionController instance;
+
+        [InfoBox("The TransitionController is a full screen dissolve fader. It can transition the game to a black screen and back again.")]
+
+        [Tooltip("An image component with no sprite and painted black. The object needs to cover the hole screen.")]
+        public Image image;
+        public CanvasGroup canvasGroup;
+        private float timer;
+        private float counter;
+        private bool fadeIn = false;
+        private bool fadeOut = false;
+        private float alpha;
+
+        private LTDescr _tweenObject = new LTDescr();
+
+        void Awake()
+        {
+            if(instance == null) instance = this;
+            else Destroy(this);
+        }
+
+        void OnEnable()
+        {
+            TransitionEvents.OnFadeIn += FadeIn;
+            TransitionEvents.OnFadeOut += FadeOut;
+        }
+
+        void OnDisable()
+        {
+            TransitionEvents.OnFadeIn -= FadeIn;
+            TransitionEvents.OnFadeOut -= FadeOut;
+        }
+
+        void Start()
+        {
+            image.gameObject.SetActive(false);
+        }
+
+        void Update()
+        {
+            // counter += Time.deltaTime;
+            // if(fadeIn) alpha = Mathf.Lerp(0, 255, counter / timer);
+            // if(fadeOut) alpha = Mathf.Lerp(255, 0, counter / timer);
+            // image.color = new Color32(0, 0, 0, (byte)Mathf.FloorToInt(alpha));
+            // if(counter > timer)
+            // {
+            //     counter = 0;
+            //     if(fadeOut) image.gameObject.SetActive(false);
+            //     fadeIn= false;
+            //     fadeOut = false;
+            //     TransitionEvents.TransitionFinish();
+            // }
+        }
+
+        [Button("Fade In"), ButtonGroup, PropertyTooltip("Transition the game to a black screen. Only works during gameplay.")]
+        public void StartFadeIn(float time = 0.7f)
+        {
+            fadeIn = true;
+            fadeOut = false;
+            timer = time;
+            counter = 0;
+            image.gameObject.SetActive(true);
+            if(_tweenObject == null) _tweenObject = new LTDescr();
+            canvasGroup.alpha = 0;
+            _tweenObject = LeanTween.alphaCanvas(canvasGroup, 1, time).setIgnoreTimeScale( true );
+            //Debug.Log("Fading In");
+        }
+
+        [Button("Fade Out"), ButtonGroup, PropertyTooltip("Transition from a black screen back to the game. Only works during gameplay.")]
+        public void StartFadeOut(float time = 0.7f)
+        {
+            fadeOut = true;
+            fadeIn= false;
+            timer = time;
+            counter = 0;
+            image.gameObject.SetActive(true);
+            //Debug.Log("Fading Out");
+            if(_tweenObject == null) _tweenObject = new LTDescr();
+            canvasGroup.alpha = 1;
+            _tweenObject = LeanTween.alphaCanvas(canvasGroup, 0, time).setIgnoreTimeScale( true );
+            Timer.Execute(time * 1000, () => {
+                image.gameObject.SetActive(false);
+            });
+        }
+
+        public static void FadeIn(float time = 0.7f)
+        {
+            if(instance != null) instance.StartFadeIn(time);
+        }
+
+        public static void FadeOut(float time = 0.7f)
+        {
+            if(instance != null) instance.StartFadeOut(time);
+        }
+    }
+}

+ 11 - 0
Runtime/TransitionController.cs.meta

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

+ 96 - 0
Runtime/UiAnimator.cs

@@ -0,0 +1,96 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI
+{
+    public class UiAnimator : MonoBehaviour
+    {
+        public GameObject objectToAnimate;
+        
+        public float delay = 0f;
+        public float disableDelay = 0f;
+        public bool animateOnEnable;
+        public bool animateOnDisable;
+        public bool disableObjectOnEnd = true;
+
+        public bool animateScale = true;
+        [ShowIf(@"animateScale")] public float scaleDuration = 0.3f;
+        [ShowIf(@"animateScale")] public Vector3 sacelFrom;
+        [ShowIf(@"animateScale")] public Vector3 scaleTo;
+
+        public bool animateAlpha = true;
+        [ShowIf(@"animateAlpha")] public float alphaDuration = 0.1f;
+        [ShowIf(@"animateAlpha")] public float alphaFrom = 0f;
+        [ShowIf(@"animateAlpha")] public float alphaTo = 1f;
+
+        private LTDescr _tweenObject = new LTDescr();
+
+        public void OnEnable()
+        {
+            if(animateOnEnable)
+            {
+                Animate();
+            }
+        }
+
+        public void Disable()
+        {
+            if(animateOnDisable == false)
+            {
+                if(disableObjectOnEnd) gameObject.SetActive(false);
+                return;
+            }
+            SwapDirection();
+            Animate();
+            _tweenObject.setDelay(disableDelay).setOnComplete(() => {
+                SwapDirection();
+                if(disableObjectOnEnd) gameObject.SetActive(false);
+            });
+        }
+
+        private void Animate()
+        {
+            //Debug.Log("Animating UI");
+            if(_tweenObject == null) {
+                _tweenObject = new LTDescr();
+            }
+            if(objectToAnimate == null)
+            {
+                objectToAnimate = gameObject;
+            }
+            
+            // Scale Animation
+            if(animateScale)
+            {
+                objectToAnimate.GetComponent<RectTransform>().localScale = sacelFrom;
+                _tweenObject = LeanTween.scale(objectToAnimate, scaleTo, scaleDuration).setIgnoreTimeScale( true ).setDelay(delay);
+            }
+            // Fade Animaion
+            if(animateAlpha)
+            {
+                CanvasGroup canvas = objectToAnimate.GetComponent<CanvasGroup>();
+                if(canvas == null)
+                {
+                    objectToAnimate.AddComponent<CanvasGroup>();
+                    canvas = objectToAnimate.GetComponent<CanvasGroup>();
+                }
+                canvas.alpha = alphaFrom;
+                _tweenObject = LeanTween.alphaCanvas(canvas, alphaTo, alphaDuration).setIgnoreTimeScale( true ).setDelay(delay);
+            }
+            
+            
+        }
+
+        private void SwapDirection()
+        {
+            var scaleTemp = sacelFrom;
+            sacelFrom = scaleTo;
+            scaleTo = scaleTemp;
+            var alphaTemp = alphaFrom;
+            alphaFrom = alphaTo;
+            alphaTo = alphaTemp;
+        }
+    }
+}

+ 11 - 0
Runtime/UiAnimator.cs.meta

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

+ 146 - 0
Runtime/UiManager.cs

@@ -0,0 +1,146 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+using Sirenix.OdinInspector;
+
+namespace KairoEngine.UI
+{
+    [HideMonoScript]
+    public class UiManager : MonoBehaviour
+    {
+        public static UiManager instance;
+        public bool showUiElements = true;
+
+        [ListDrawerSettings(HideAddButton = true, HideRemoveButton = true, DraggableItems = false, Expanded = true, ShowPaging = false, ShowItemCount = true)]
+        public List<ElementState> uiElements = new List<ElementState>();
+
+        
+
+        void Awake()
+        {
+            if(instance == null) instance = this;
+            else Destroy(this);
+        }
+
+        void Update()
+        {
+            for (int i = 0; i < uiElements.Count; i++)
+            {
+                uiElements[i].gameState = uiElements[i].element.IsVisible();
+                if(showUiElements == false)
+                {
+                    if(uiElements[i].gameState == true) uiElements[i].element.Hide();
+                }
+                else
+                {
+                    if(uiElements[i].desiredState == true && !uiElements[i].element.IsVisible()) uiElements[i].element.Show();
+                    else if(uiElements[i].desiredState == false && uiElements[i].element.IsVisible()) uiElements[i].element.Hide();
+                }
+            }
+        }
+
+        public static void RegisterElement(string title, IUiSystemElement element, Transform controllerTransform, bool currentState = false)
+        {
+            if(instance == null) return;
+            var elementState = new ElementState(currentState, element.IsVisible(), title, element, controllerTransform);
+            bool duplicate = false;
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].title == title)
+                {
+                    duplicate = true;
+                    break;
+                }
+            }
+            if(!duplicate) instance.uiElements.Add(elementState);
+            if(instance.showUiElements && currentState) element.Show();
+            else element.Hide();
+        }
+
+        public static void UnregisterElement(IUiSystemElement element)
+        {
+            if(instance == null) return;
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].element == element) 
+                {
+                    instance.uiElements[i].element.Hide();
+                    instance.uiElements.Remove(instance.uiElements[i]);
+                    return;
+                }
+            }
+        }
+
+        public static void ShowElement(IUiSystemElement element)
+        {
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].element == element) 
+                {
+                    instance.uiElements[i].element.Show();
+                    instance.uiElements[i].desiredState = true;
+                    return;
+                }
+            }
+        }
+
+        public static void ShowElement(string title)
+        {
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].title == title) 
+                {
+                    instance.uiElements[i].element.Show();
+                    instance.uiElements[i].desiredState = true;
+                }
+            }
+        }
+
+        public static void HideElement(IUiSystemElement element)
+        {
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].element == element) 
+                {
+                    instance.uiElements[i].element.Hide();
+                    instance.uiElements[i].desiredState = false;
+                    return;
+                }
+            }
+        }
+
+        public static void HideElement(string title)
+        {
+            for (int i = 0; i < instance.uiElements.Count; i++)
+            {
+                if(instance.uiElements[i].title == title) 
+                {
+                    instance.uiElements[i].element.Hide();
+                    instance.uiElements[i].desiredState = false;
+                }
+            }
+        }
+
+        [System.Serializable]
+        public class ElementState
+        {
+            [HideLabel, HorizontalGroup("h", 0.04f), Tooltip("Desired state")] public bool desiredState;
+            [ReadOnly, HideLabel, HorizontalGroup("h", 0.04f), Tooltip("Current state")] public bool gameState;
+            [ReadOnly, HideLabel, HorizontalGroup("h", 0.52f)] public string title = "";
+            
+            [HideInInspector] public IUiSystemElement element;
+            [ReadOnly, HideLabel, HorizontalGroup("h", 0.4f)] public Transform controllerTransform;
+
+            public ElementState(bool desiredState, bool gameState, string title, IUiSystemElement element, Transform controllerTransform) 
+            {
+                this.desiredState = desiredState;
+                this.gameState = gameState;
+                this.title = title;
+                this.element = element;
+                this.controllerTransform = controllerTransform;
+            }
+        }
+
+    }
+}

+ 11 - 0
Runtime/UiManager.cs.meta

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

+ 40 - 0
Runtime/UiSystemElement.cs

@@ -0,0 +1,40 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace KairoEngine.UI
+{
+    public class UiSystemElement : MonoBehaviour, IUiSystemElement
+    {
+        public string elementTitle = "New UI Element";
+        public RectTransform targetRectTransform;
+
+        public bool isVisible = true;
+
+        public void Hide()
+        {
+            targetRectTransform.gameObject.SetActive(false);
+            isVisible = false;
+        }
+
+        public void Show()
+        {
+            targetRectTransform.gameObject.SetActive(true);
+            isVisible = true;
+        }
+
+        public bool IsVisible() => isVisible;
+
+        private void OnDisable()
+        {
+            UiManager.UnregisterElement(this);
+        }
+
+        private void OnEnable()
+        {
+            UiManager.RegisterElement(elementTitle, this, this.transform, isVisible);
+        }
+    }
+}
+

+ 11 - 0
Runtime/UiSystemElement.cs.meta

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

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