Prechádzať zdrojové kódy

First working game iteration

Axel Nordh 1 mesiac pred
rodič
commit
b283ca15dd
42 zmenil súbory, kde vykonal 5158 pridanie a 47 odobranie
  1. 151 0
      Assets/Materials/Ball.mat
  2. 153 0
      Assets/Materials/Block-green.mat
  3. 155 0
      Assets/Materials/DeathZoneMaterial.mat
  4. 155 0
      Assets/Materials/Effects/ExplosiveEffectMaterial.mat
  5. 174 0
      Assets/Prefabs/Ball.prefab
  6. 152 0
      Assets/Prefabs/Block.prefab
  7. 182 0
      Assets/Prefabs/Paddle.prefab
  8. 2145 44
      Assets/Scenes/SampleScene.unity
  9. 31 0
      Assets/Scripts/BallEffects/BallEffectBase.cs
  10. 9 0
      Assets/Scripts/BallEffects/BallEffectType.cs
  11. 20 0
      Assets/Scripts/BallEffects/Definitions/BallEffectDefinition.cs
  12. 17 0
      Assets/Scripts/BallEffects/Definitions/ExplosiveHitEffectDefinition.cs
  13. 14 0
      Assets/Scripts/BallEffects/Definitions/HomingEffectDefinition.cs
  14. 11 0
      Assets/Scripts/BallEffects/Definitions/PiercingEffectDefinition.cs
  15. 17 0
      Assets/Scripts/BallEffects/Definitions/TeleportEffectDefinition.cs
  16. 23 0
      Assets/Scripts/BallEffects/Definitions/TripleSplitEffectDefinition.cs
  17. 31 0
      Assets/Scripts/BallEffects/ExplosiveHitEffect.cs
  18. 64 0
      Assets/Scripts/BallEffects/HomingEffect.cs
  19. 33 0
      Assets/Scripts/BallEffects/PiercingEffect.cs
  20. 48 0
      Assets/Scripts/BallEffects/TeleportEffect.cs
  21. 62 0
      Assets/Scripts/BallEffects/TripleSplitEffect.cs
  22. 337 0
      Assets/Scripts/BallScript.cs
  23. 43 0
      Assets/Scripts/BlockScript.cs
  24. 25 0
      Assets/Scripts/DeathZoneScript.cs
  25. 1 1
      Assets/Scripts/Managers/BallManager.cs
  26. 16 0
      Assets/Scripts/Managers/ControllsManager.cs
  27. 316 0
      Assets/Scripts/Managers/GameManager.cs
  28. 16 0
      Assets/Scripts/Managers/LevelManager.cs
  29. 16 0
      Assets/Scripts/Managers/PaddleManager.cs
  30. 97 0
      Assets/Scripts/PaddleScript.cs
  31. 19 0
      Assets/Scripts/ScriptableObjects/ExplosiveEffect.asset
  32. 18 0
      Assets/Scripts/ScriptableObjects/HomingEffect.asset
  33. 17 0
      Assets/Scripts/ScriptableObjects/PiercingEffect.asset
  34. 19 0
      Assets/Scripts/ScriptableObjects/TeleportEffect.asset
  35. 21 0
      Assets/Scripts/ScriptableObjects/TripleSplitEffect.asset
  36. 151 0
      Assets/Scripts/Upgrades/UPGRADE_API_GUIDE.cs.txt
  37. 86 0
      Assets/Scripts/Upgrades/UpgradeAPIDemo.cs
  38. 126 0
      Assets/Scripts/Upgrades/UpgradeManager.cs
  39. 52 0
      Assets/Scripts/Upgrades/UpgradeState.cs
  40. 8 0
      Assets/Scripts/WallScript.cs
  41. 121 0
      ProjectSettings/SceneTemplateSettings.json
  42. 6 2
      ProjectSettings/TagManager.asset

+ 151 - 0
Assets/Materials/Ball.mat

@@ -0,0 +1,151 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Ball
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap:
+    RenderType: Opaque
+  disabledShaderPasses:
+  - MOTIONVECTORS
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MaskTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AddPrecomputedVelocity: 0
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnableExternalAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _WorkflowMode: 1
+    - _XRMotionVectorsPass: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 0.5660378, g: 0.5660378, b: 0.5660378, a: 1}
+    - _Color: {r: 0.5660378, g: 0.5660378, b: 0.5660378, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+  m_BuildTextureStacks: []
+  m_AllowLocking: 1
+--- !u!114 &4776714254497558261
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
+  version: 10

+ 153 - 0
Assets/Materials/Block-green.mat

@@ -0,0 +1,153 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-3105271997716271568
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
+  version: 10
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: Block-green
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords: []
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap:
+    RenderType: Opaque
+  disabledShaderPasses:
+  - MOTIONVECTORS
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MaskTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AddPrecomputedVelocity: 0
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _DstBlendAlpha: 0
+    - _EnableExternalAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0.249
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 0
+    - _UVSec: 0
+    - _WorkflowMode: 1
+    - _XRMotionVectorsPass: 1
+    - _ZWrite: 1
+    m_Colors:
+    - _BaseColor: {r: 0, g: 0.8679245, b: 0.16940083, a: 1}
+    - _Color: {r: 0, g: 0.8679245, b: 0.16940078, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+  m_BuildTextureStacks: []
+  m_AllowLocking: 1

+ 155 - 0
Assets/Materials/DeathZoneMaterial.mat

@@ -0,0 +1,155 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-2479432274546975966
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
+  version: 10
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: DeathZoneMaterial
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords:
+  - _ALPHAPREMULTIPLY_ON
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - MOTIONVECTORS
+  - DepthOnly
+  - SHADOWCASTER
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MaskTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AddPrecomputedVelocity: 0
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _DstBlendAlpha: 10
+    - _EnableExternalAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _XRMotionVectorsPass: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0.5660378, g: 0.17888924, b: 0.17888924, a: 0.47843137}
+    - _Color: {r: 0.5660378, g: 0.17888921, b: 0.17888921, a: 0.47843137}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+  m_BuildTextureStacks: []
+  m_AllowLocking: 1

+ 155 - 0
Assets/Materials/Effects/ExplosiveEffectMaterial.mat

@@ -0,0 +1,155 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &-675911788102596651
+MonoBehaviour:
+  m_ObjectHideFlags: 11
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
+  version: 10
+--- !u!21 &2100000
+Material:
+  serializedVersion: 8
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: ExplosiveEffectMaterial
+  m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
+  m_Parent: {fileID: 0}
+  m_ModifiedSerializedProperties: 0
+  m_ValidKeywords:
+  - _ALPHAPREMULTIPLY_ON
+  - _SURFACE_TYPE_TRANSPARENT
+  m_InvalidKeywords: []
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: 3000
+  stringTagMap:
+    RenderType: Transparent
+  disabledShaderPasses:
+  - MOTIONVECTORS
+  - DepthOnly
+  - SHADOWCASTER
+  m_LockedProperties: 
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _AlphaTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BaseMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MaskTex:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _NormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _SpecGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_Lightmaps:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_LightmapsInd:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - unity_ShadowMasks:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Ints: []
+    m_Floats:
+    - _AddPrecomputedVelocity: 0
+    - _AlphaClip: 0
+    - _AlphaToMask: 0
+    - _Blend: 0
+    - _BlendModePreserveSpecular: 1
+    - _BumpScale: 1
+    - _ClearCoatMask: 0
+    - _ClearCoatSmoothness: 0
+    - _Cull: 2
+    - _Cutoff: 0.5
+    - _DetailAlbedoMapScale: 1
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 10
+    - _DstBlendAlpha: 10
+    - _EnableExternalAlpha: 0
+    - _EnvironmentReflections: 1
+    - _GlossMapScale: 0
+    - _Glossiness: 0
+    - _GlossyReflections: 0
+    - _Metallic: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.005
+    - _QueueOffset: 0
+    - _ReceiveShadows: 1
+    - _Smoothness: 0.5
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _SrcBlendAlpha: 1
+    - _Surface: 1
+    - _WorkflowMode: 1
+    - _XRMotionVectorsPass: 1
+    - _ZWrite: 0
+    m_Colors:
+    - _BaseColor: {r: 0.754717, g: 0, b: 0, a: 0.5803922}
+    - _Color: {r: 0.75471693, g: 0, b: 0, a: 0.5803922}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+    - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+    - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
+  m_BuildTextureStacks: []
+  m_AllowLocking: 1

+ 174 - 0
Assets/Prefabs/Ball.prefab

@@ -0,0 +1,174 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &4991217814184015504
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 5403644224533445074}
+  - component: {fileID: 4051701557968672312}
+  - component: {fileID: 327487786426034050}
+  - component: {fileID: 2617341343604911293}
+  - component: {fileID: 1508402020580130709}
+  - component: {fileID: -31560839148444988}
+  m_Layer: 0
+  m_Name: Ball
+  m_TagString: Ball
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &5403644224533445074
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.25, y: 0.25, z: 0.25}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &4051701557968672312
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &327487786426034050
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 74c1c5429dca48b409f8383be462ee4b, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!50 &2617341343604911293
+Rigidbody2D:
+  serializedVersion: 5
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  m_BodyType: 0
+  m_Simulated: 1
+  m_UseFullKinematicContacts: 0
+  m_UseAutoMass: 0
+  m_Mass: 1
+  m_LinearDamping: 0
+  m_AngularDamping: 0.05
+  m_GravityScale: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_Interpolate: 0
+  m_SleepingMode: 1
+  m_CollisionDetection: 0
+  m_Constraints: 0
+--- !u!58 &1508402020580130709
+CircleCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_Radius: 0.5
+--- !u!114 &-31560839148444988
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4991217814184015504}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0c4e267eca814a64e86345c4f19f0a92, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: '::'
+  launchSpeed: 10
+  maxLaunchAngle: 30
+  paddle: {fileID: 0}
+  spawnOffset: {x: 0, y: 0.7, z: 0}

+ 152 - 0
Assets/Prefabs/Block.prefab

@@ -0,0 +1,152 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &7481309880327207087
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4714781576640667903}
+  - component: {fileID: 6739084377447649814}
+  - component: {fileID: 1035038206888236591}
+  - component: {fileID: 7721825486691363514}
+  - component: {fileID: 2040941161674920597}
+  m_Layer: 0
+  m_Name: Block
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4714781576640667903
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7481309880327207087}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.75, y: 0.25, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &6739084377447649814
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7481309880327207087}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1035038206888236591
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7481309880327207087}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 6e50b5fce3c31ea4d8147dde79cc8774, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!114 &7721825486691363514
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7481309880327207087}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 31f850f961448e241ab5beea7c97c634, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: '::'
+--- !u!61 &2040941161674920597
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7481309880327207087}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0

+ 182 - 0
Assets/Prefabs/Paddle.prefab

@@ -0,0 +1,182 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &8846460400480967429
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 9058537231275824773}
+  - component: {fileID: 4884100587881059989}
+  - component: {fileID: 5010675585110746223}
+  - component: {fileID: -6413481067696229164}
+  - component: {fileID: 8518150335625546294}
+  - component: {fileID: 2453331333648695248}
+  m_Layer: 0
+  m_Name: Paddle
+  m_TagString: Paddle
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &9058537231275824773
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: -4, z: 0}
+  m_LocalScale: {x: 1, y: 0.25, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &4884100587881059989
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &5010675585110746223
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!61 &-6413481067696229164
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!50 &8518150335625546294
+Rigidbody2D:
+  serializedVersion: 5
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  m_BodyType: 0
+  m_Simulated: 1
+  m_UseFullKinematicContacts: 0
+  m_UseAutoMass: 0
+  m_Mass: 1
+  m_LinearDamping: 0
+  m_AngularDamping: 0.05
+  m_GravityScale: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_Interpolate: 0
+  m_SleepingMode: 1
+  m_CollisionDetection: 0
+  m_Constraints: 0
+--- !u!114 &2453331333648695248
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 8846460400480967429}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c048c011b8af89c4a99526577d9f5288, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: '::'
+  moveSpeed: 10
+  edgePadding: 0.1

+ 2145 - 44
Assets/Scenes/SampleScene.unity

@@ -13,7 +13,7 @@ OcclusionCullingSettings:
 --- !u!104 &2
 RenderSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 9
+  serializedVersion: 10
   m_Fog: 0
   m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
   m_FogMode: 3
@@ -38,13 +38,12 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
-  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
   m_UseRadianceAmbientProbe: 0
 --- !u!157 &3
 LightmapSettings:
   m_ObjectHideFlags: 0
-  serializedVersion: 12
-  m_GIWorkflowMode: 1
+  serializedVersion: 13
+  m_BakeOnSceneLoad: 0
   m_GISettings:
     serializedVersion: 2
     m_BounceScale: 1
@@ -67,9 +66,6 @@ LightmapSettings:
     m_LightmapParameters: {fileID: 0}
     m_LightmapsBakeMode: 1
     m_TextureCompression: 1
-    m_FinalGather: 0
-    m_FinalGatherFiltering: 1
-    m_FinalGatherRayCount: 256
     m_ReflectionCompression: 2
     m_MixedBakeMode: 2
     m_BakeBackend: 1
@@ -104,7 +100,7 @@ NavMeshSettings:
   serializedVersion: 2
   m_ObjectHideFlags: 0
   m_BuildSettings:
-    serializedVersion: 2
+    serializedVersion: 3
     agentTypeID: 0
     agentRadius: 0.5
     agentHeight: 2
@@ -117,12 +113,297 @@ NavMeshSettings:
     cellSize: 0.16666667
     manualTileSize: 0
     tileSize: 256
-    accuratePlacement: 0
+    buildHeightMesh: 0
     maxJobWorkers: 0
     preserveTilesOutsideBounds: 0
     debug:
       m_Flags: 0
   m_NavMeshData: {fileID: 0}
+--- !u!1001 &27627963
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (9)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &38368348
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -2.25
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (5)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &111563937
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 1.35
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (14)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &199151608
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (2)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &505784274
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.2
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (16)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
 --- !u!1 &519420028
 GameObject:
   m_ObjectHideFlags: 0
@@ -172,6 +453,7 @@ MonoBehaviour:
     serializedVersion: 2
     m_Bits: 1
   m_VolumeTrigger: {fileID: 0}
+  m_VolumeFrameworkUpdateModeOption: 2
   m_RenderPostProcessing: 0
   m_Antialiasing: 0
   m_AntialiasingQuality: 2
@@ -179,8 +461,19 @@ MonoBehaviour:
   m_Dithering: 0
   m_ClearDepth: 1
   m_AllowXRRendering: 1
+  m_AllowHDROutput: 1
+  m_UseScreenCoordOverride: 0
+  m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
+  m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
   m_RequiresDepthTexture: 0
   m_RequiresColorTexture: 0
+  m_TaaSettings:
+    m_Quality: 3
+    m_FrameInfluence: 0.1
+    m_JitterScale: 1
+    m_MipBias: 0
+    m_VarianceClampScale: 0.9
+    m_ContrastAdaptiveSharpening: 0
   m_Version: 2
 --- !u!20 &519420031
 Camera:
@@ -196,9 +489,17 @@ Camera:
   m_projectionMatrixMode: 1
   m_GateFitMode: 2
   m_FOVAxisMode: 0
+  m_Iso: 200
+  m_ShutterSpeed: 0.005
+  m_Aperture: 16
+  m_FocusDistance: 10
+  m_FocalLength: 50
+  m_BladeCount: 5
+  m_Curvature: {x: 2, y: 11}
+  m_BarrelClipping: 0.25
+  m_Anamorphism: 0
   m_SensorSize: {x: 36, y: 24}
   m_LensShift: {x: 0, y: 0}
-  m_FocalLength: 50
   m_NormalizedViewPortRect:
     serializedVersion: 2
     x: 0
@@ -232,14 +533,71 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 519420028}
+  serializedVersion: 2
   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
   m_LocalPosition: {x: 0, y: 0, z: -10}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 0}
-  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &569220031
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (8)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
 --- !u!1 &619394800
 GameObject:
   m_ObjectHideFlags: 0
@@ -269,55 +627,29 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 073797afb82c5a1438f328866b10b3f0, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  m_ComponentVersion: 1
+  m_ComponentVersion: 2
   m_LightType: 4
   m_BlendStyleIndex: 0
   m_FalloffIntensity: 0.5
   m_Color: {r: 1, g: 1, b: 1, a: 1}
   m_Intensity: 1
   m_LightVolumeIntensity: 1
-  m_LightVolumeIntensityEnabled: 0
+  m_LightVolumeEnabled: 0
   m_ApplyToSortingLayers: 00000000
   m_LightCookieSprite: {fileID: 0}
   m_DeprecatedPointLightCookieSprite: {fileID: 0}
   m_LightOrder: 0
+  m_AlphaBlendOnOverlap: 0
   m_OverlapOperation: 0
   m_NormalMapDistance: 3
   m_NormalMapQuality: 2
   m_UseNormalMap: 0
-  m_ShadowIntensityEnabled: 0
+  m_ShadowsEnabled: 0
   m_ShadowIntensity: 0.75
+  m_ShadowSoftness: 0
+  m_ShadowSoftnessFalloffIntensity: 0.5
   m_ShadowVolumeIntensityEnabled: 0
   m_ShadowVolumeIntensity: 0.75
-  m_Vertices:
-  - position: {x: 0.9985302, y: 0.9985302, z: 0}
-    color: {r: 0.70710677, g: 0.70710677, b: 0, a: 0}
-    uv: {x: 0, y: 0}
-  - position: {x: 0.9985302, y: 0.9985302, z: 0}
-    color: {r: 0, g: 0, b: 0, a: 1}
-    uv: {x: 0, y: 0}
-  - position: {x: -0.9985302, y: 0.9985302, z: 0}
-    color: {r: -0.70710677, g: 0.70710677, b: 0, a: 0}
-    uv: {x: 0, y: 0}
-  - position: {x: -0.9985302, y: 0.9985302, z: 0}
-    color: {r: 0, g: 0, b: 0, a: 1}
-    uv: {x: 0, y: 0}
-  - position: {x: -0.99853003, y: -0.9985304, z: 0}
-    color: {r: -0.70710665, g: -0.7071069, b: 0, a: 0}
-    uv: {x: 0, y: 0}
-  - position: {x: -0.99853003, y: -0.9985304, z: 0}
-    color: {r: 0, g: 0, b: 0, a: 1}
-    uv: {x: 0, y: 0}
-  - position: {x: 0.99853003, y: -0.9985304, z: 0}
-    color: {r: 0.70710665, g: -0.7071069, b: 0, a: 0}
-    uv: {x: 0, y: 0}
-  - position: {x: 0.99853003, y: -0.9985304, z: 0}
-    color: {r: 0, g: 0, b: 0, a: 1}
-    uv: {x: 0, y: 0}
-  - position: {x: 0, y: 0, z: 0}
-    color: {r: 0, g: 0, b: 0, a: 1}
-    uv: {x: 0, y: 0}
-  m_Triangles: 030001000800020000000100030002000100050003000800040002000300050004000300070005000800060004000500070006000500010007000800000006000700010000000700
   m_LocalBounds:
     m_Center: {x: 0, y: -0.00000011920929, z: 0}
     m_Extent: {x: 0.9985302, y: 0.99853027, z: 0}
@@ -342,11 +674,1780 @@ Transform:
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 619394800}
+  serializedVersion: 2
   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_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 0}
-  m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &748215458
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &801898583
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -1.8
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (6)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1 &832691433
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 832691435}
+  - component: {fileID: 832691434}
+  m_Layer: 0
+  m_Name: UpgradeDemoAPI
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &832691434
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 832691433}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 82c58a85de3079b4b9ed089dee14d89c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Assembly-CSharp::UpgradeAPIDemo
+--- !u!4 &832691435
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 832691433}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 2.51432, y: -7.02181, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1090192660
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1090192665}
+  - component: {fileID: 1090192664}
+  - component: {fileID: 1090192663}
+  - component: {fileID: 1090192662}
+  - component: {fileID: 1090192661}
+  m_Layer: 0
+  m_Name: TopWall
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!61 &1090192661
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1090192660}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!114 &1090192662
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1090192660}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0d962a9d1d392364c83fbfd0f8c1391c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: '::'
+--- !u!23 &1090192663
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1090192660}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1090192664
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1090192660}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1090192665
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1090192660}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 4.96, z: 0}
+  m_LocalScale: {x: 15.7, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1105467699
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (18)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1115468107
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -1.35
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (1)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1155506572
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 1.35
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (3)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1 &1159721726
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1159721731}
+  - component: {fileID: 1159721730}
+  - component: {fileID: 1159721729}
+  - component: {fileID: 1159721728}
+  - component: {fileID: 1159721727}
+  m_Layer: 0
+  m_Name: Death
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1159721727
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1159721726}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 704517f8bb589e345bc5509e6fdd8b29, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: '::'
+--- !u!61 &1159721728
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1159721726}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 1
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!23 &1159721729
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1159721726}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 34a0914a93763474f8bc7b316fcc874c, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1159721730
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1159721726}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1159721731
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1159721726}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: -4.99, z: 0}
+  m_LocalScale: {x: 15.213, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1225135646
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.5
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (19)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1328818121
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 2.25
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.3
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (4)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1 &1337750171
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1337750176}
+  - component: {fileID: 1337750175}
+  - component: {fileID: 1337750174}
+  - component: {fileID: 1337750173}
+  - component: {fileID: 1337750172}
+  m_Layer: 0
+  m_Name: RightWall
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1337750172
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337750171}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0d962a9d1d392364c83fbfd0f8c1391c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Assembly-CSharp::WallScript
+--- !u!61 &1337750173
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337750171}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!23 &1337750174
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337750171}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1337750175
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337750171}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1337750176
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1337750171}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 7.37, y: -0.01, z: 0}
+  m_LocalScale: {x: 1, y: 10.25, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1370134942
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1370134944}
+  - component: {fileID: 1370134943}
+  m_Layer: 0
+  m_Name: GameManager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1370134943
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1370134942}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: af45753d32d6d634fbe4ee37ed9853c5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Assembly-CSharp::GameManager
+  winScreenPrefab: {fileID: 0}
+  gameOverScreenPrefab: {fileID: 0}
+  ballPrefab: {fileID: 4991217814184015504, guid: 2a66f802d6de01c4493609b3abe8f75c, type: 3}
+  initialBallCount: 5
+  ballSpawnOffset: {x: 0, y: 0.7, z: 0}
+  reserveAnchor: {fileID: 1889397839}
+  reserveBallSpacing: 0.5
+  reserveStartViewport: {x: 0.37, y: -0.45}
+  randomEffectPool:
+  - {fileID: 11400000, guid: fd896311c24f9b846886f76296954cc8, type: 2}
+  - {fileID: 11400000, guid: e8d5c9df49eb62a43a68e942b2193ec5, type: 2}
+  - {fileID: 11400000, guid: d36397a077038f04fa916e97a779591e, type: 2}
+  - {fileID: 11400000, guid: 0568b8f99a846a845853c9e16575d472, type: 2}
+  - {fileID: 11400000, guid: 44b7ebaeb4bbc4d41bdfabc02f418cb6, type: 2}
+--- !u!4 &1370134944
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1370134942}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -0.61279, y: -0.8571, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1404334682
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 1.8
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (10)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1476321986
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (12)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1595576140
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.6
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (7)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1691796157
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.45
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (13)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1697702988
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.2
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (17)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1736646999
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -1.35
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (11)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1743451374
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: -0.9
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.2
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (15)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1001 &1814231433
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: 1.8
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 4714781576640667903, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 7481309880327207087, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+      propertyPath: m_Name
+      value: Block (20)
+      objectReference: {fileID: 0}
+    m_RemovedComponents: []
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents: []
+  m_SourcePrefab: {fileID: 100100000, guid: bc7c685ce8d393047857f4dc3e20e710, type: 3}
+--- !u!1 &1889397838
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1889397839}
+  m_Layer: 0
+  m_Name: ReservBallsAnchor
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1889397839
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1889397838}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 4, y: -4.83, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1966698275
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1966698280}
+  - component: {fileID: 1966698279}
+  - component: {fileID: 1966698278}
+  - component: {fileID: 1966698277}
+  - component: {fileID: 1966698276}
+  m_Layer: 0
+  m_Name: LeftWall
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1966698276
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1966698275}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0d962a9d1d392364c83fbfd0f8c1391c, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: Assembly-CSharp::WallScript
+--- !u!61 &1966698277
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1966698275}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!23 &1966698278
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1966698275}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RayTracingAccelStructBuildFlagsOverride: 0
+  m_RayTracingAccelStructBuildFlags: 1
+  m_SmallMeshCulling: 1
+  m_ForceMeshLod: -1
+  m_MeshLodSelectionBias: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_GlobalIlluminationMeshLod: 0
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_MaskInteraction: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!33 &1966698279
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1966698275}
+  m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!4 &1966698280
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1966698275}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -7.37, y: -0.01, z: 0}
+  m_LocalScale: {x: 1, y: 10.25, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &4209651845955004250
+PrefabInstance:
+  m_ObjectHideFlags: 0
+  serializedVersion: 2
+  m_Modification:
+    serializedVersion: 3
+    m_TransformParent: {fileID: 0}
+    m_Modifications:
+    - target: {fileID: 8846460400480967429, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_Name
+      value: Paddle
+      objectReference: {fileID: 0}
+    - target: {fileID: 8846460400480967429, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_TagString
+      value: Player
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalPosition.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalPosition.y
+      value: -4
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalPosition.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalRotation.w
+      value: 1
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalRotation.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalRotation.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalRotation.z
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.x
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.y
+      value: 0
+      objectReference: {fileID: 0}
+    - target: {fileID: 9058537231275824773, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      propertyPath: m_LocalEulerAnglesHint.z
+      value: 0
+      objectReference: {fileID: 0}
+    m_RemovedComponents:
+    - {fileID: 0}
+    m_RemovedGameObjects: []
+    m_AddedGameObjects: []
+    m_AddedComponents:
+    - targetCorrespondingSourceObject: {fileID: 8846460400480967429, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      insertIndex: -1
+      addedObject: {fileID: 4209651845955004253}
+    - targetCorrespondingSourceObject: {fileID: 8846460400480967429, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+      insertIndex: -1
+      addedObject: {fileID: 4209651845955004252}
+  m_SourcePrefab: {fileID: 100100000, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+--- !u!1 &4209651845955004251 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 8846460400480967429, guid: d65979d3d6778064ca7895af4f9a3ed9, type: 3}
+  m_PrefabInstance: {fileID: 4209651845955004250}
+  m_PrefabAsset: {fileID: 0}
+--- !u!50 &4209651845955004252
+Rigidbody2D:
+  serializedVersion: 5
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4209651845955004251}
+  m_BodyType: 1
+  m_Simulated: 1
+  m_UseFullKinematicContacts: 0
+  m_UseAutoMass: 0
+  m_Mass: 1
+  m_LinearDamping: 0
+  m_AngularDamping: 0.05
+  m_GravityScale: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_Interpolate: 0
+  m_SleepingMode: 1
+  m_CollisionDetection: 0
+  m_Constraints: 0
+--- !u!61 &4209651845955004253
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4209651845955004251}
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_ForceSendLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ForceReceiveLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_ContactCaptureLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_CallbackLayers:
+    serializedVersion: 2
+    m_Bits: 4294967295
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_CompositeOperation: 0
+  m_CompositeOrder: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0, y: 0}
+    oldSize: {x: 0, y: 0}
+    newSize: {x: 0, y: 0}
+    adaptiveTilingThreshold: 0
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!1660057539 &9223372036854775807
+SceneRoots:
+  m_ObjectHideFlags: 0
+  m_Roots:
+  - {fileID: 519420032}
+  - {fileID: 619394802}
+  - {fileID: 4209651845955004250}
+  - {fileID: 1370134944}
+  - {fileID: 748215458}
+  - {fileID: 1115468107}
+  - {fileID: 199151608}
+  - {fileID: 1155506572}
+  - {fileID: 1328818121}
+  - {fileID: 38368348}
+  - {fileID: 801898583}
+  - {fileID: 1595576140}
+  - {fileID: 569220031}
+  - {fileID: 27627963}
+  - {fileID: 1404334682}
+  - {fileID: 1736646999}
+  - {fileID: 1476321986}
+  - {fileID: 1691796157}
+  - {fileID: 111563937}
+  - {fileID: 1743451374}
+  - {fileID: 505784274}
+  - {fileID: 1697702988}
+  - {fileID: 1105467699}
+  - {fileID: 1225135646}
+  - {fileID: 1814231433}
+  - {fileID: 1966698280}
+  - {fileID: 1337750176}
+  - {fileID: 1090192665}
+  - {fileID: 1159721731}
+  - {fileID: 1889397839}
+  - {fileID: 832691435}

+ 31 - 0
Assets/Scripts/BallEffects/BallEffectBase.cs

@@ -0,0 +1,31 @@
+using UnityEngine;
+
+public abstract class BallEffectBase : MonoBehaviour
+{
+    [SerializeField] protected BallEffectDefinition definition;
+
+    public BallEffectDefinition Definition => definition;
+
+    public virtual void SetDefinition(BallEffectDefinition newDefinition)
+    {
+        definition = newDefinition;
+    }
+
+    // Called after the ball is launched from the paddle.
+    public virtual void OnBallLaunched(BallScript ball) { }
+
+    // Called when a ball is reset by the DeathZone.
+    public virtual void OnBallReset(BallScript ball) { }
+
+    // Movement hook called every FixedUpdate while the ball is launched.
+    public virtual void ModifyVelocity(BallScript ball, ref Vector2 velocity, float deltaTime) { }
+
+    // Damage hook: receives current damage, returns modified damage.
+    public virtual float ModifyBlockDamage(BallScript ball, blockScript block, Collision2D collision, float currentDamage)
+    {
+        return currentDamage;
+    }
+
+    // Called after a block hit has been processed.
+    public virtual void OnHitBlock(BallScript ball, blockScript block, Collision2D collision) { }
+}

+ 9 - 0
Assets/Scripts/BallEffects/BallEffectType.cs

@@ -0,0 +1,9 @@
+public enum BallEffectType
+{
+    None = 0,
+    TripleSplit = 1,
+    Explosive = 2,
+    Piercing = 3,
+    Homing = 4,
+    Teleport = 5
+}

+ 20 - 0
Assets/Scripts/BallEffects/Definitions/BallEffectDefinition.cs

@@ -0,0 +1,20 @@
+using UnityEngine;
+
+public abstract class BallEffectDefinition : ScriptableObject
+{
+    [SerializeField] private BallEffectType effectType;
+    [SerializeField] private Material overlayMaterial;
+
+    public BallEffectType EffectType => effectType;
+    public Material OverlayMaterial => overlayMaterial;
+
+    protected void SetEffectType(BallEffectType type) => effectType = type;
+    protected void SetOverlayMaterial(Material material) => overlayMaterial = material;
+
+    /// <summary>Copy the base fields (EffectType, OverlayMaterial) from another definition. Used by UpgradeManager when creating runtime copies.</summary>
+    public void CopyBaseFrom(BallEffectDefinition source)
+    {
+        effectType = source.effectType;
+        overlayMaterial = source.overlayMaterial;
+    }
+}

+ 17 - 0
Assets/Scripts/BallEffects/Definitions/ExplosiveHitEffectDefinition.cs

@@ -0,0 +1,17 @@
+using UnityEngine;
+
+[CreateAssetMenu(menuName = "BlockBreaker/Ball Effects/Explosive", fileName = "ExplosiveEffect")]
+public class ExplosiveHitEffectDefinition : BallEffectDefinition
+{
+    [SerializeField] private float radius = 1.5f;
+    [SerializeField] private float maxDamageAtCenter = 1.5f;
+    [SerializeField] private float minDamageAtEdge = 0.25f;
+
+    public float Radius => radius;
+    public float MaxDamageAtCenter => maxDamageAtCenter;
+    public float MinDamageAtEdge => minDamageAtEdge;
+
+    public void SetRadius(float value) => radius = value;
+    public void SetMaxDamageAtCenter(float value) => maxDamageAtCenter = value;
+    public void SetMinDamageAtEdge(float value) => minDamageAtEdge = value;
+}

+ 14 - 0
Assets/Scripts/BallEffects/Definitions/HomingEffectDefinition.cs

@@ -0,0 +1,14 @@
+using UnityEngine;
+
+[CreateAssetMenu(menuName = "BlockBreaker/Ball Effects/Homing", fileName = "HomingEffect")]
+public class HomingEffectDefinition : BallEffectDefinition
+{
+    [SerializeField] private float turnRateDegreesPerSecond = 120f;
+    [SerializeField] private float retargetInterval = 0.2f;
+
+    public float TurnRateDegreesPerSecond => turnRateDegreesPerSecond;
+    public float RetargetInterval => retargetInterval;
+
+    public void SetTurnRateDegreesPerSecond(float value) => turnRateDegreesPerSecond = value;
+    public void SetRetargetInterval(float value) => retargetInterval = value;
+}

+ 11 - 0
Assets/Scripts/BallEffects/Definitions/PiercingEffectDefinition.cs

@@ -0,0 +1,11 @@
+using UnityEngine;
+
+[CreateAssetMenu(menuName = "BlockBreaker/Ball Effects/Piercing", fileName = "PiercingEffect")]
+public class PiercingEffectDefinition : BallEffectDefinition
+{
+    [SerializeField] private int pierceHits = 3;
+
+    public int PierceHits => pierceHits;
+
+    public void SetPierceHits(int value) => pierceHits = value;
+}

+ 17 - 0
Assets/Scripts/BallEffects/Definitions/TeleportEffectDefinition.cs

@@ -0,0 +1,17 @@
+using UnityEngine;
+
+[CreateAssetMenu(menuName = "BlockBreaker/Ball Effects/Teleport", fileName = "TeleportEffect")]
+public class TeleportEffectDefinition : BallEffectDefinition
+{
+    [SerializeField] private float intervalSeconds = 2f;
+    [SerializeField] private float teleportDistance = 1.5f;
+    [SerializeField] private float overlapCheckRadius = 0.05f;
+
+    public float IntervalSeconds => intervalSeconds;
+    public float TeleportDistance => teleportDistance;
+    public float OverlapCheckRadius => overlapCheckRadius;
+
+    public void SetIntervalSeconds(float value) => intervalSeconds = value;
+    public void SetTeleportDistance(float value) => teleportDistance = value;
+    public void SetOverlapCheckRadius(float value) => overlapCheckRadius = value;
+}

+ 23 - 0
Assets/Scripts/BallEffects/Definitions/TripleSplitEffectDefinition.cs

@@ -0,0 +1,23 @@
+using UnityEngine;
+
+[CreateAssetMenu(menuName = "BlockBreaker/Ball Effects/Triple Split", fileName = "TripleSplitEffect")]
+public class TripleSplitEffectDefinition : BallEffectDefinition
+{
+    [SerializeField] private bool splitOnlyOnce = true;
+    [SerializeField] private float splitAngle = 20f;
+    [SerializeField] private float childScaleMultiplier = 0.7f;
+    [SerializeField] private float childSpeedMultiplier = 1f;
+    [SerializeField] private float childDamageMultiplier = 1f / 3f;
+
+    public bool SplitOnlyOnce => splitOnlyOnce;
+    public float SplitAngle => splitAngle;
+    public float ChildScaleMultiplier => childScaleMultiplier;
+    public float ChildSpeedMultiplier => childSpeedMultiplier;
+    public float ChildDamageMultiplier => childDamageMultiplier;
+
+    public void SetSplitOnlyOnce(bool value) => splitOnlyOnce = value;
+    public void SetSplitAngle(float value) => splitAngle = value;
+    public void SetChildScaleMultiplier(float value) => childScaleMultiplier = value;
+    public void SetChildSpeedMultiplier(float value) => childSpeedMultiplier = value;
+    public void SetChildDamageMultiplier(float value) => childDamageMultiplier = value;
+}

+ 31 - 0
Assets/Scripts/BallEffects/ExplosiveHitEffect.cs

@@ -0,0 +1,31 @@
+using UnityEngine;
+
+public class ExplosiveHitEffect : BallEffectBase
+{
+    private ExplosiveHitEffectDefinition Config => definition as ExplosiveHitEffectDefinition;
+
+    public override void OnHitBlock(BallScript ball, blockScript hitBlock, Collision2D collision)
+    {
+        ExplosiveHitEffectDefinition config = Config;
+        if (config == null)
+            return;
+
+        Vector2 center = collision.GetContact(0).point;
+        blockScript[] blocks = FindObjectsByType<blockScript>(FindObjectsSortMode.None);
+
+        for (int i = 0; i < blocks.Length; i++)
+        {
+            blockScript block = blocks[i];
+            if (block == null)
+                continue;
+
+            float distance = Vector2.Distance(center, block.transform.position);
+            if (distance > config.Radius)
+                continue;
+
+            float t = Mathf.Clamp01(distance / config.Radius);
+            float splashDamage = Mathf.Lerp(config.MaxDamageAtCenter, config.MinDamageAtEdge, t);
+            block.ApplyDamage(splashDamage);
+        }
+    }
+}

+ 64 - 0
Assets/Scripts/BallEffects/HomingEffect.cs

@@ -0,0 +1,64 @@
+using UnityEngine;
+
+public class HomingEffect : BallEffectBase
+{
+    private float _retargetTimer;
+    private blockScript _targetBlock;
+    private HomingEffectDefinition Config => definition as HomingEffectDefinition;
+
+    public override void OnBallReset(BallScript ball)
+    {
+        _retargetTimer = 0f;
+        _targetBlock = null;
+    }
+
+    public override void ModifyVelocity(BallScript ball, ref Vector2 velocity, float deltaTime)
+    {
+        HomingEffectDefinition config = Config;
+        if (config == null)
+            return;
+
+        if (velocity.sqrMagnitude < 0.0001f)
+            return;
+
+        _retargetTimer += deltaTime;
+        if (_targetBlock == null || _retargetTimer >= config.RetargetInterval)
+        {
+            _retargetTimer = 0f;
+            _targetBlock = FindClosestBlock(ball.transform.position);
+        }
+
+        if (_targetBlock == null)
+            return;
+
+        Vector2 currentDir = velocity.normalized;
+        Vector2 targetDir = ((Vector2)_targetBlock.transform.position - (Vector2)ball.transform.position).normalized;
+
+        float maxRadians = config.TurnRateDegreesPerSecond * Mathf.Deg2Rad * deltaTime;
+        Vector3 steered = Vector3.RotateTowards(currentDir, targetDir, maxRadians, 0f);
+        velocity = ((Vector2)steered).normalized * velocity.magnitude;
+    }
+
+    private static blockScript FindClosestBlock(Vector2 position)
+    {
+        blockScript[] blocks = FindObjectsByType<blockScript>(FindObjectsSortMode.None);
+        blockScript best = null;
+        float bestSqrDistance = float.MaxValue;
+
+        for (int i = 0; i < blocks.Length; i++)
+        {
+            blockScript b = blocks[i];
+            if (b == null)
+                continue;
+
+            float sqrDist = ((Vector2)b.transform.position - position).sqrMagnitude;
+            if (sqrDist < bestSqrDistance)
+            {
+                bestSqrDistance = sqrDist;
+                best = b;
+            }
+        }
+
+        return best;
+    }
+}

+ 33 - 0
Assets/Scripts/BallEffects/PiercingEffect.cs

@@ -0,0 +1,33 @@
+using UnityEngine;
+
+public class PiercingEffect : BallEffectBase
+{
+    private int _remainingPierceHits;
+    private PiercingEffectDefinition Config => definition as PiercingEffectDefinition;
+
+    public override void OnBallLaunched(BallScript ball)
+    {
+        _remainingPierceHits = Config != null ? Config.PierceHits : 0;
+    }
+
+    public override void OnBallReset(BallScript ball)
+    {
+        _remainingPierceHits = Config != null ? Config.PierceHits : 0;
+    }
+
+    public override void OnHitBlock(BallScript ball, blockScript block, Collision2D collision)
+    {
+        if (_remainingPierceHits == 0)
+            return;
+
+        if (_remainingPierceHits > 0)
+            _remainingPierceHits--;
+
+        // Override post-collision bounce and keep travelling in the incoming direction.
+        Vector2 incoming = ball.GetPrePhysicsVelocity();
+        if (incoming.sqrMagnitude < 0.0001f)
+            return;
+
+        ball.Body.linearVelocity = incoming.normalized * ball.GetCurrentSpeed();
+    }
+}

+ 48 - 0
Assets/Scripts/BallEffects/TeleportEffect.cs

@@ -0,0 +1,48 @@
+using UnityEngine;
+
+public class TeleportEffect : BallEffectBase
+{
+    private float _timer;
+    private TeleportEffectDefinition Config => definition as TeleportEffectDefinition;
+
+    public override void OnBallLaunched(BallScript ball)
+    {
+        _timer = 0f;
+    }
+
+    public override void OnBallReset(BallScript ball)
+    {
+        _timer = 0f;
+    }
+
+    public override void ModifyVelocity(BallScript ball, ref Vector2 velocity, float deltaTime)
+    {
+        TeleportEffectDefinition config = Config;
+        if (config == null)
+            return;
+
+        _timer += deltaTime;
+        if (_timer < config.IntervalSeconds)
+            return;
+
+        _timer = 0f;
+
+        Vector2 direction = velocity.sqrMagnitude > 0.0001f ? velocity.normalized : Vector2.up;
+        Vector2 targetPos = (Vector2)ball.transform.position + direction * config.TeleportDistance;
+
+        // Move instantly without collision resolution along the traveled path.
+        ball.transform.position = targetPos;
+
+        // If teleport lands inside blocks, destroy those blocks.
+        Collider2D[] hits = Physics2D.OverlapCircleAll(targetPos, config.OverlapCheckRadius);
+        for (int i = 0; i < hits.Length; i++)
+        {
+            if (hits[i] == null)
+                continue;
+
+            blockScript block = hits[i].GetComponent<blockScript>();
+            if (block != null)
+                block.ApplyDamage(9999f);
+        }
+    }
+}

+ 62 - 0
Assets/Scripts/BallEffects/TripleSplitEffect.cs

@@ -0,0 +1,62 @@
+using UnityEngine;
+
+public class TripleSplitEffect : BallEffectBase
+{
+    private bool _hasSplit;
+    private TripleSplitEffectDefinition Config => definition as TripleSplitEffectDefinition;
+
+    public override void OnBallReset(BallScript ball)
+    {
+        _hasSplit = false;
+    }
+
+    public override void OnHitBlock(BallScript ball, blockScript block, Collision2D collision)
+    {
+        TripleSplitEffectDefinition config = Config;
+        if (config == null)
+            return;
+
+        if (config.SplitOnlyOnce && _hasSplit)
+            return;
+
+        _hasSplit = true;
+
+        Vector2 currentDir = collision.rigidbody != null
+            ? collision.rigidbody.linearVelocity.normalized
+            : Vector2.up;
+
+        // Spawn two additional balls at +/- splitAngle around current direction.
+        Vector2 dirA = Rotate(currentDir, config.SplitAngle);
+        Vector2 dirB = Rotate(currentDir, -config.SplitAngle);
+        BallScript cloneA = ball.SpawnClone(dirA, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier);
+        BallScript cloneB = ball.SpawnClone(dirB, config.ChildSpeedMultiplier, config.ChildScaleMultiplier, config.ChildDamageMultiplier);
+
+        // The original ball becomes one of the 3 child balls.
+        ball.MultiplyScale(config.ChildScaleMultiplier);
+        ball.MultiplyDamage(config.ChildDamageMultiplier);
+
+        if (config.SplitOnlyOnce)
+        {
+            MarkAsAlreadySplit(cloneA);
+            MarkAsAlreadySplit(cloneB);
+        }
+    }
+
+    private static void MarkAsAlreadySplit(BallScript cloneBall)
+    {
+        if (cloneBall == null)
+            return;
+
+        TripleSplitEffect cloneEffect = cloneBall.GetComponent<TripleSplitEffect>();
+        if (cloneEffect != null)
+            cloneEffect._hasSplit = true;
+    }
+
+    private static Vector2 Rotate(Vector2 v, float degrees)
+    {
+        float rad = degrees * Mathf.Deg2Rad;
+        float sin = Mathf.Sin(rad);
+        float cos = Mathf.Cos(rad);
+        return new Vector2(v.x * cos - v.y * sin, v.x * sin + v.y * cos).normalized;
+    }
+}

+ 337 - 0
Assets/Scripts/BallScript.cs

@@ -0,0 +1,337 @@
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+[RequireComponent(typeof(Rigidbody2D))]
+[RequireComponent(typeof(Collider2D))]
+public class BallScript : MonoBehaviour
+{
+    [Header("Launch")]
+    [SerializeField] private float launchSpeed = 10f;
+    [Tooltip("Maximum random angle (degrees) from straight up on launch.")]
+    [SerializeField] private float maxLaunchAngle = 30f;
+    [Tooltip("Base damage before ball effects modify it.")]
+    [SerializeField] private float baseDamage = 1f;
+
+    [Header("References")]
+    [Tooltip("Assign the Paddle transform in the Inspector, or tag the paddle 'Paddle' for auto-find.")]
+    [SerializeField] private Transform paddle;
+    [Tooltip("Offset above the paddle centre where the ball sits before launch.")]
+    [SerializeField] private Vector3 spawnOffset = new Vector3(0f, 0.7f, 0f);
+
+    public float LaunchSpeed => launchSpeed;
+    public float BaseDamage => baseDamage;
+    public Rigidbody2D Body => _rb;
+    public bool IsQueueManaged => _isQueueManaged;
+    public bool IsInPlay => _rb != null && _rb.simulated && _collider != null && _collider.enabled;
+
+    private Rigidbody2D _rb;
+    private Collider2D _collider;
+    private Renderer _renderer;
+    private Material[] _baseMaterials;
+
+    private bool _launched;
+    private bool _followPaddleWhenUnlaunched = true;
+    private bool _isQueueManaged;
+
+    private BallEffectBase[] _effects;
+    private Vector3 _initialScale;
+    private float _damageMultiplier = 1f;
+    private Vector2 _prePhysicsVelocity;
+
+    void Awake()
+    {
+        _rb = GetComponent<Rigidbody2D>();
+        _collider = GetComponent<Collider2D>();
+        _renderer = GetComponentInChildren<Renderer>();
+        _effects = GetComponents<BallEffectBase>();
+
+        _rb.gravityScale = 0f;
+        _rb.linearDamping = 0f;
+        _rb.angularDamping = 0f;
+        _rb.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
+        _initialScale = transform.localScale;
+
+        // Use physics to handle bouncing naturally - bounciness = 1 means perfect reflection.
+        // Friction = 0 means no slowdown.
+        var mat = new PhysicsMaterial2D { bounciness = 1f, friction = 0f };
+        _collider.sharedMaterial = mat;
+
+        if (_renderer != null)
+            _baseMaterials = _renderer.sharedMaterials;
+    }
+
+    void Start()
+    {
+        if (paddle == null)
+            paddle = GameObject.FindGameObjectWithTag("Paddle")?.transform;
+
+        _launched = false;
+    }
+
+    void Update()
+    {
+        if (_launched || !_followPaddleWhenUnlaunched)
+            return;
+
+        // Follow the paddle until launched.
+        if (paddle != null)
+            transform.position = paddle.position + spawnOffset;
+
+        bool spacePressed = Keyboard.current != null && Keyboard.current.spaceKey.wasPressedThisFrame;
+        bool mousePressed = Mouse.current != null && Mouse.current.leftButton.wasPressedThisFrame;
+        if (spacePressed || mousePressed)
+            Launch();
+    }
+
+    void FixedUpdate()
+    {
+        if (!_launched)
+            return;
+
+        // Store incoming velocity for collision-response effects (e.g. piercing).
+        _prePhysicsVelocity = _rb.linearVelocity;
+
+        Vector2 velocity = _rb.linearVelocity;
+        for (int i = 0; i < _effects.Length; i++)
+        {
+            BallEffectBase effect = _effects[i];
+            if (effect != null && effect.isActiveAndEnabled)
+                effect.ModifyVelocity(this, ref velocity, Time.fixedDeltaTime);
+        }
+
+        _rb.linearVelocity = velocity;
+    }
+
+    public void SetQueueManaged(bool value)
+    {
+        _isQueueManaged = value;
+    }
+
+    public void SetPaddleReference(Transform paddleTransform, Vector3 offset)
+    {
+        paddle = paddleTransform;
+        spawnOffset = offset;
+    }
+
+    public void ParkAtPosition(Vector3 worldPosition)
+    {
+        _launched = false;
+        _followPaddleWhenUnlaunched = false;
+        _rb.linearVelocity = Vector2.zero;
+        _rb.simulated = false;
+        _collider.enabled = false;
+        transform.position = worldPosition;
+    }
+
+    public void PrepareOnPaddle()
+    {
+        _launched = false;
+        _followPaddleWhenUnlaunched = true;
+        _rb.simulated = true;
+        _collider.enabled = true;
+        _rb.linearVelocity = Vector2.zero;
+        _damageMultiplier = 1f;
+        transform.localScale = _initialScale;
+
+        if (paddle == null)
+            paddle = GameObject.FindGameObjectWithTag("Paddle")?.transform;
+
+        if (paddle != null)
+            transform.position = paddle.position + spawnOffset;
+
+        for (int i = 0; i < _effects.Length; i++)
+        {
+            BallEffectBase effect = _effects[i];
+            if (effect != null && effect.isActiveAndEnabled)
+                effect.OnBallReset(this);
+        }
+    }
+
+    /// <summary>Called by DeathZoneScript for fallback non-queue behavior.</summary>
+    public void ResetBall()
+    {
+        PrepareOnPaddle();
+    }
+
+    public void SetEffectDefinition(BallEffectDefinition effectDefinition)
+    {
+        // Disable all currently attached effects first.
+        BallEffectBase[] allEffects = GetComponents<BallEffectBase>();
+        for (int i = 0; i < allEffects.Length; i++)
+            allEffects[i].enabled = false;
+
+        ApplyOverlayMaterial(effectDefinition != null ? effectDefinition.OverlayMaterial : null);
+
+        if (effectDefinition == null)
+        {
+            Debug.Log($"[{gameObject.name}] SetEffectDefinition: Received NULL definition (no effect assigned)");
+            RebuildEffectsCache();
+            return;
+        }
+
+        Debug.Log($"[{gameObject.name}] SetEffectDefinition: Assigning effect type: {effectDefinition.EffectType}");
+
+        MonoBehaviour selected = null;
+        switch (effectDefinition.EffectType)
+        {
+            case BallEffectType.TripleSplit:
+                Debug.Log($"[{gameObject.name}] Matched TripleSplit case");
+                selected = GetOrAddEffect<TripleSplitEffect>();
+                break;
+            case BallEffectType.Explosive:
+                Debug.Log($"[{gameObject.name}] Matched Explosive case");
+                selected = GetOrAddEffect<ExplosiveHitEffect>();
+                break;
+            case BallEffectType.Piercing:
+                Debug.Log($"[{gameObject.name}] Matched Piercing case");
+                selected = GetOrAddEffect<PiercingEffect>();
+                break;
+            case BallEffectType.Homing:
+                Debug.Log($"[{gameObject.name}] Matched Homing case");
+                selected = GetOrAddEffect<HomingEffect>();
+                break;
+            case BallEffectType.Teleport:
+                Debug.Log($"[{gameObject.name}] Matched Teleport case");
+                selected = GetOrAddEffect<TeleportEffect>();
+                break;
+            case BallEffectType.None:
+            default:
+                Debug.LogError($"[{gameObject.name}] ERROR: EffectType is None or unrecognized: {effectDefinition.EffectType}");
+                break;
+        }
+
+        if (selected is BallEffectBase effectBase)
+        {
+            Debug.Log($"[{gameObject.name}] Successfully enabled effect: {selected.GetType().Name}");
+            effectBase.SetDefinition(effectDefinition);
+            selected.enabled = true;
+        }
+        else
+        {
+            Debug.LogError($"[{gameObject.name}] ERROR: selected component is not a BallEffectBase! Type: {selected?.GetType().Name ?? "NULL"}");
+        }
+
+        RebuildEffectsCache();
+    }
+
+    public void ApplyOverlayMaterial(Material overlayMaterial)
+    {
+        if (_renderer == null)
+            return;
+
+        if (overlayMaterial == null)
+        {
+            _renderer.sharedMaterials = _baseMaterials;
+            return;
+        }
+
+        Material[] stacked = new Material[_baseMaterials.Length + 1];
+        for (int i = 0; i < _baseMaterials.Length; i++)
+            stacked[i] = _baseMaterials[i];
+
+        stacked[stacked.Length - 1] = overlayMaterial;
+        _renderer.sharedMaterials = stacked;
+    }
+
+    public float GetDamageAgainstBlock(blockScript block, Collision2D collision)
+    {
+        float damage = baseDamage * _damageMultiplier;
+        for (int i = 0; i < _effects.Length; i++)
+        {
+            BallEffectBase effect = _effects[i];
+            if (effect != null && effect.isActiveAndEnabled)
+                damage = effect.ModifyBlockDamage(this, block, collision, damage);
+        }
+
+        return Mathf.Max(0f, damage);
+    }
+
+    public void NotifyHitBlock(blockScript block, Collision2D collision)
+    {
+        for (int i = 0; i < _effects.Length; i++)
+        {
+            BallEffectBase effect = _effects[i];
+            if (effect != null && effect.isActiveAndEnabled)
+                effect.OnHitBlock(this, block, collision);
+        }
+    }
+
+    public void MultiplyDamage(float multiplier)
+    {
+        _damageMultiplier *= multiplier;
+    }
+
+    public void MultiplyScale(float scaleMultiplier)
+    {
+        transform.localScale *= scaleMultiplier;
+    }
+
+    public float GetCurrentSpeed()
+    {
+        float speed = _rb.linearVelocity.magnitude;
+        return speed > 0.001f ? speed : launchSpeed;
+    }
+
+    public Vector2 GetPrePhysicsVelocity()
+    {
+        if (_prePhysicsVelocity.sqrMagnitude > 0.0001f)
+            return _prePhysicsVelocity;
+
+        return _rb.linearVelocity;
+    }
+
+    public void LaunchInDirection(Vector2 direction, float speed)
+    {
+        _launched = true;
+        _followPaddleWhenUnlaunched = false;
+        _rb.simulated = true;
+        _collider.enabled = true;
+
+        Vector2 dir = direction.sqrMagnitude > 0.0001f ? direction.normalized : Vector2.up;
+        _rb.linearVelocity = dir * speed;
+    }
+
+    public BallScript SpawnClone(Vector2 direction, float speedMultiplier, float scaleMultiplier, float damageMultiplier)
+    {
+        GameObject cloneObject = Instantiate(gameObject, transform.position, Quaternion.identity);
+        BallScript cloneBall = cloneObject.GetComponent<BallScript>();
+        if (cloneBall == null)
+            return null;
+
+        // Clones are temporary gameplay balls and do not consume queue slots.
+        cloneBall.SetQueueManaged(false);
+        cloneBall.SetPaddleReference(paddle, spawnOffset);
+        cloneBall.LaunchInDirection(direction, launchSpeed * speedMultiplier);
+        cloneBall.MultiplyScale(scaleMultiplier);
+        cloneBall.MultiplyDamage(damageMultiplier);
+        return cloneBall;
+    }
+
+    private void Launch()
+    {
+        _launched = true;
+        float angle = Random.Range(-maxLaunchAngle, maxLaunchAngle) * Mathf.Deg2Rad;
+        _rb.linearVelocity = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle)) * launchSpeed;
+
+        for (int i = 0; i < _effects.Length; i++)
+        {
+            BallEffectBase effect = _effects[i];
+            if (effect != null && effect.isActiveAndEnabled)
+                effect.OnBallLaunched(this);
+        }
+    }
+
+    private T GetOrAddEffect<T>() where T : MonoBehaviour
+    {
+        T existing = GetComponent<T>();
+        if (existing != null)
+            return existing;
+
+        return gameObject.AddComponent<T>();
+    }
+
+    private void RebuildEffectsCache()
+    {
+        _effects = GetComponents<BallEffectBase>();
+    }
+}

+ 43 - 0
Assets/Scripts/BlockScript.cs

@@ -0,0 +1,43 @@
+using UnityEngine;
+
+[RequireComponent(typeof(Collider2D))]
+public class blockScript : MonoBehaviour
+{
+    [SerializeField] private float health = 1f;
+
+    private float _currentHealth;
+    private bool _isDestroyed;
+
+    void Awake()
+    {
+        _currentHealth = health;
+    }
+
+    private void OnCollisionEnter2D(Collision2D collision)
+    {
+        if (!collision.gameObject.CompareTag("Ball"))
+            return;
+
+        BallScript ball = collision.gameObject.GetComponent<BallScript>();
+        float damage = ball != null ? ball.GetDamageAgainstBlock(this, collision) : 1f;
+
+        ApplyDamage(damage);
+        ball?.NotifyHitBlock(this, collision);
+    }
+
+    public void ApplyDamage(float amount)
+    {
+        if (_isDestroyed)
+            return;
+
+        float clampedAmount = Mathf.Max(0f, amount);
+        _currentHealth -= clampedAmount;
+
+        if (_currentHealth <= 0f)
+        {
+            _isDestroyed = true;
+            Destroy(gameObject);
+            GameManager.Instance?.OnBlockDestroyed();
+        }
+    }
+}

+ 25 - 0
Assets/Scripts/DeathZoneScript.cs

@@ -0,0 +1,25 @@
+using UnityEngine;
+
+
+[RequireComponent(typeof(Collider2D))]
+public class DeathZoneScript : MonoBehaviour
+{
+    void OnTriggerEnter2D(Collider2D collision)
+    {
+        if (!collision.gameObject.CompareTag("Ball"))
+            return;
+
+        BallScript ball = collision.GetComponent<BallScript>();
+        if (ball == null)
+            return;
+
+        if (GameManager.Instance != null)
+        {
+            GameManager.Instance.OnBallEnteredDeathZone(ball);
+            return;
+        }
+
+        // Fallback behavior if no manager exists.
+        ball.ResetBall();
+    }
+}

+ 1 - 1
Assets/Scripts/GameManager.cs → Assets/Scripts/Managers/BallManager.cs

@@ -1,6 +1,6 @@
 using UnityEngine;
 
-public class GameManager : MonoBehaviour
+public class BallManager : MonoBehaviour
 {
     // Start is called once before the first execution of Update after the MonoBehaviour is created
     void Start()

+ 16 - 0
Assets/Scripts/Managers/ControllsManager.cs

@@ -0,0 +1,16 @@
+using UnityEngine;
+
+public class ControllsManager : MonoBehaviour
+{
+    // Start is called once before the first execution of Update after the MonoBehaviour is created
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 316 - 0
Assets/Scripts/Managers/GameManager.cs

@@ -0,0 +1,316 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GameManager : MonoBehaviour
+{
+    public static GameManager Instance { get; private set; }
+
+    [Header("Level Flow")]
+    [SerializeField] private GameObject winScreenPrefab;
+    [SerializeField] private GameObject gameOverScreenPrefab;
+
+    [Header("Ball Queue")]
+    [SerializeField] private GameObject ballPrefab;
+    [SerializeField] private int initialBallCount = 5;
+    [SerializeField] private Vector3 ballSpawnOffset = new Vector3(0f, 0.7f, 0f);
+    [SerializeField] private Transform reserveAnchor;
+    [SerializeField] private float reserveBallSpacing = 0.5f;
+    [SerializeField] private Vector2 reserveStartViewport = new Vector2(0.92f, 0.12f);
+
+    [Header("Random Effects")]
+    [SerializeField] private BallEffectDefinition[] randomEffectPool;
+
+    private readonly Queue<BallScript> _reserveBalls = new Queue<BallScript>();
+    private Transform _paddle;
+    private Camera _gameCamera;
+    private bool _gameWon;
+    private bool _gameOver;
+    private BallScript _currentQueueBall;
+    private int _remainingBlockCount;
+    private UpgradeState _upgrades;
+
+    void Awake()
+    {
+        if (Instance != null && Instance != this)
+        {
+            Destroy(gameObject);
+            return;
+        }
+        Instance = this;
+
+        Time.timeScale = 1f;
+        Time.fixedDeltaTime = 0.01f;
+        _upgrades = new UpgradeState();
+    }
+
+    void Start()
+    {
+        ResolveSceneReferences();
+        _remainingBlockCount = FindObjectsByType<blockScript>(FindObjectsSortMode.None).Length;
+        InitializeBallQueue();
+    }
+
+    public void OnBallEnteredDeathZone(BallScript ball)
+    {
+        if (_gameWon || _gameOver || ball == null)
+            return;
+
+        bool wasCurrentQueueBall = ball == _currentQueueBall;
+        Destroy(ball.gameObject);
+
+        if (HasOtherBallsInPlay(ball))
+            return;
+
+        if (wasCurrentQueueBall)
+            _currentQueueBall = null;
+
+        if (_reserveBalls.Count > 0)
+        {
+            MoveNextQueuedBallToPaddle();
+            return;
+        }
+
+        ShowGameOver();
+    }
+
+    private bool HasOtherBallsInPlay(BallScript excludedBall)
+    {
+        BallScript[] balls = FindObjectsByType<BallScript>(FindObjectsSortMode.None);
+        for (int i = 0; i < balls.Length; i++)
+        {
+            BallScript otherBall = balls[i];
+            if (otherBall == null || otherBall == excludedBall)
+                continue;
+
+            if (otherBall.IsInPlay)
+                return true;
+        }
+
+        return false;
+    }
+
+    /// <summary>Called by BlockScript when a block is destroyed.</summary>
+    public void OnBlockDestroyed()
+    {
+        if (_gameWon || _gameOver)
+            return;
+
+        _remainingBlockCount = Mathf.Max(0, _remainingBlockCount - 1);
+        if (_remainingBlockCount == 0)
+            WinGame();
+    }
+
+    private void InitializeBallQueue()
+    {
+        if (ballPrefab == null)
+        {
+            Debug.LogWarning("GameManager: ballPrefab is not assigned. Cannot create ball queue.");
+            return;
+        }
+
+        if (_paddle == null)
+        {
+            Debug.LogWarning("GameManager: Paddle not found. Tag the paddle as 'Paddle' or ensure PaddleScript exists in scene.");
+            return;
+        }
+
+        if (_gameCamera == null)
+        {
+            Debug.LogWarning("GameManager: No camera found for reserve-ball placement.");
+            return;
+        }
+
+        if (initialBallCount <= 0)
+        {
+            Debug.LogWarning("GameManager: initialBallCount must be > 0.");
+            return;
+        }
+
+        Debug.Log($"GameManager: Initializing {initialBallCount} balls. Random effect pool has {(randomEffectPool?.Length ?? 0)} effects.");
+
+        for (int i = 0; i < initialBallCount; i++)
+        {
+            Vector3 reservePosition;
+            if (reserveAnchor != null)
+            {
+                // Preferred placement: line reserve balls to the right from an explicit scene anchor.
+                reservePosition = reserveAnchor.position + Vector3.right * (i * reserveBallSpacing);
+            }
+            else
+            {
+                // Fallback placement if no anchor is assigned.
+                Vector3 reserveStartWorld = _gameCamera.ViewportToWorldPoint(
+                    new Vector3(reserveStartViewport.x, reserveStartViewport.y, Mathf.Abs(_gameCamera.transform.position.z)));
+                reservePosition = reserveStartWorld + Vector3.right * (i * reserveBallSpacing);
+            }
+
+            reservePosition.z = 0f;
+
+            GameObject ballObject = Instantiate(ballPrefab, reservePosition, Quaternion.identity);
+            BallScript ball = ballObject.GetComponent<BallScript>();
+            if (ball == null)
+            {
+                Debug.LogWarning("GameManager: Spawned ballPrefab has no BallScript component.");
+                Destroy(ballObject);
+                continue;
+            }
+
+            ball.SetQueueManaged(true);
+            ball.SetPaddleReference(_paddle, ballSpawnOffset);
+
+            BallEffectDefinition effect = GetRandomEffect();
+            Debug.Log($"GameManager: Ball {i} assigned effect: {(effect != null ? effect.EffectType.ToString() : "NULL")}");
+            ball.SetEffectDefinition(effect);
+
+            ball.ParkAtPosition(reservePosition);
+            _reserveBalls.Enqueue(ball);
+        }
+
+        MoveNextQueuedBallToPaddle();
+    }
+
+    private void ResolveSceneReferences()
+    {
+        _paddle = GameObject.FindGameObjectWithTag("Paddle")?.transform;
+        if (_paddle == null)
+        {
+            PaddleScript paddleScript = FindFirstObjectByType<PaddleScript>();
+            if (paddleScript != null)
+                _paddle = paddleScript.transform;
+        }
+
+        if (_paddle == null)
+        {
+            GameObject paddleByName = GameObject.Find("Paddle");
+            if (paddleByName != null)
+                _paddle = paddleByName.transform;
+        }
+
+        _gameCamera = Camera.main;
+        if (_gameCamera == null)
+            _gameCamera = FindFirstObjectByType<Camera>();
+    }
+
+    private void MoveNextQueuedBallToPaddle()
+    {
+        while (_reserveBalls.Count > 0)
+        {
+            BallScript nextBall = _reserveBalls.Dequeue();
+            if (nextBall == null)
+                continue;
+
+            _currentQueueBall = nextBall;
+            _currentQueueBall.PrepareOnPaddle();
+            return;
+        }
+
+        ShowGameOver();
+    }
+
+    private BallEffectDefinition GetRandomEffect()
+    {
+        if (randomEffectPool == null || randomEffectPool.Length == 0)
+            return null;
+
+        int idx = Random.Range(0, randomEffectPool.Length);
+        BallEffectDefinition baseDefinition = randomEffectPool[idx];
+
+        // Apply active upgrades to the definition
+        return UpgradeManager.ApplyUpgrades(baseDefinition, _upgrades);
+    }
+
+    private void WinGame()
+    {
+        _gameWon = true;
+        Time.timeScale = 0f;
+
+        if (winScreenPrefab != null)
+            Instantiate(winScreenPrefab);
+        else
+            Debug.Log("YOU WIN! All blocks destroyed!");
+    }
+
+    private void ShowGameOver()
+    {
+        if (_gameOver || _gameWon)
+            return;
+
+        _gameOver = true;
+        Time.timeScale = 0f;
+
+        if (gameOverScreenPrefab != null)
+            Instantiate(gameOverScreenPrefab);
+        else
+            Debug.Log("GAME OVER! No balls remaining.");
+    }
+
+    #region Upgrade API
+
+    /// <summary>Get the current upgrade state (for debugging or UI display).</summary>
+    public UpgradeState GetUpgradeState() => _upgrades;
+
+    /// <summary>Increase explosive effect radius.</summary>
+    public void UpgradeExplosiveRadius(float radiusBonus)
+    {
+        _upgrades.ExplosiveRadiusBonus += radiusBonus;
+        Debug.Log($"Upgraded Explosive Radius: +{radiusBonus} (Total: +{_upgrades.ExplosiveRadiusBonus})");
+    }
+
+    /// <summary>Increase explosive damage multiplier.</summary>
+    public void UpgradeExplosiveDamage(float multiplier)
+    {
+        _upgrades.ExplosiveDamageMultiplier *= multiplier;
+        Debug.Log($"Upgraded Explosive Damage: x{multiplier} (Total: x{_upgrades.ExplosiveDamageMultiplier:F2})");
+    }
+
+    /// <summary>Increase split angle diversity.</summary>
+    public void UpgradeSplitAngle(float angleBonus)
+    {
+        _upgrades.SplitAngleBonus += angleBonus;
+        Debug.Log($"Upgraded Split Angle: +{angleBonus} (Total: +{_upgrades.SplitAngleBonus})");
+    }
+
+    /// <summary>Increase split child projectile speed.</summary>
+    public void UpgradeSplitSpeed(float multiplier)
+    {
+        _upgrades.SplitSpeedMultiplier *= multiplier;
+        Debug.Log($"Upgraded Split Speed: x{multiplier} (Total: x{_upgrades.SplitSpeedMultiplier:F2})");
+    }
+
+    /// <summary>Increase split child projectile damage.</summary>
+    public void UpgradeSplitDamage(float multiplier)
+    {
+        _upgrades.SplitDamageMultiplier *= multiplier;
+        Debug.Log($"Upgraded Split Damage: x{multiplier} (Total: x{_upgrades.SplitDamageMultiplier:F2})");
+    }
+
+    /// <summary>Increase piercing hits capacity.</summary>
+    public void UpgradePiercingHits(int hitBonus)
+    {
+        _upgrades.PiercingHitsBonus += hitBonus;
+        Debug.Log($"Upgraded Piercing Hits: +{hitBonus} (Total: +{_upgrades.PiercingHitsBonus})");
+    }
+
+    /// <summary>Increase homing turn rate (aggressiveness).</summary>
+    public void UpgradeHomingTurnRate(float multiplier)
+    {
+        _upgrades.HomingTurnRateMultiplier *= multiplier;
+        Debug.Log($"Upgraded Homing Turn Rate: x{multiplier} (Total: x{_upgrades.HomingTurnRateMultiplier:F2})");
+    }
+
+    /// <summary>Increase teleport distance per jump.</summary>
+    public void UpgradeTeleportDistance(float multiplier)
+    {
+        _upgrades.TeleportDistanceMultiplier *= multiplier;
+        Debug.Log($"Upgraded Teleport Distance: x{multiplier} (Total: x{_upgrades.TeleportDistanceMultiplier:F2})");
+    }
+
+    /// <summary>Reset all upgrades to their default values.</summary>
+    public void ResetAllUpgrades()
+    {
+        _upgrades.ResetAll();
+        Debug.Log("All upgrades reset to default values.");
+    }
+
+    #endregion
+}

+ 16 - 0
Assets/Scripts/Managers/LevelManager.cs

@@ -0,0 +1,16 @@
+using UnityEngine;
+
+public class LevelManager : MonoBehaviour
+{
+    // Start is called once before the first execution of Update after the MonoBehaviour is created
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 16 - 0
Assets/Scripts/Managers/PaddleManager.cs

@@ -0,0 +1,16 @@
+using UnityEngine;
+
+public class PaddleManager : MonoBehaviour
+{
+    // Start is called once before the first execution of Update after the MonoBehaviour is created
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 97 - 0
Assets/Scripts/PaddleScript.cs

@@ -0,0 +1,97 @@
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+[RequireComponent(typeof(Collider2D))]
+[RequireComponent(typeof(Rigidbody2D))]
+public class PaddleScript : MonoBehaviour
+{
+    [Header("Movement")]
+    [SerializeField] private float moveSpeed = 10f;
+
+    [Header("Bounds")]
+    [Tooltip("Extra gap between the paddle edge and the camera edge.")]
+    [SerializeField] private float edgePadding = 0.1f;
+
+    private float _minX;
+    private float _maxX;
+    private float _halfWidth;
+    private bool _useMouse = true;
+
+    void Awake()
+    {
+        // Paddle is player-driven via transform — kinematic prevents physics forces from interfering.
+        GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Kinematic;
+    }
+
+    void Start()
+    {
+        _halfWidth = GetComponent<Collider2D>().bounds.extents.x;
+
+        // Derive horizontal limits from the camera viewport so the paddle never leaves the screen.
+        Camera cam = Camera.main;
+        float distToCamera = Mathf.Abs(cam.transform.position.z);
+        _minX = cam.ViewportToWorldPoint(new Vector3(0f, 0f, distToCamera)).x + _halfWidth + edgePadding;
+        _maxX = cam.ViewportToWorldPoint(new Vector3(1f, 0f, distToCamera)).x - _halfWidth - edgePadding;
+    }
+
+    void Update()
+    {
+        var keyboard = Keyboard.current;
+        var mouse = Mouse.current;
+
+        float keyInput = 0f;
+        if (keyboard != null)
+        {
+            if (keyboard.aKey.isPressed || keyboard.leftArrowKey.isPressed) keyInput -= 1f;
+            if (keyboard.dKey.isPressed || keyboard.rightArrowKey.isPressed) keyInput += 1f;
+        }
+
+        // Any keyboard movement disables mouse; any mouse click re-enables mouse.
+        if (Mathf.Abs(keyInput) > 0.01f)
+            _useMouse = false;
+        else if (mouse != null && mouse.leftButton.wasPressedThisFrame)
+            _useMouse = true;
+
+        Vector3 pos = transform.position;
+
+        if (!_useMouse && Mathf.Abs(keyInput) > 0.01f)
+        {
+            // Keyboard: direct movement at moveSpeed.
+            pos.x += keyInput * moveSpeed * Time.deltaTime;
+        }
+        else if (_useMouse && mouse != null)
+        {
+            // Mouse: smoothly move toward the cursor's world X at moveSpeed.
+            Camera cam = Camera.main;
+            Vector2 mouseScreen = mouse.position.ReadValue();
+            Vector3 mouseWorld = cam.ScreenToWorldPoint(
+                new Vector3(mouseScreen.x, mouseScreen.y, Mathf.Abs(cam.transform.position.z)));
+            pos.x = Mathf.MoveTowards(pos.x, mouseWorld.x, moveSpeed * Time.deltaTime);
+        }
+
+        pos.x = Mathf.Clamp(pos.x, _minX, _maxX);
+        transform.position = pos;
+    }
+
+    private void OnCollisionEnter2D(Collision2D collision)
+    {
+        if (!collision.gameObject.CompareTag("Ball"))
+            return;
+
+        Rigidbody2D ballRb = collision.rigidbody;
+        if (ballRb == null)
+            return;
+
+        // Map hit position to [-1, 1]: -1 = left edge, 0 = centre, +1 = right edge.
+        float hitOffset = (collision.transform.position.x - transform.position.x) / _halfWidth;
+        hitOffset = Mathf.Clamp(hitOffset, -1f, 1f);
+
+        // Preserve the ball's current speed so movement effects still apply.
+        BallScript ballScript = collision.gameObject.GetComponent<BallScript>();
+        float speed = ballScript != null ? ballScript.GetCurrentSpeed() : 10f;
+
+        // A centre hit goes straight up; edge hits angle up to 75 degrees to either side.
+        float angle = hitOffset * 75f * Mathf.Deg2Rad;
+        ballRb.linearVelocity = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle)) * speed;
+    }
+}

+ 19 - 0
Assets/Scripts/ScriptableObjects/ExplosiveEffect.asset

@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6ac0477b1bd1e9a40a42952db7bef7da, type: 3}
+  m_Name: ExplosiveEffect
+  m_EditorClassIdentifier: Assembly-CSharp::ExplosiveHitEffectDefinition
+  effectType: 2
+  overlayMaterial: {fileID: 2100000, guid: ac7fe8935354aac49924a8f07098c672, type: 2}
+  radius: 1.5
+  maxDamageAtCenter: 1.5
+  minDamageAtEdge: 0.25

+ 18 - 0
Assets/Scripts/ScriptableObjects/HomingEffect.asset

@@ -0,0 +1,18 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 0fc8ce613cc4ca4499515ef8d1de6553, type: 3}
+  m_Name: HomingEffect
+  m_EditorClassIdentifier: Assembly-CSharp::HomingEffectDefinition
+  effectType: 4
+  overlayMaterial: {fileID: 0}
+  turnRateDegreesPerSecond: 120
+  retargetInterval: 0.2

+ 17 - 0
Assets/Scripts/ScriptableObjects/PiercingEffect.asset

@@ -0,0 +1,17 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: be19762114e0a7c41bd2ecc61207e715, type: 3}
+  m_Name: PiercingEffect
+  m_EditorClassIdentifier: Assembly-CSharp::PiercingEffectDefinition
+  effectType: 3
+  overlayMaterial: {fileID: 0}
+  pierceHits: 3

+ 19 - 0
Assets/Scripts/ScriptableObjects/TeleportEffect.asset

@@ -0,0 +1,19 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: b31a14ea551082245af44a63b908a86c, type: 3}
+  m_Name: TeleportEffect
+  m_EditorClassIdentifier: Assembly-CSharp::TeleportEffectDefinition
+  effectType: 5
+  overlayMaterial: {fileID: 0}
+  intervalSeconds: 2
+  teleportDistance: 1.5
+  overlapCheckRadius: 0.05

+ 21 - 0
Assets/Scripts/ScriptableObjects/TripleSplitEffect.asset

@@ -0,0 +1,21 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 0}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 2bcacc69ade1a1b45965e075e79db90e, type: 3}
+  m_Name: TripleSplitEffect
+  m_EditorClassIdentifier: Assembly-CSharp::TripleSplitEffectDefinition
+  effectType: 1
+  overlayMaterial: {fileID: 0}
+  splitOnlyOnce: 1
+  splitAngle: 20
+  childScaleMultiplier: 0.7
+  childSpeedMultiplier: 1
+  childDamageMultiplier: 0.33

+ 151 - 0
Assets/Scripts/Upgrades/UPGRADE_API_GUIDE.cs.txt

@@ -0,0 +1,151 @@
+/// UPGRADE API USAGE GUIDE
+/// 
+/// The Upgrade system allows you to modify ball effect parameters at runtime.
+/// This is perfect for progression systems, difficulty scaling, or power-ups.
+/// 
+/// HOW IT WORKS:
+/// 1. GameManager holds an UpgradeState that tracks all active upgrades
+/// 2. When a ball is assigned a random effect, the UpgradeManager applies active upgrades
+/// 3. Upgraded definitions are created as runtime copies - originals are never modified
+/// 4. Each ball spawned with upgrades active will have those upgrades applied
+/// 
+/// ========================================
+/// BASIC USAGE EXAMPLES
+/// ========================================
+/// 
+/// // Increase explosive radius by 0.5 units
+/// GameManager.Instance.UpgradeExplosiveRadius(0.5f);
+/// 
+/// // Double the explosive damage (1.0 = no change, 2.0 = double)
+/// GameManager.Instance.UpgradeExplosiveDamage(2.0f);
+/// 
+/// // Add 15 degrees to split angle
+/// GameManager.Instance.UpgradeSplitAngle(15f);
+/// 
+/// // Increase split projectile speed by 50%
+/// GameManager.Instance.UpgradeSplitSpeed(1.5f);
+/// 
+/// // Double split projectile damage
+/// GameManager.Instance.UpgradeSplitDamage(2.0f);
+/// 
+/// // Add 2 extra piercing hits
+/// GameManager.Instance.UpgradePiercingHits(2);
+/// 
+/// // Increase homing turn rate by 50%
+/// GameManager.Instance.UpgradeHomingTurnRate(1.5f);
+/// 
+/// // Triple teleport distance
+/// GameManager.Instance.UpgradeTeleportDistance(3.0f);
+/// 
+/// // Reset all upgrades back to defaults
+/// GameManager.Instance.ResetAllUpgrades();
+/// 
+/// // Get current upgrade state (for UI display or debugging)
+/// UpgradeState state = GameManager.Instance.GetUpgradeState();
+/// 
+/// ========================================
+/// UPGRADE STACKING
+/// ========================================
+/// 
+/// Additive upgrades (radius, angle, hits) stack by addition:
+/// - UpgradeExplosiveRadius(0.5f) called twice = +1.0 total
+/// 
+/// Multiplicative upgrades (damage, speed, turn rate, distance) stack by multiplication:
+/// - UpgradeSplitSpeed(1.5f) called twice = 1.5 * 1.5 = 2.25x total
+/// 
+/// ========================================
+/// UPGRADE SCOPES
+/// ========================================
+/// 
+/// Explosive Effect Upgrades:
+///   - ExplosiveRadius / ExplosiveRadiusBonus
+///   - ExplosiveDamage / ExplosiveDamageMultiplier
+/// 
+/// Triple Split Effect Upgrades:
+///   - SplitAngle / SplitAngleBonus
+///   - SplitSpeed / SplitSpeedMultiplier
+///   - SplitDamage / SplitDamageMultiplier
+/// 
+/// Piercing Effect Upgrades:
+///   - PiercingHits / PiercingHitsBonus
+/// 
+/// Homing Effect Upgrades:
+///   - HomingTurnRate / HomingTurnRateMultiplier
+/// 
+/// Teleport Effect Upgrades:
+///   - TeleportDistance / TeleportDistanceMultiplier
+/// 
+/// ========================================
+/// PRACTICAL PROGRESSION EXAMPLE
+/// ========================================
+/// 
+/// public class ProgressionManager : MonoBehaviour
+/// {
+///     private int level = 1;
+/// 
+///     public void ProgressToNextLevel()
+///     {
+///         level++;
+/// 
+///         // Scale all upgrades by level
+///         GameManager.Instance.UpgradeExplosiveRadius(level * 0.1f);
+///         GameManager.Instance.UpgradeExplosiveDamage(1.0f + (level * 0.1f));
+///         GameManager.Instance.UpgradeSplitSpeed(1.0f + (level * 0.05f));
+///         GameManager.Instance.UpgradePiercingHits(level);
+///         GameManager.Instance.UpgradeHomingTurnRate(1.0f + (level * 0.1f));
+/// 
+///         Debug.Log($"Level {level} upgrades applied!");
+///     }
+/// }
+/// 
+/// ========================================
+/// IMPLEMENTATION DETAILS
+/// ========================================
+/// 
+/// UpgradeState.cs:
+/// - Tracks all upgrade values (both additive and multiplicative)
+/// - ResetAll() method returns to defaults
+/// - ToString() provides debug output
+/// 
+/// UpgradeManager.cs (Static):
+/// - ApplyUpgrades(definition, upgrades) creates modified copies of definitions
+/// - Each effect type has its own upgrade application method
+/// - Never modifies original ScriptableObject assets - creates runtime copies only
+/// - Safely handles null inputs
+/// 
+/// GameManager.cs Changes:
+/// - Added _upgrades field initialized in Awake()
+/// - Modified GetRandomEffect() to apply upgrades via UpgradeManager
+/// - Added public methods for each upgrade type
+/// - GetUpgradeState() for external inspection
+/// - All upgrade methods emit Debug.Log for testing
+/// 
+/// ========================================
+/// NOTES FOR DEVELOPERS
+/// ========================================
+/// 
+/// • Upgrades persist across ball respawns - they apply to all future balls
+/// • Upgrade application happens in GetRandomEffect(), called when:
+///   - InitializeBallQueue() (initial 5 balls)
+///   - InitializeBallQueue() in level restart
+///   - Automatically on each new ball from queue
+/// • Multipliers use "x" notation (1.5x = 50% increase, 2.0x = 100% increase)
+/// • Bonus values are added directly (0.5 units, 15 degrees, 2 hits)
+/// • Created upgraded definitions are temporary runtime objects
+///   - They don't persist to disk
+///   - New definitions recreated each time GetRandomEffect() is called
+/// • Safe to call multiple times - values accumulate appropriately
+///
+/// ========================================
+/// DEBUG OUTPUT
+/// ========================================
+/// 
+/// Each upgrade method emits a Debug.Log showing the change and new total.
+/// Enable Debug.Log in the Console to see progression:
+/// 
+/// Example console output:
+/// -  Upgraded Explosive Radius: +0.5 (Total: +0.5)
+/// -  Upgraded Explosive Damage: x2 (Total: x2.00)
+/// -  Upgraded Split Speed: x1.5 (Total: x2.25)
+/// -  All upgrades reset to default values.
+///

+ 86 - 0
Assets/Scripts/Upgrades/UpgradeAPIDemo.cs

@@ -0,0 +1,86 @@
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+/// <summary>
+/// Example script demonstrating the Upgrade API.
+/// Attach this to a GameObject in your scene to test upgrades with keyboard input.
+/// </summary>
+public class UpgradeAPIDemo : MonoBehaviour
+{
+    void Update()
+    {
+        if (Keyboard.current == null)
+            return;
+
+        // Press 'E' to upgrade explosive radius
+        if (Keyboard.current.eKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeExplosiveRadius(0.5f);
+        }
+
+        // Press 'D' to upgrade explosive damage
+        if (Keyboard.current.dKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeExplosiveDamage(1.5f);
+        }
+
+        // Press 'S' to upgrade split angle
+        if (Keyboard.current.sKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeSplitAngle(10f);
+        }
+
+        // Press 'P' to upgrade split speed
+        if (Keyboard.current.pKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeSplitSpeed(1.5f);
+        }
+
+        // Press 'I' to upgrade piercing hits
+        if (Keyboard.current.iKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradePiercingHits(1);
+        }
+
+        // Press 'H' to upgrade homing turn rate
+        if (Keyboard.current.hKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeHomingTurnRate(1.5f);
+        }
+
+        // Press 'T' to upgrade teleport distance
+        if (Keyboard.current.tKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.UpgradeTeleportDistance(1.5f);
+        }
+
+        // Press 'R' to reset all upgrades
+        if (Keyboard.current.rKey.wasPressedThisFrame)
+        {
+            GameManager.Instance.ResetAllUpgrades();
+        }
+
+        // Press 'U' to print upgrade summary
+        if (Keyboard.current.uKey.wasPressedThisFrame)
+        {
+            UpgradeState state = GameManager.Instance.GetUpgradeState();
+            Debug.Log("=== CURRENT UPGRADES ===\n" + state.ToString());
+        }
+    }
+
+    void OnGUI()
+    {
+        GUILayout.BeginArea(new Rect(10, 10, 400, 300));
+        GUILayout.Label("UPGRADE API DEMO - Press keys to test:", new GUIStyle(GUI.skin.label) { fontSize = 14 });
+        GUILayout.Label("E - Explosive Radius (+0.5)");
+        GUILayout.Label("D - Explosive Damage (x1.5)");
+        GUILayout.Label("S - Split Angle (+10°)");
+        GUILayout.Label("P - Split Speed (x1.5)");
+        GUILayout.Label("I - Piercing Hits (+1)");
+        GUILayout.Label("H - Homing Turn Rate (x1.5)");
+        GUILayout.Label("T - Teleport Distance (x1.5)");
+        GUILayout.Label("R - Reset All Upgrades");
+        GUILayout.Label("U - Print Upgrade Summary (check Console)");
+        GUILayout.EndArea();
+    }
+}

+ 126 - 0
Assets/Scripts/Upgrades/UpgradeManager.cs

@@ -0,0 +1,126 @@
+using UnityEngine;
+
+/// <summary>
+/// Handles applying upgrades to ball effect definitions.
+/// Creates modified copies of definitions with upgrade values applied.
+/// </summary>
+public static class UpgradeManager
+{
+    /// <summary>
+    /// Apply current upgrades to a definition and return a modified version.
+    /// Creates a temporary modified definition without altering the original asset.
+    /// </summary>
+    public static BallEffectDefinition ApplyUpgrades(BallEffectDefinition definition, UpgradeState upgrades)
+    {
+        if (definition == null || upgrades == null)
+            return definition;
+
+        // Create a modified copy based on the effect type
+        switch (definition.EffectType)
+        {
+            case BallEffectType.Explosive:
+                return ApplyExplosiveUpgrades(definition as ExplosiveHitEffectDefinition, upgrades);
+
+            case BallEffectType.TripleSplit:
+                return ApplySplitUpgrades(definition as TripleSplitEffectDefinition, upgrades);
+
+            case BallEffectType.Piercing:
+                return ApplyPiercingUpgrades(definition as PiercingEffectDefinition, upgrades);
+
+            case BallEffectType.Homing:
+                return ApplyHomingUpgrades(definition as HomingEffectDefinition, upgrades);
+
+            case BallEffectType.Teleport:
+                return ApplyTeleportUpgrades(definition as TeleportEffectDefinition, upgrades);
+
+            default:
+                return definition;
+        }
+    }
+
+    private static BallEffectDefinition ApplyExplosiveUpgrades(
+        ExplosiveHitEffectDefinition original, UpgradeState upgrades)
+    {
+        if (original == null)
+            return null;
+
+        // Create a runtime copy
+        ExplosiveHitEffectDefinition upgraded = ScriptableObject.CreateInstance<ExplosiveHitEffectDefinition>();
+        upgraded.name = original.name + " (Upgraded)";
+        upgraded.CopyBaseFrom(original);
+
+        // Apply upgrades
+        upgraded.SetRadius(original.Radius + upgrades.ExplosiveRadiusBonus);
+        upgraded.SetMaxDamageAtCenter(original.MaxDamageAtCenter * upgrades.ExplosiveDamageMultiplier);
+        upgraded.SetMinDamageAtEdge(original.MinDamageAtEdge * upgrades.ExplosiveDamageMultiplier);
+
+        return upgraded;
+    }
+
+    private static BallEffectDefinition ApplySplitUpgrades(
+        TripleSplitEffectDefinition original, UpgradeState upgrades)
+    {
+        if (original == null)
+            return null;
+
+        TripleSplitEffectDefinition upgraded = ScriptableObject.CreateInstance<TripleSplitEffectDefinition>();
+        upgraded.name = original.name + " (Upgraded)";
+        upgraded.CopyBaseFrom(original);
+
+        upgraded.SetSplitOnlyOnce(original.SplitOnlyOnce);
+        upgraded.SetSplitAngle(original.SplitAngle + upgrades.SplitAngleBonus);
+        upgraded.SetChildScaleMultiplier(original.ChildScaleMultiplier);
+        upgraded.SetChildSpeedMultiplier(original.ChildSpeedMultiplier * upgrades.SplitSpeedMultiplier);
+        upgraded.SetChildDamageMultiplier(original.ChildDamageMultiplier * upgrades.SplitDamageMultiplier);
+
+        return upgraded;
+    }
+
+    private static BallEffectDefinition ApplyPiercingUpgrades(
+        PiercingEffectDefinition original, UpgradeState upgrades)
+    {
+        if (original == null)
+            return null;
+
+        PiercingEffectDefinition upgraded = ScriptableObject.CreateInstance<PiercingEffectDefinition>();
+        upgraded.name = original.name + " (Upgraded)";
+        upgraded.CopyBaseFrom(original);
+
+        upgraded.SetPierceHits(original.PierceHits + upgrades.PiercingHitsBonus);
+
+        return upgraded;
+    }
+
+    private static BallEffectDefinition ApplyHomingUpgrades(
+        HomingEffectDefinition original, UpgradeState upgrades)
+    {
+        if (original == null)
+            return null;
+
+        HomingEffectDefinition upgraded = ScriptableObject.CreateInstance<HomingEffectDefinition>();
+        upgraded.name = original.name + " (Upgraded)";
+        upgraded.CopyBaseFrom(original);
+
+        upgraded.SetTurnRateDegreesPerSecond(original.TurnRateDegreesPerSecond * upgrades.HomingTurnRateMultiplier);
+        upgraded.SetRetargetInterval(original.RetargetInterval);
+
+        return upgraded;
+    }
+
+    private static BallEffectDefinition ApplyTeleportUpgrades(
+        TeleportEffectDefinition original, UpgradeState upgrades)
+    {
+        if (original == null)
+            return null;
+
+        TeleportEffectDefinition upgraded = ScriptableObject.CreateInstance<TeleportEffectDefinition>();
+        upgraded.name = original.name + " (Upgraded)";
+        upgraded.CopyBaseFrom(original);
+
+        upgraded.SetIntervalSeconds(original.IntervalSeconds);
+        upgraded.SetTeleportDistance(original.TeleportDistance * upgrades.TeleportDistanceMultiplier);
+        upgraded.SetOverlapCheckRadius(original.OverlapCheckRadius);
+
+        return upgraded;
+    }
+}

+ 52 - 0
Assets/Scripts/Upgrades/UpgradeState.cs

@@ -0,0 +1,52 @@
+using UnityEngine;
+
+/// <summary>
+/// Tracks all active upgrades to ball effects.
+/// These upgrades are applied to effect definitions at runtime.
+/// </summary>
+public class UpgradeState
+{
+    // Explosive upgrades
+    public float ExplosiveRadiusBonus { get; set; } = 0f;
+    public float ExplosiveDamageMultiplier { get; set; } = 1f;
+
+    // Triple Split upgrades
+    public float SplitAngleBonus { get; set; } = 0f;
+    public float SplitSpeedMultiplier { get; set; } = 1f;
+    public float SplitDamageMultiplier { get; set; } = 1f;
+
+    // Piercing upgrades
+    public int PiercingHitsBonus { get; set; } = 0;
+
+    // Homing upgrades
+    public float HomingTurnRateMultiplier { get; set; } = 1f;
+
+    // Teleport upgrades
+    public float TeleportDistanceMultiplier { get; set; } = 1f;
+
+    /// <summary>Reset all upgrades to their default values.</summary>
+    public void ResetAll()
+    {
+        ExplosiveRadiusBonus = 0f;
+        ExplosiveDamageMultiplier = 1f;
+
+        SplitAngleBonus = 0f;
+        SplitSpeedMultiplier = 1f;
+        SplitDamageMultiplier = 1f;
+
+        PiercingHitsBonus = 0;
+
+        HomingTurnRateMultiplier = 1f;
+
+        TeleportDistanceMultiplier = 1f;
+    }
+
+    /// <summary>Get a string summary of current upgrades.</summary>
+    public override string ToString()
+    {
+        return $"ExplosiveRadius: +{ExplosiveRadiusBonus:F2}, Damage x{ExplosiveDamageMultiplier:F2} | " +
+               $"SplitAngle: +{SplitAngleBonus:F2}, Speed x{SplitSpeedMultiplier:F2}, Damage x{SplitDamageMultiplier:F2} | " +
+               $"Piercing: +{PiercingHitsBonus} | HomingTurn x{HomingTurnRateMultiplier:F2} | " +
+               $"TeleportDist x{TeleportDistanceMultiplier:F2}";
+    }
+}

+ 8 - 0
Assets/Scripts/WallScript.cs

@@ -0,0 +1,8 @@
+using UnityEngine;
+
+[RequireComponent(typeof(Collider2D))]
+public class WallScript : MonoBehaviour
+{
+    // Walls don't need special logic - physics handles bounciness=1 naturally.
+    // This script just ensures the wall is recognized as a collidable object.
+}

+ 121 - 0
ProjectSettings/SceneTemplateSettings.json

@@ -0,0 +1,121 @@
+{
+    "templatePinStates": [],
+    "dependencyTypeInfos": [
+        {
+            "userAdded": false,
+            "type": "UnityEngine.AnimationClip",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEditor.Animations.AnimatorController",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.AnimatorOverrideController",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEditor.Audio.AudioMixerController",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.ComputeShader",
+            "defaultInstantiationMode": 1
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Cubemap",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.GameObject",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEditor.LightingDataAsset",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.LightingSettings",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Material",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEditor.MonoScript",
+            "defaultInstantiationMode": 1
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.PhysicsMaterial",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.PhysicsMaterial2D",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Rendering.VolumeProfile",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEditor.SceneAsset",
+            "defaultInstantiationMode": 1
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Shader",
+            "defaultInstantiationMode": 1
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.ShaderVariantCollection",
+            "defaultInstantiationMode": 1
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Texture",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Texture2D",
+            "defaultInstantiationMode": 0
+        },
+        {
+            "userAdded": false,
+            "type": "UnityEngine.Timeline.TimelineAsset",
+            "defaultInstantiationMode": 0
+        }
+    ],
+    "defaultDependencyTypeInfo": {
+        "userAdded": false,
+        "type": "<default_scene_template_dependencies>",
+        "defaultInstantiationMode": 1
+    },
+    "newSceneOverride": 0
+}

+ 6 - 2
ProjectSettings/TagManager.asset

@@ -2,8 +2,10 @@
 %TAG !u! tag:unity3d.com,2011:
 --- !u!78 &1
 TagManager:
-  serializedVersion: 2
-  tags: []
+  serializedVersion: 3
+  tags:
+  - Ball
+  - Paddle
   layers:
   - Default
   - TransparentFX
@@ -41,3 +43,5 @@ TagManager:
   - name: Default
     uniqueID: 0
     locked: 0
+  m_RenderingLayers:
+  - Default