diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge.meta
new file mode 100644
index 0000000..18da0c2
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 416d1ea6815444ffb8a3c29c80bed300
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core.meta
new file mode 100644
index 0000000..18147c0
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 68232a1aab52946a1a3b45fada2ec18a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts.meta
new file mode 100644
index 0000000..34d7270
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 52ae8a57dbc464da080189c6e4a56222
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs
new file mode 100644
index 0000000..b10389b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Threading;
+using VContainer;
+using VContainer.Unity;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// Bootstrap manages the application startup and shutdown.
+ /// It utilizes dependency injection with IObjectResolver and BootstrapController to initialize and control the application flow.
+ /// The Start() method launches the bootstrap process, handling exceptions and cancellation,
+ /// while Dispose() ensures proper cleanup by cancelling ongoing operations and releasing associated resources.
+ ///
+ public class Bootstrap : IStartable, IDisposable
+ {
+ private readonly BootstrapController _bootstrapController;
+
+ private CancellationTokenSource _cancellationTokenSource = new();
+
+ public Bootstrap(BootstrapController bootstrapController)
+ {
+ _bootstrapController = bootstrapController;
+ }
+
+ public void Start()
+ {
+ try
+ {
+ _bootstrapController.LaunchTree(_cancellationTokenSource.Token);
+ }
+ catch (OperationCanceledException)
+ {
+ }
+ catch (Exception exception)
+ {
+ UnityEngine.Debug.LogError($"Can't start bootstrap controller {exception}");
+ }
+ }
+
+ public void Dispose()
+ {
+ _cancellationTokenSource?.Cancel();
+ _cancellationTokenSource?.Dispose();
+
+ _cancellationTokenSource = null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs.meta
new file mode 100644
index 0000000..e22c42f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/Bootstrap.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e0161f1eadaf2403983bd19224bcb1dc
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs
new file mode 100644
index 0000000..e29bdeb
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs
@@ -0,0 +1,32 @@
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// BootstrapController extends RootController to manage the initialization flow of the application.
+ /// It asynchronously starts a game loop by repeatedly executing GameLoopController instances until cancellation is requested.
+ ///
+ public class BootstrapController : RootController
+ {
+ public BootstrapController(IControllerFactory controllerFactory)
+ : base(controllerFactory)
+ {
+ }
+
+ protected override void OnStart()
+ {
+ FlowAsync().Forget();
+
+ base.OnStart();
+ }
+
+ private async UniTask FlowAsync()
+ {
+ while (!CancellationToken.IsCancellationRequested)
+ {
+ await ExecuteAndWaitResultAsync(CancellationToken);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs.meta
new file mode 100644
index 0000000..7e1ff61
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/BootstrapController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4ccf7084eb21c4430a83aa39ce69c38d
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs
new file mode 100644
index 0000000..bf325c8
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs
@@ -0,0 +1,27 @@
+using Playtika.Controllers;
+using VContainer;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// The ControllerFactory class implements the IControllerFactory interface to facilitate the creation
+ /// of controllers using a project-specific Dependency Injection (DI) container.
+ /// It utilizes an IObjectResolver instance to resolve and instantiate controllers of type T
+ /// that implement theIController interface.
+ ///
+ public class ControllerFactory : IControllerFactory
+ {
+ private readonly IObjectResolver _container;
+
+ public ControllerFactory(IObjectResolver container)
+ {
+ _container = container;
+ }
+
+ public IController Create() where T : class, IController
+ {
+ var controller = _container.Resolve();
+ return controller;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs.meta
new file mode 100644
index 0000000..4e34906
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Core/Scripts/ControllerFactory.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ebbf07b3db05345d3a728dad5def6444
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions.meta
new file mode 100644
index 0000000..3196b87
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f817e6aeff9ff43bfa90b9bd9a11b9b8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs
new file mode 100644
index 0000000..48955ef
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs
@@ -0,0 +1,29 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// AnimationExtensions is a static class providing extension methods for Unity's Animation class.
+ ///
+ public static class AnimationExtensions
+ {
+ public static async UniTask PlayAsync(
+ this Animation animationComponent,
+ string animationName,
+ CancellationToken cancellationToken)
+ {
+ animationComponent.Play(animationName);
+
+ while (animationComponent.isPlaying)
+ {
+ await UniTask.Yield();
+ if (cancellationToken.IsCancellationRequested)
+ {
+ return;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs.meta
new file mode 100644
index 0000000..9444ed5
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/AnimationExtensions.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ad1ff2648db964e40aee4e1dbed4abd8
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs
new file mode 100644
index 0000000..446f6ae
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// TransformExtensions is a static class providing extension methods for Unity's Transform class.
+ ///
+ public static class TransformExtensions
+ {
+ public static void Clear(this Transform transform)
+ {
+ foreach (Transform child in transform)
+ {
+ Object.Destroy(child.gameObject);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs.meta
new file mode 100644
index 0000000..4213d7f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Extensions/TransformExtensions.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b1a7dcf361f0c4a2c908d7e7dd2e1975
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features.meta
new file mode 100644
index 0000000..84e8770
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d628a32f8247c4f6e9b0a50a5256c858
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core.meta
new file mode 100644
index 0000000..6f47296
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 206845a57cc544d47a1b1803ea790a64
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content.meta
new file mode 100644
index 0000000..d3f8296
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 20c0b5dcd14754c578e341608d3f0ce7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs.meta
new file mode 100644
index 0000000..787ede7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 129873eb174c14c49b5f100725d88f02
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab
new file mode 100644
index 0000000..7954c95
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab
@@ -0,0 +1,367 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3416476144409564023
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2834930602603086173}
+ - component: {fileID: 762718665078696411}
+ m_Layer: 0
+ m_Name: GameView
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2834930602603086173
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3416476144409564023}
+ 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:
+ - {fileID: 5574186762765090946}
+ - {fileID: 3856725467951578555}
+ - {fileID: 3931415572381285410}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &762718665078696411
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3416476144409564023}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: aae241492282e463aa9efe7e1b975bca, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _uiView: {fileID: 6031414337601235818}
+ _environmentView: {fileID: 202299718362985399}
+--- !u!1 &6742139274365203074
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5574186762765090946}
+ - component: {fileID: 619709263342993081}
+ - component: {fileID: 4590504191315451929}
+ - component: {fileID: 5378120720439223703}
+ - component: {fileID: 9005925040059610026}
+ m_Layer: 0
+ m_Name: Camera
+ m_TagString: MainCamera
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5574186762765090946
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6742139274365203074}
+ 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: 2834930602603086173}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!20 &619709263342993081
+Camera:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6742139274365203074}
+ m_Enabled: 1
+ serializedVersion: 2
+ m_ClearFlags: 1
+ m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
+ m_projectionMatrixMode: 1
+ m_GateFitMode: 2
+ m_FOVAxisMode: 0
+ m_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_NormalizedViewPortRect:
+ serializedVersion: 2
+ x: 0
+ y: 0
+ width: 1
+ height: 1
+ near clip plane: 0.3
+ far clip plane: 500
+ field of view: 40
+ orthographic: 1
+ orthographic size: 10
+ m_Depth: 0
+ m_CullingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_RenderingPath: -1
+ m_TargetTexture: {fileID: 0}
+ m_TargetDisplay: 0
+ m_TargetEye: 3
+ m_HDR: 1
+ m_AllowMSAA: 1
+ m_AllowDynamicResolution: 0
+ m_ForceIntoRT: 0
+ m_OcclusionCulling: 1
+ m_StereoConvergence: 10
+ m_StereoSeparation: 0.022
+--- !u!81 &4590504191315451929
+AudioListener:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6742139274365203074}
+ m_Enabled: 1
+--- !u!114 &5378120720439223703
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6742139274365203074}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_RenderShadows: 1
+ m_RequiresDepthTextureOption: 2
+ m_RequiresOpaqueTextureOption: 2
+ m_CameraType: 0
+ m_Cameras: []
+ m_RendererIndex: -1
+ m_VolumeLayerMask:
+ serializedVersion: 2
+ m_Bits: 1
+ m_VolumeTrigger: {fileID: 0}
+ m_VolumeFrameworkUpdateModeOption: 2
+ m_RenderPostProcessing: 0
+ m_Antialiasing: 0
+ m_AntialiasingQuality: 2
+ m_StopNaN: 0
+ 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_Version: 2
+ m_TaaSettings:
+ quality: 3
+ frameInfluence: 0.1
+ jitterScale: 1
+ mipBias: 0
+ varianceClampScale: 0.9
+ contrastAdaptiveSharpening: 0
+--- !u!114 &9005925040059610026
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6742139274365203074}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 56666c5a40171f54783dd416a44f42bf, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_EventMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_MaxRayIntersections: 0
+--- !u!1001 &776456903411656676
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 2834930602603086173}
+ m_Modifications:
+ - target: {fileID: 2813183336786420558, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_Name
+ value: UI
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6081273471566441561, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ propertyPath: m_Camera
+ value:
+ objectReference: {fileID: 619709263342993081}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+--- !u!4 &3856725467951578555 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 4558575284159568479, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ m_PrefabInstance: {fileID: 776456903411656676}
+ m_PrefabAsset: {fileID: 0}
+--- !u!114 &6031414337601235818 stripped
+MonoBehaviour:
+ m_CorrespondingSourceObject: {fileID: 6446168473523129486, guid: a0834be56fd764d10a01d4cdc187508d, type: 3}
+ m_PrefabInstance: {fileID: 776456903411656676}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6815a37090d984807b4af832ec46765e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1001 &8760390860080584794
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 2834930602603086173}
+ m_Modifications:
+ - target: {fileID: 4565990845173853492, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_Name
+ value: Environment
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 10
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 8889436711453551597, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: _spawnArea.x
+ value: -3.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 8889436711453551597, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: _spawnArea.y
+ value: 3.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 9106004284044335196, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 5.4
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+--- !u!114 &202299718362985399 stripped
+MonoBehaviour:
+ m_CorrespondingSourceObject: {fileID: 8889436711453551597, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ m_PrefabInstance: {fileID: 8760390860080584794}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4cd7eaebb53be4192951d0258755683a, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!4 &3931415572381285410 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 5700458375433102456, guid: 31b62b6da850f443a8ad687d5f88ccc5, type: 3}
+ m_PrefabInstance: {fileID: 8760390860080584794}
+ m_PrefabAsset: {fileID: 0}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab.meta
new file mode 100644
index 0000000..ee30037
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Content/Prefabs/GameView.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c86c4274b83dd415389c40df57c6f2df
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts.meta
new file mode 100644
index 0000000..e866ec0
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 997e77a7345514fe7a8883599c4db53e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs
new file mode 100644
index 0000000..eb95ade
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameConfiguration is a ScriptableObject used to define game settings related to fruit collection.
+ /// This class allows flexible adjustment of game parameters through the Unity Editor's Inspector,
+ /// providing essential configuration options for gameplay mechanics related to fruit collection.
+ ///
+ [CreateAssetMenu(fileName = "GameConfiguration", menuName = "Scriptable Objects/Game Configuration")]
+ public class GameConfiguration : ScriptableObject
+ {
+ [Range(2, 4)]
+ public int FruitCopyCollectAmount = 3;
+
+ [Range(3, 6)]
+ public int MaxFruitsCollectedCount = 6;
+
+ [Range(10, 50)]
+ public int InitialFruitsCount = 40;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs.meta
new file mode 100644
index 0000000..ac53a5c
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameConfiguration.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 55b73d944563401787d41762940cbdc1
+timeCreated: 1718548448
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs
new file mode 100644
index 0000000..372f296
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs
@@ -0,0 +1,31 @@
+using System;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// The GameEventsModel class implements both IGameEventsModel and IGameEventsRequestsModel interfaces.
+ /// This class serves as a centralized model for managing and signaling game events,
+ /// facilitating interaction and synchronization between different game components.
+ ///
+ public class GameEventsModel : IGameEventsModel, IGameEventsRequestsModel
+ {
+ public event Action Win;
+ public event Action Lose;
+ public event Action RestartRequested;
+
+ public void RequestWin()
+ {
+ Win?.Invoke();
+ }
+
+ public void RequestLose()
+ {
+ Lose?.Invoke();
+ }
+
+ public void RequestRestart()
+ {
+ RestartRequested?.Invoke();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs.meta
new file mode 100644
index 0000000..639ae00
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameEventsModel.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 84e3603384d14b8e88525060ae95f49c
+timeCreated: 1718714235
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs
new file mode 100644
index 0000000..6ca3d0f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs
@@ -0,0 +1,53 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameLoopController extends ControllerWithResultBase to manage a game loop asynchronously.
+ /// It initializes a GameModel and handles restart requests using a UniTaskCompletionSource.
+ /// The controller starts and stops related controllers (GameUIController and GameEnvironmentController).
+ /// It awaits restart signals via _gameModel.RestartRequested and completes the loop upon confirmation,
+ /// ensuring orderly flow with Complete().
+ ///
+ public class GameLoopController : ControllerWithResultBase
+ {
+ private readonly GameModel _gameModel;
+ private readonly IGameEventsModel _gameEventsModel;
+
+ public GameLoopController(
+ IControllerFactory controllerFactory,
+ GameModel gameModel,
+ IGameEventsModel gameEventsModel)
+ : base(controllerFactory)
+ {
+ _gameModel = gameModel;
+ _gameEventsModel = gameEventsModel;
+ }
+
+ protected override void OnStart()
+ {
+ _gameEventsModel.RestartRequested += OnRestartRequested;
+ }
+
+ protected override void OnStop()
+ {
+ _gameEventsModel.RestartRequested -= OnRestartRequested;
+ }
+
+ protected override async UniTask OnFlowAsync(CancellationToken cancellationToken)
+ {
+ await _gameModel.InitializeAsync(cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ Execute();
+ ExecuteAndWaitResultAsync(CancellationToken).Forget();
+ }
+
+ private void OnRestartRequested()
+ {
+ Complete();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs.meta
new file mode 100644
index 0000000..afcd4ca
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameLoopController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 571a2237c0344b1ea270033097dbb1db
+timeCreated: 1718631878
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs
new file mode 100644
index 0000000..e66b446
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using Cysharp.Threading.Tasks;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameModel manages game logic related to fruit collection and events in a game.
+ /// This class orchestrates the game mechanics related to fruit collection, including managing events and
+ /// checking game conditions based on configured rules, enhancing gameplay logic and event handling within
+ /// a game environment.
+ ///
+ public class GameModel
+ {
+ public event Action FruitAddedToList;
+ public event Action> FruitsRemovedFromList;
+
+ public GameConfiguration GameConfiguration { get; private set; }
+ public int FruitsOnBoardCount { get; private set; }
+
+ private readonly ResourcesProvider _resourcesProvider;
+ private readonly IGameEventsRequestsModel _eventRequestsModel;
+
+ private FruitData[] _fruitsCollected;
+
+ public GameModel(ResourcesProvider resourcesProvider,
+ IGameEventsRequestsModel eventRequestsModel)
+ {
+ _resourcesProvider = resourcesProvider;
+ _eventRequestsModel = eventRequestsModel;
+ }
+
+ public async UniTask InitializeAsync(CancellationToken cancellationToken)
+ {
+ GameConfiguration = await _resourcesProvider.LoadAsync("GameConfiguration", cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ _fruitsCollected = new FruitData[GameConfiguration.MaxFruitsCollectedCount];
+ FruitsOnBoardCount = GameConfiguration.InitialFruitsCount - GameConfiguration.InitialFruitsCount %
+ GameConfiguration.FruitCopyCollectAmount;
+ }
+
+ public void RequestFruitRemove(FruitData data)
+ {
+ AddToList(data);
+ FruitsOnBoardCount--;
+
+ CheckForCopiesCollected();
+
+ if (IsFruitBoardEmpty())
+ {
+ _eventRequestsModel.RequestWin();
+ }
+ else if (IsFruitLineFilled())
+ {
+ _eventRequestsModel.RequestLose();
+ }
+ }
+
+ public bool IsFruitBoardEmpty()
+ {
+ return FruitsOnBoardCount <= 0;
+ }
+
+ public bool IsFruitLineFilled()
+ {
+ return _fruitsCollected.All(x => x != null);
+ }
+
+ private void CheckForCopiesCollected()
+ {
+ var duplicates = _fruitsCollected
+ .Where(x => x != null)
+ .GroupBy(x => x)
+ .Where(g => g.Count() >= GameConfiguration.FruitCopyCollectAmount)
+ .Select(g => g.Key);
+ var array = duplicates as FruitData[] ?? duplicates.ToArray();
+ if (array.Any())
+ {
+ var removedIndexes = new List(GameConfiguration.FruitCopyCollectAmount);
+ for (var i = 0; i < GameConfiguration.FruitCopyCollectAmount; i++)
+ {
+ var index = RemoveFromList(array[0]);
+ removedIndexes.Add(index);
+ }
+
+ FruitsRemovedFromList?.Invoke(removedIndexes);
+ }
+ }
+
+ private void AddToList(FruitData data)
+ {
+ var firstEmptyIndex = Array.IndexOf(_fruitsCollected, null);
+ _fruitsCollected[firstEmptyIndex] = data;
+
+ FruitAddedToList?.Invoke(firstEmptyIndex, data);
+ }
+
+ private int RemoveFromList(FruitData data)
+ {
+ var index = Array.IndexOf(_fruitsCollected, data);
+ _fruitsCollected[index] = null;
+
+ return index;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs.meta
new file mode 100644
index 0000000..16a74bc
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameModel.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ddc446e062e548efa15f07ce8b03dca9
+timeCreated: 1713022776
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs
new file mode 100644
index 0000000..5cff8a1
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ public class GameStateModel
+ {
+ public event Action FruitAddedToList;
+ public event Action> FruitsRemovedFromList;
+
+ public GameConfiguration GameConfiguration { get; }
+ public int FruitsOnBoardCount { get; private set; }
+
+ private FruitData[] _fruitsCollected;
+
+ public GameStateModel()
+ {
+ GameConfiguration = Resources.Load("GameConfiguration");
+ }
+
+ public void Initialize()
+ {
+ _fruitsCollected = new FruitData[GameConfiguration.MaxFruitsCollectedCount];
+ FruitsOnBoardCount = GameConfiguration.InitialFruitsCount - GameConfiguration.InitialFruitsCount %
+ GameConfiguration.FruitCopyCollectAmount;
+ }
+
+ public void RequestFruitRemove(FruitData data)
+ {
+ AddToList(data);
+ FruitsOnBoardCount--;
+
+ CheckForCopiesCollected();
+ }
+
+ public bool IsFruitBoardEmpty()
+ {
+ return FruitsOnBoardCount <= 0;
+ }
+
+ public bool IsFruitLineFilled()
+ {
+ return _fruitsCollected.All(x => x != null);
+ }
+
+ private void CheckForCopiesCollected()
+ {
+ var duplicates = _fruitsCollected
+ .Where(x => x != null)
+ .GroupBy(x => x)
+ .Where(g => g.Count() >= GameConfiguration.FruitCopyCollectAmount)
+ .Select(g => g.Key);
+ var array = duplicates as FruitData[] ?? duplicates.ToArray();
+ if (array.Any())
+ {
+ var removedIndexes = new List(GameConfiguration.FruitCopyCollectAmount);
+ for (var i = 0; i < GameConfiguration.FruitCopyCollectAmount; i++)
+ {
+ var index = RemoveFromList(array[0]);
+ removedIndexes.Add(index);
+ }
+
+ FruitsRemovedFromList?.Invoke(removedIndexes);
+ }
+ }
+
+ private void AddToList(FruitData data)
+ {
+ var firstEmptyIndex = Array.IndexOf(_fruitsCollected, null);
+ _fruitsCollected[firstEmptyIndex] = data;
+
+ FruitAddedToList?.Invoke(firstEmptyIndex, data);
+ }
+
+ private int RemoveFromList(FruitData data)
+ {
+ var index = Array.IndexOf(_fruitsCollected, data);
+ _fruitsCollected[index] = null;
+
+ return index;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs.meta
new file mode 100644
index 0000000..179f71f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameStateModel.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 796350c8bf984b478351ebd76b6408a4
+timeCreated: 1718714306
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs
new file mode 100644
index 0000000..cdd7c48
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameView is a MonoBehaviour representing the main game view in the Unity engine.
+ /// It provides access to UiView and EnvironmentView, which are serialized references to GameUIView and
+ /// GameEnvironmentView components, respectively. This class acts as a bridge for accessing and manipulating
+ /// UI and environment elements within the game scene.
+ ///
+ public class GameView : MonoBehaviour
+ {
+ public GameUIView UiView => _uiView;
+ public GameEnvironmentView EnvironmentView => _environmentView;
+
+ [SerializeField]
+ private GameUIView _uiView;
+
+ [SerializeField]
+ private GameEnvironmentView _environmentView;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs.meta
new file mode 100644
index 0000000..20ecb40
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/GameVIew.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aae241492282e463aa9efe7e1b975bca
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs
new file mode 100644
index 0000000..e0aad0b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// IGameEventsModel defines events representing game events such as winning, losing, and restart requests.
+ /// This interface serves as a contract for components that need to subscribe to or invoke these game events,
+ /// providing a structured approach to handle game state transitions and actions in a game development context.
+ ///
+ public interface IGameEventsModel
+ {
+ public event Action Win;
+ public event Action Lose;
+ public event Action RestartRequested;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs.meta
new file mode 100644
index 0000000..573edd0
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsModel.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: cd702d44ade14914b146153d99fa1fbc
+timeCreated: 1718716391
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs
new file mode 100644
index 0000000..a4718e4
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs
@@ -0,0 +1,14 @@
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// IGameEventsRequestsModel defines methods for requesting game events related to game outcomes and restart functionality.
+ /// This interface abstracts the interaction with game events related to game outcomes and restart operations, allowing
+ /// for flexible implementation in game logic components.
+ ///
+ public interface IGameEventsRequestsModel
+ {
+ void RequestWin();
+ void RequestLose();
+ void RequestRestart();
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs.meta
new file mode 100644
index 0000000..0e9538a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/IGameEventsRequestsModel.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ca30d2394c7248869b7f214d7a68ad49
+timeCreated: 1718716398
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs
new file mode 100644
index 0000000..8d369d1
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs
@@ -0,0 +1,19 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// This class simplifies the process of loading resources asynchronously in Unity, enhancing flexibility
+ /// and performance in resource management tasks within game development.
+ ///
+ public class ResourcesProvider
+ {
+ public async UniTask LoadAsync(string resourceId, CancellationToken cancellationToken) where T : Object
+ {
+ var result = await Resources.LoadAsync(resourceId).WithCancellation(cancellationToken);
+ return result as T;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs.meta
new file mode 100644
index 0000000..d9eafd8
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/ResourcesProvider.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f1c76537c4874c1d9b32e2a3c769a129
+timeCreated: 1718710885
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs
new file mode 100644
index 0000000..0e74e34
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs
@@ -0,0 +1,43 @@
+using Playtika.Controllers;
+using UnityEngine;
+using VContainer;
+using VContainer.Unity;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// RootLifetimeScope sets up the DI container for the game application, configuring essential components such as
+ /// the entry point (Bootstrap), controllers, and services. This setup ensures efficient dependency management and lifecycle handling during gameplay.
+ ///
+ public class RootLifetimeScope : LifetimeScope
+ {
+ [SerializeField]
+ private GameView _gameView;
+
+ protected override void Configure(IContainerBuilder builder)
+ {
+ builder.RegisterEntryPoint();
+ builder.Register(Lifetime.Scoped);
+ builder.Register(Lifetime.Transient);
+ builder.Register(Lifetime.Transient);
+
+ builder.RegisterInstance(_gameView.EnvironmentView);
+ builder.RegisterInstance(_gameView.UiView);
+ builder.RegisterInstance(_gameView.UiView.CollectedFruitsView);
+
+ builder.Register(Lifetime.Singleton);
+ builder.Register(Lifetime.Singleton);
+
+ builder.Register(Lifetime.Transient);
+ builder.Register(Lifetime.Transient);
+
+ builder.Register(Lifetime.Transient);
+ builder.Register(Lifetime.Transient);
+ builder.Register(Lifetime.Transient);
+
+ builder.Register(Lifetime.Singleton);
+ builder.Register(Lifetime.Singleton);
+ builder.Register(Lifetime.Singleton);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs.meta
new file mode 100644
index 0000000..37302d9
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Core/Scripts/RootLifetimeScope.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9e7ad20ae2d7440c6b3e2e99ab49e651
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment.meta
new file mode 100644
index 0000000..ee107b4
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5157d60c4a3444294998825bcde94fff
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core.meta
new file mode 100644
index 0000000..4a570a8
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4690ef7357487472fb9acf7bd030293a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content.meta
new file mode 100644
index 0000000..fe296e3
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e53bdf7f7068141e58148b7c1cc3ef1c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials.meta
new file mode 100644
index 0000000..0e6510f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d94b43b78db2a43508bbfc85f1521b30
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat
new file mode 100644
index 0000000..c4c7839
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat
@@ -0,0 +1,56 @@
+%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: BackgroundGradient_Mateiral
+ m_Shader: {fileID: 4800000, guid: ca7d927c60b9d462084d2ca005255890, 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: {}
+ disabledShaderPasses: []
+ 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}
+ - _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}
+ - _NormalMap:
+ m_Texture: {fileID: 0}
+ m_Scale: {x: 1, y: 1}
+ m_Offset: {x: 0, y: 0}
+ m_Ints: []
+ m_Floats:
+ - _BlendDst: 0
+ - _BlendOption: 1
+ - _BlendSrc: 1
+ - _EnableExternalAlpha: 0
+ - _GradientWidth: 0.58
+ - _TransitionPosition: 0.5
+ m_Colors:
+ - _Color: {r: 1, g: 1, b: 1, a: 1}
+ - _FirstColor: {r: 0.13955146, g: 0.3301887, b: 0.09189214, a: 1}
+ - _Flip: {r: 1, g: 1, b: 1, a: 1}
+ - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+ - _SecondColor: {r: 0.18431373, g: 0.43529412, b: 0.12156863, a: 1}
+ m_BuildTextureStacks: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat.meta
new file mode 100644
index 0000000..09532ca
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundGradient_Mateiral.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d139320e25a4b4b8f9787eb2c8613118
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat
new file mode 100644
index 0000000..358b59a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat
@@ -0,0 +1,51 @@
+%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: BackgroundScrolling_Material
+ m_Shader: {fileID: 4800000, guid: b62bf4f62333045a38793f9915535fc6, 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: {}
+ disabledShaderPasses: []
+ 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}
+ - _MainTex:
+ m_Texture: {fileID: 2800000, guid: 614c6d75c326d40769cd6a55104e5337, type: 3}
+ m_Scale: {x: 12, y: 12}
+ m_Offset: {x: 0, y: 0}
+ - _MaskTex:
+ 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}
+ m_Ints: []
+ m_Floats:
+ - PixelSnap: 0
+ - _EnableExternalAlpha: 0
+ m_Colors:
+ - _Color: {r: 0.12423483, g: 0.3018868, b: 0.081167676, a: 0.34901962}
+ - _Flip: {r: 1, g: 1, b: 1, a: 1}
+ - _RendererColor: {r: 1, g: 1, b: 1, a: 1}
+ - _ScrollSpeed: {r: -0.7, g: -0.7, b: 0, a: 0}
+ m_BuildTextureStacks: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat.meta
new file mode 100644
index 0000000..50f3d4b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Materials/BackgroundScrolling_Material.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4d54c33af42364be99d70412cb85dad8
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 2100000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs.meta
new file mode 100644
index 0000000..a15f16b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ee5feabb2d51a4165825bccb493a90b0
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab
new file mode 100644
index 0000000..1938879
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab
@@ -0,0 +1,589 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &87948775376500468
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3506334176229297303}
+ - component: {fileID: 6893018872755218867}
+ m_Layer: 0
+ m_Name: Background_Scroll
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3506334176229297303
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 87948775376500468}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.25, z: 0}
+ m_LocalScale: {x: 5, y: 5, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4234202924687734341}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &6893018872755218867
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 87948775376500468}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 4d54c33af42364be99d70412cb85dad8, 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: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -9
+ m_Sprite: {fileID: 21300000, guid: 1d3a296bee6d04635be34a52a9b077c9, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 2.1333334, y: 2.1333334}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
+--- !u!1 &1814270975358824151
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1117964864814981896}
+ - component: {fileID: 8925153896998742868}
+ m_Layer: 0
+ m_Name: Lines
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1117964864814981896
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1814270975358824151}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: -0.09000003, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4234202924687734341}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &8925153896998742868
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1814270975358824151}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ 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: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -1
+ m_Sprite: {fileID: 21300000, guid: 8ce04c396f40d41cbb898247b7c5f8a4, type: 3}
+ m_Color: {r: 1, g: 0.7411765, b: 0, a: 1}
+ m_FlipX: 1
+ m_FlipY: 0
+ m_DrawMode: 1
+ m_Size: {x: 9.1, y: 12}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
+--- !u!1 &4565990845173853492
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5700458375433102456}
+ - component: {fileID: 8889436711453551597}
+ m_Layer: 0
+ m_Name: Environment
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5700458375433102456
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4565990845173853492}
+ 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:
+ - {fileID: 9106004284044335196}
+ - {fileID: 9033223585654839396}
+ - {fileID: 4234202924687734341}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8889436711453551597
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4565990845173853492}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4cd7eaebb53be4192951d0258755683a, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _container: {fileID: 9106004284044335196}
+--- !u!1 &6244561824465933737
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 9106004284044335196}
+ m_Layer: 0
+ m_Name: Container
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &9106004284044335196
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6244561824465933737}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: -1.14, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5700458375433102456}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &6854971445741423484
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 9033223585654839396}
+ - component: {fileID: 7409062187526535040}
+ m_Layer: 0
+ m_Name: Colliders
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &9033223585654839396
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6854971445741423484}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: -7.14, z: 0}
+ m_LocalScale: {x: 2.5, y: 2.5, z: 2.5}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 5700458375433102456}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!60 &7409062187526535040
+PolygonCollider2D:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6854971445741423484}
+ m_Enabled: 1
+ 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_UsedByComposite: 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_Points:
+ m_Paths:
+ - - {x: -2.25, y: 0}
+ - {x: -2.25, y: 5}
+ - {x: -1.75, y: 5}
+ - {x: -1.75, y: 0.5}
+ - {x: 1.75, y: 0.5}
+ - {x: 1.75, y: 5}
+ - {x: 2.25, y: 5}
+ - {x: 2.25, y: 0}
+ m_UseDelaunayMesh: 0
+--- !u!1 &7016895734831185152
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8544632373735416826}
+ - component: {fileID: 3850252124339651768}
+ - component: {fileID: 2625600387000873097}
+ m_Layer: 0
+ m_Name: Background_Gradient
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8544632373735416826
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7016895734831185152}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0, y: 0.25, z: 0}
+ m_LocalScale: {x: 30, y: 30, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4234202924687734341}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &3850252124339651768
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7016895734831185152}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: d139320e25a4b4b8f9787eb2c8613118, 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: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -10
+ m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 1, y: 1}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
+--- !u!331 &2625600387000873097
+SpriteMask:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7016895734831185152}
+ 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: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 3
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_Sprite: {fileID: 0}
+ m_MaskAlphaCutoff: 0.2
+ m_FrontSortingLayerID: 0
+ m_BackSortingLayerID: 0
+ m_FrontSortingLayer: 0
+ m_BackSortingLayer: 0
+ m_FrontSortingOrder: 0
+ m_BackSortingOrder: 0
+ m_IsCustomRangeActive: 0
+ m_SpriteSortPoint: 0
+--- !u!1 &7829567953633308085
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4234202924687734341}
+ m_Layer: 0
+ m_Name: Decorations
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4234202924687734341
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7829567953633308085}
+ 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:
+ - {fileID: 1117964864814981896}
+ - {fileID: 4495376406130920465}
+ - {fileID: 3506334176229297303}
+ - {fileID: 8544632373735416826}
+ m_Father: {fileID: 5700458375433102456}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &9033946438786394551
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4495376406130920465}
+ - component: {fileID: 2193821982121631248}
+ m_Layer: 0
+ m_Name: Background_Dark
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4495376406130920465
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9033946438786394551}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: -0.06, z: 0}
+ m_LocalScale: {x: 9, y: 11.82, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 4234202924687734341}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &2193821982121631248
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9033946438786394551}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ 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: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: -2
+ m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.2}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 1, y: 1}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab.meta
new file mode 100644
index 0000000..beefb87
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Prefabs/Environment.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 31b62b6da850f443a8ad687d5f88ccc5
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites.meta
new file mode 100644
index 0000000..b4df541
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a5cce22890dde419c8a0ef88ccc56dba
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png
new file mode 100644
index 0000000..8d1e042
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png.meta
new file mode 100644
index 0000000..43d2fbc
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Lines.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 8ce04c396f40d41cbb898247b7c5f8a4
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 0
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 150
+ spriteBorder: {x: 60, y: 60, z: 60, w: 60}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png
new file mode 100644
index 0000000..0b853d3
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png.meta
new file mode 100644
index 0000000..afc15cb
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Content/Sprites/Pattern.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 1d3a296bee6d04635be34a52a9b077c9
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 0
+ wrapV: 0
+ wrapW: 0
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 0
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 30
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources.meta
new file mode 100644
index 0000000..20a5ad6
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a17381eb12fb24c05a10da7731983613
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.asset
new file mode 100644
index 0000000..072803a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.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: 55b73d944563401787d41762940cbdc1, type: 3}
+ m_Name: GameConfiguration
+ m_EditorClassIdentifier:
+ FruitCopyCollectAmount: 3
+ MaxFruitsCollectedCount: 6
+ InitialFruitsCount: 40
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.asset.meta
new file mode 100644
index 0000000..e6f0cb7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Resources/GameConfiguration.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7f0d7ecc89bc148bdb733712ef5585ca
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts.meta
new file mode 100644
index 0000000..e23bd17
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: baee60f22fd24428da79c53b72c60ec1
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs
new file mode 100644
index 0000000..a613bbe
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs
@@ -0,0 +1,66 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameEnvironmentController manages the game environment setup using GameEnvironmentView and GameModel.
+ /// Initialization involves populating the environment with fruits based on configuration and randomizing their order.
+ /// It asynchronously initializes each fruit using FruitBoardController instances.
+ ///
+ public class GameEnvironmentController : ControllerWithResultBase
+ {
+ private readonly GameModel _gameModel;
+ private readonly ResourcesProvider _resourcesProvider;
+ private readonly GameEnvironmentView _environmentView;
+
+ public GameEnvironmentController(
+ IControllerFactory controllerFactory,
+ GameModel gameModel,
+ ResourcesProvider resourcesProvider,
+ GameEnvironmentView environmentView)
+ : base(controllerFactory)
+ {
+ _gameModel = gameModel;
+ _resourcesProvider = resourcesProvider;
+ _environmentView = environmentView;
+ }
+
+ protected override UniTask OnFlowAsync(CancellationToken cancellationToken)
+ {
+ return InitializeBoard(cancellationToken);
+ }
+
+ private async UniTask InitializeBoard(CancellationToken cancellationToken)
+ {
+ _environmentView.Container.Clear();
+
+ var fruitCollection = await _resourcesProvider.LoadAsync("FruitsCollection", cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var fruitsList = new List(_gameModel.FruitsOnBoardCount);
+ for (var i = 0; i < _gameModel.FruitsOnBoardCount; i++)
+ {
+ var index = (int)Mathf.Repeat(i / _gameModel.GameConfiguration.FruitCopyCollectAmount,
+ fruitCollection.List.Count);
+ fruitsList.Add(fruitCollection.List[index]);
+ }
+
+ var random = new System.Random();
+ fruitsList = fruitsList.OrderBy(x => random.Next()).ToList();
+
+ foreach (var fruitData in fruitsList)
+ {
+ var args = new FruitBoardControllerArgs(fruitData);
+ ExecuteAndWaitResultAsync(args, CancellationToken)
+ .Forget();
+
+ await UniTask.WaitForSeconds(0.1f, cancellationToken: cancellationToken);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs.meta
new file mode 100644
index 0000000..c7080b2
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 5361c872a2794f39ae1769f5953f4877
+timeCreated: 1713026863
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs
new file mode 100644
index 0000000..fb1adab
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameEnvironmentView, a MonoBehaviour, represents the view component managing the game environment within the Unity scene.
+ ///
+ public class GameEnvironmentView : MonoBehaviour
+ {
+ public Transform Container => _container;
+ public Vector2 SpawnArea => _spawnArea;
+
+ [SerializeField]
+ private Transform _container;
+
+ [SerializeField]
+ private Vector2 _spawnArea;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs.meta
new file mode 100644
index 0000000..054b891
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Core/Scripts/GameEnvironmentView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4cd7eaebb53be4192951d0258755683a
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits.meta
new file mode 100644
index 0000000..86cde89
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3b69afb8842a44516a9fb50bfa4e62c3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content.meta
new file mode 100644
index 0000000..66c9556
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fbdc2ab062cb444c8bdd2f6359abfb8f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations.meta
new file mode 100644
index 0000000..80f800b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4eb69e4389f814e8985736645d8de3e3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim
new file mode 100644
index 0000000..ed29d63
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim
@@ -0,0 +1,168 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: FruitBoard_Hide
+ serializedVersion: 7
+ m_Legacy: 1
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 1, y: 1, z: 1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.25
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.25
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim.meta
new file mode 100644
index 0000000..621c34a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Hide.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5e720510a75ca4365a08ad7e0c507946
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim
new file mode 100644
index 0000000..da5877b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim
@@ -0,0 +1,276 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: FruitBoard_Show
+ serializedVersion: 7
+ m_Legacy: 1
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.18333334
+ value: {x: 1.1, y: 1.1, z: 1.1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.31666666
+ value: {x: 0.95, y: 0.95, z: 0.95}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.4
+ value: {x: 1.05, y: 1.05, z: 1.05}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.45
+ value: {x: 1, y: 1, z: 1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.45
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.45
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.45
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.45
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim.meta
new file mode 100644
index 0000000..e3d982a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Animations/FruitBoard_Show.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 78fb0465afdb24e44bf3369835235e09
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets.meta
new file mode 100644
index 0000000..0ff3b81
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 85c6d5a005753404ab9e0e34e684b457
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources.meta
new file mode 100644
index 0000000..e38ec4e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ad6066587c8b6469fbe8a43231e0e4f8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png
new file mode 100644
index 0000000..6455ef1
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png.meta
new file mode 100644
index 0000000..f12f42d
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_0_Sprite.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: b57a0883b7b5a43608eeccc0fe7ba449
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 9
+ spritePivot: {x: 0.49428734, y: 0.40716934}
+ spritePixelsToUnits: 240
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png
new file mode 100644
index 0000000..37accaa
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png.meta
new file mode 100644
index 0000000..e76f588
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_1_Sprite.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 1f4f898e9c34c41a9ae39135ffcb90b0
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 9
+ spritePivot: {x: 0.5042845, y: 0.45001426}
+ spritePixelsToUnits: 230
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png
new file mode 100644
index 0000000..40f0532
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png.meta
new file mode 100644
index 0000000..9a9cb29
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_2_Sprite.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 9087f77a354244b1a8884a80d35e8b57
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 9
+ spritePivot: {x: 0.5057126, y: 0.421451}
+ spritePixelsToUnits: 230
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png
new file mode 100644
index 0000000..56b50bb
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png.meta
new file mode 100644
index 0000000..d2bec0b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_3_Sprite.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 89ce91911db834de6b3529141359b0f1
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 9
+ spritePivot: {x: 0.49000284, y: 0.4714367}
+ spritePixelsToUnits: 230
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png
new file mode 100644
index 0000000..f7f8c42
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png.meta
new file mode 100644
index 0000000..f138964
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Assets/Resources/Fruit_4_Sprite.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: da878ac1d5ea84bceb225e79237daad7
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 250
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data.meta
new file mode 100644
index 0000000..c15bd50
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a3879b07fed21442eaa36e2984c62550
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset
new file mode 100644
index 0000000..c1af5e0
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset
@@ -0,0 +1,15 @@
+%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: f12d580cd03b143128de8fb8a91358d3, type: 3}
+ m_Name: Fruit_0
+ m_EditorClassIdentifier:
+ _resourceId: Fruit_0
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset.meta
new file mode 100644
index 0000000..7aa9e1e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_0.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3df914c3b99d3416a9a285e42fe6bda9
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset
new file mode 100644
index 0000000..f1fb815
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset
@@ -0,0 +1,15 @@
+%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: f12d580cd03b143128de8fb8a91358d3, type: 3}
+ m_Name: Fruit_1
+ m_EditorClassIdentifier:
+ _resourceId: Fruit_1
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset.meta
new file mode 100644
index 0000000..7628642
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_1.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 061980bfd50da44289b6977f604bf53b
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset
new file mode 100644
index 0000000..133919f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset
@@ -0,0 +1,15 @@
+%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: f12d580cd03b143128de8fb8a91358d3, type: 3}
+ m_Name: Fruit_2
+ m_EditorClassIdentifier:
+ _resourceId: Fruit_2
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset.meta
new file mode 100644
index 0000000..ab520b8
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_2.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d16e6cfb94d6b4e9ab6acd4178618f16
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset
new file mode 100644
index 0000000..8abf0ef
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset
@@ -0,0 +1,15 @@
+%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: f12d580cd03b143128de8fb8a91358d3, type: 3}
+ m_Name: Fruit_3
+ m_EditorClassIdentifier:
+ _resourceId: Fruit_3
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset.meta
new file mode 100644
index 0000000..60a417a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_3.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6e2e30d2b06794838a36963ec65ae6c6
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset
new file mode 100644
index 0000000..e106534
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset
@@ -0,0 +1,15 @@
+%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: f12d580cd03b143128de8fb8a91358d3, type: 3}
+ m_Name: Fruit_4
+ m_EditorClassIdentifier:
+ _resourceId: Fruit_4
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset.meta
new file mode 100644
index 0000000..202718f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Data/Fruit_4.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b3bc594ffd2c04455a40be83defccd85
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial.meta
new file mode 100644
index 0000000..6c30f46
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1fff28f425ae24e63996c3e4951213eb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D
new file mode 100644
index 0000000..52934f6
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D
@@ -0,0 +1,11 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!62 &6200000
+PhysicsMaterial2D:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Fruit_PhysicsMaterial
+ friction: 0.1
+ bounciness: 0.2
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D.meta
new file mode 100644
index 0000000..f8a965e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/PhysicsMaterial/Fruit_PhysicsMaterial.physicsMaterial2D.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6ff45f3855876430bace6ab104e4f2dd
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 6200000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources.meta
new file mode 100644
index 0000000..d2ce1b7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: afca28b3216fb400e9fe674fc65b036b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab
new file mode 100644
index 0000000..f59abb5
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab
@@ -0,0 +1,215 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &5095062733169645201
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3267695331231205403}
+ - component: {fileID: 5800893775626658424}
+ m_Layer: 0
+ m_Name: Sprite
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3267695331231205403
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5095062733169645201}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1.2, y: 1.2, z: 1.2}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 3158312996380650695}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &5800893775626658424
+SpriteRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5095062733169645201}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+ 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: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_Sprite: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 2.56, y: 2.56}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 0
+ m_MaskInteraction: 0
+ m_SpriteSortPoint: 0
+--- !u!1 &6577089093788119021
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3158312996380650695}
+ - component: {fileID: 2409449214724243407}
+ - component: {fileID: 902954903642494832}
+ - component: {fileID: 6217556875563536229}
+ - component: {fileID: 6967941478843309611}
+ m_Layer: 0
+ m_Name: FruitBoard
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3158312996380650695
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6577089093788119021}
+ 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:
+ - {fileID: 3267695331231205403}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2409449214724243407
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6577089093788119021}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 290c78d8be7bb40f3b75b1fb3554fff6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _renderer: {fileID: 5800893775626658424}
+ _animationComponent: {fileID: 6967941478843309611}
+--- !u!58 &902954903642494832
+CircleCollider2D:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6577089093788119021}
+ m_Enabled: 1
+ m_Density: 1
+ m_Material: {fileID: 6200000, guid: 6ff45f3855876430bace6ab104e4f2dd, type: 2}
+ 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_UsedByComposite: 0
+ m_Offset: {x: 0, y: 0}
+ serializedVersion: 2
+ m_Radius: 0.6
+--- !u!50 &6217556875563536229
+Rigidbody2D:
+ serializedVersion: 4
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6577089093788119021}
+ m_BodyType: 0
+ m_Simulated: 1
+ m_UseFullKinematicContacts: 0
+ m_UseAutoMass: 0
+ m_Mass: 1
+ m_LinearDrag: 0
+ m_AngularDrag: 0.05
+ m_GravityScale: 2
+ m_Material: {fileID: 6200000, guid: 6ff45f3855876430bace6ab104e4f2dd, type: 2}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_Interpolate: 0
+ m_SleepingMode: 1
+ m_CollisionDetection: 1
+ m_Constraints: 0
+--- !u!111 &6967941478843309611
+Animation:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6577089093788119021}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Animation: {fileID: 0}
+ m_Animations:
+ - {fileID: 7400000, guid: 78fb0465afdb24e44bf3369835235e09, type: 2}
+ - {fileID: 7400000, guid: 5e720510a75ca4365a08ad7e0c507946, type: 2}
+ m_WrapMode: 0
+ m_PlayAutomatically: 0
+ m_AnimatePhysics: 0
+ m_CullingType: 0
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab.meta
new file mode 100644
index 0000000..124be06
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitBoard.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 85f2fdd7b40e247be80b0d18903c4368
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset
new file mode 100644
index 0000000..bcebd3f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset
@@ -0,0 +1,20 @@
+%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: 0d915615c2da44f32a18c01640fcca13, type: 3}
+ m_Name: FruitsCollection
+ m_EditorClassIdentifier:
+ _list:
+ - {fileID: 11400000, guid: 3df914c3b99d3416a9a285e42fe6bda9, type: 2}
+ - {fileID: 11400000, guid: 061980bfd50da44289b6977f604bf53b, type: 2}
+ - {fileID: 11400000, guid: d16e6cfb94d6b4e9ab6acd4178618f16, type: 2}
+ - {fileID: 11400000, guid: 6e2e30d2b06794838a36963ec65ae6c6, type: 2}
+ - {fileID: 11400000, guid: b3bc594ffd2c04455a40be83defccd85, type: 2}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset.meta
new file mode 100644
index 0000000..67c88a5
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Content/Resources/FruitsCollection.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2542252e25c414bc69919aa08225fa7f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts.meta
new file mode 100644
index 0000000..39fad25
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a663e6c0c9d0047b1bf069d6753c81dd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs
new file mode 100644
index 0000000..76febfe
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs
@@ -0,0 +1,72 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitBoardController manages interactions for individual fruit in the game.
+ /// It initializes with a FruitData instance and utilizes a FruitBoardFactory to create and display corresponding views.
+ /// Upon user interaction, it triggers removal requests through GameModel.RequestFruitRemove() and completes
+ /// operations with EmptyControllerResult. The controller handles lifecycle events, ensuring proper initialization,
+ /// interaction handling, and cleanup of associated views.
+ ///
+ public class FruitBoardController : ControllerWithResultBase
+ {
+ private readonly GameModel _gameModel;
+ private readonly FruitBoardFactory _factory;
+
+ private FruitBoardView _view;
+ private UniTaskCompletionSource _clickCs = new();
+ private FruitData _data => Args.Data;
+
+ public FruitBoardController(
+ IControllerFactory controllerFactory,
+ GameModel gameModel,
+ FruitBoardFactory factory)
+ : base(controllerFactory)
+ {
+ _gameModel = gameModel;
+ _factory = factory;
+ }
+
+ protected override async UniTask OnFlowAsync(CancellationToken cancellationToken)
+ {
+ _view = await _factory.CreateAsync(_data.ResourceId, cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ _view.Show();
+ _view.Clicked += OnClicked;
+
+ await _clickCs.Task;
+ cancellationToken.ThrowIfCancellationRequested();
+
+ _gameModel.RequestFruitRemove(_data);
+
+ await _view.HideAsync(cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ Complete(new EmptyControllerResult());
+ }
+
+ protected override void OnStop()
+ {
+ if (_view != null)
+ {
+ _view.Clicked -= OnClicked;
+ Object.Destroy(_view.gameObject);
+ }
+ }
+
+ private void OnClicked()
+ {
+ if (_gameModel.IsFruitLineFilled())
+ {
+ return;
+ }
+
+ _clickCs.TrySetResult();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs.meta
new file mode 100644
index 0000000..aba5e8b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4bd6d554f042407bb8e262b7fa1be238
+timeCreated: 1718544312
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs
new file mode 100644
index 0000000..b696743
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs
@@ -0,0 +1,17 @@
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitBoardControllerArgs is a readonly struct used to pass data to FruitBoardController instances during
+ /// initialization. It encapsulates a FruitData instance, ensuring that the data is immutable and efficiently passed
+ /// between components in the game's architecture.
+ ///
+ public readonly struct FruitBoardControllerArgs
+ {
+ public readonly FruitData Data;
+
+ public FruitBoardControllerArgs(FruitData data)
+ {
+ Data = data;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs.meta
new file mode 100644
index 0000000..765a04e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardControllerArgs.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fa2aef251c35411da47c7483c0b6c475
+timeCreated: 1718546498
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs
new file mode 100644
index 0000000..7fc1cc6
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs
@@ -0,0 +1,40 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitBoardFactory creates FruitBoardView instances within the game environment.
+ /// It utilizes a FruitVisualisationProvider for visual assets and a GameEnvironmentView for placement.
+ /// Upon creation, each board is positioned randomly within a specified range and visually represented using asset
+ /// data obtained from FruitVisualisationProvider.
+ ///
+ public class FruitBoardFactory
+ {
+ private readonly FruitVisualisationProvider _visualisationProvider;
+ private readonly GameEnvironmentView _environmentView;
+
+ public FruitBoardFactory(
+ FruitVisualisationProvider visualisationProvider,
+ GameEnvironmentView environmentView)
+ {
+ _visualisationProvider = visualisationProvider;
+ _environmentView = environmentView;
+ }
+
+ public async UniTask CreateAsync(string resourceId, CancellationToken cancellationToken)
+ {
+ var result = await UniTask.WhenAll(_visualisationProvider.GetFruitBoardPrefabAsync(cancellationToken),
+ _visualisationProvider.GetSpriteAsync(resourceId, cancellationToken));
+ cancellationToken.ThrowIfCancellationRequested();
+
+ var instance = Object.Instantiate(result.Item1, _environmentView.Container);
+
+ instance.transform.localPosition = Vector3.right * Random.Range(_environmentView.SpawnArea.x, _environmentView.SpawnArea.y);
+ instance.SetVisualisation(result.Item2);
+
+ return instance;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs.meta
new file mode 100644
index 0000000..88aba99
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardFactory.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: d95a1b754c5c4def897cc9e3afcdac55
+timeCreated: 1718544348
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs
new file mode 100644
index 0000000..3c58cec
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.EventSystems;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitBoardView, a MonoBehaviour, represents a visual component in the game for displaying fruits.
+ /// This class facilitates the visual representation and interaction handling of individual fruits within the game's environment.
+ ///
+ public class FruitBoardView : MonoBehaviour, IPointerClickHandler
+ {
+ private const string ShowAnimationName = "FruitBoard_Show";
+ private const string HideAnimationName = "FruitBoard_Hide";
+
+ public event Action Clicked;
+
+ [SerializeField]
+ private SpriteRenderer _renderer;
+
+ [SerializeField]
+ private Animation _animationComponent;
+
+ public void SetVisualisation(Sprite sprite)
+ {
+ _renderer.sprite = sprite;
+ }
+
+ public void Show()
+ {
+ _animationComponent.Play(ShowAnimationName);
+ }
+
+ public UniTask HideAsync(CancellationToken cancellationToken)
+ {
+ return _animationComponent.PlayAsync(HideAnimationName, cancellationToken);
+ }
+
+ public void OnPointerClick(PointerEventData eventData)
+ {
+ Clicked?.Invoke();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs.meta
new file mode 100644
index 0000000..7a02d43
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitBoardView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 290c78d8be7bb40f3b75b1fb3554fff6
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs
new file mode 100644
index 0000000..736df5f
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitData is a ScriptableObject representing a type of fruit in the game.
+ /// It contains a ResourceId property that uniquely identifies the resource associated with the fruit,
+ /// facilitating resource management and retrieval within the game.
+ ///
+ [CreateAssetMenu(fileName = "FruitData", menuName = "Scriptable Objects/Fruit Data")]
+ public class FruitData : ScriptableObject
+ {
+ public string ResourceId => _resourceId;
+
+ [SerializeField]
+ private string _resourceId;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs.meta
new file mode 100644
index 0000000..34c9ff7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f12d580cd03b143128de8fb8a91358d3
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs
new file mode 100644
index 0000000..cab9585
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs
@@ -0,0 +1,18 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitDataCollectionDefinition is a ScriptableObject that holds a collection of FruitData instances.
+ /// It provides a structured way to store and manage multiple types of fruit data within game resources.
+ ///
+ [CreateAssetMenu(fileName = "FruitsCollection", menuName = "Scriptable Objects/Fruits Collection")]
+ public class FruitDataCollectionDefinition : ScriptableObject
+ {
+ public IReadOnlyList List => _list;
+
+ [SerializeField]
+ private List _list;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs.meta
new file mode 100644
index 0000000..0ad0a4d
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitDataCollectionDefinition.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0d915615c2da44f32a18c01640fcca13
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs
new file mode 100644
index 0000000..ec88f3d
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs
@@ -0,0 +1,31 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// FruitVisualisationProvider facilitates the retrieval of visual assets for fruits in the game.
+ /// It offers methods to obtain the prefab for FruitBoardView and sprites associated with specific resourceId values.
+ /// This allows dynamic loading and display of visual elements based on the game's resource configuration.
+ ///
+ public class FruitVisualisationProvider
+ {
+ private readonly ResourcesProvider _resourcesProvider;
+
+ public FruitVisualisationProvider(ResourcesProvider resourcesProvider)
+ {
+ _resourcesProvider = resourcesProvider;
+ }
+
+ public UniTask GetFruitBoardPrefabAsync(CancellationToken cancellationToken)
+ {
+ return _resourcesProvider.LoadAsync("FruitBoard", cancellationToken);
+ }
+
+ public UniTask GetSpriteAsync(string resourceId, CancellationToken cancellationToken)
+ {
+ return _resourcesProvider.LoadAsync($"{resourceId}_Sprite", cancellationToken);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs.meta
new file mode 100644
index 0000000..8d28904
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/Environment/Fruits/Scripts/FruitVisualisationProvider.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 5966a0ab8c274f4b8e91b0481dc4858e
+timeCreated: 1718543801
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI.meta
new file mode 100644
index 0000000..b4fa3a2
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3a171c1ecaf614efa864251223d83077
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen.meta
new file mode 100644
index 0000000..567de39
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 15562464b5a724366930287a7d779faf
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content.meta
new file mode 100644
index 0000000..594569a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f7649183e85034bb6805ef848000e5e5
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations.meta
new file mode 100644
index 0000000..76a6e58
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cccf5e00d214346d99adf7b3165d29ed
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim
new file mode 100644
index 0000000..41ad905
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim
@@ -0,0 +1,438 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: AfterLevelScreen_Show
+ serializedVersion: 7
+ m_Legacy: 1
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.25
+ value: {x: 1.1, y: 1.1, z: 1.1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.33333334
+ value: {x: 0.95, y: 0.95, z: 0.95}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.38333333
+ value: {x: 1, y: 1, z: 1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path: Restart_Button
+ m_FloatCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.33333334
+ value: 0.69803923
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Background
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 100
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 200
+ inSlope: 156.52174
+ outSlope: 156.52174
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.38333333
+ value: 215
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_AnchoredPosition.y
+ path: Header
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Header
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.38333333
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.33333334
+ value: 0.69803923
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Background
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.33333334
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.38333333
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path: Restart_Button
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.33333334
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.38333333
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path: Restart_Button
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.33333334
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.38333333
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path: Restart_Button
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 100
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 200
+ inSlope: 156.52174
+ outSlope: 156.52174
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.38333333
+ value: 215
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_AnchoredPosition.y
+ path: Header
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.25
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Header
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim.meta
new file mode 100644
index 0000000..59577f2
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Animations/AfterLevelScreen_Show.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 54176e08ff17f4efba46a04d9c9f5f07
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources.meta
new file mode 100644
index 0000000..18de66c
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0570ca3d2b8be4b20a822512a8298959
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab
new file mode 100644
index 0000000..6dc97b9
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab
@@ -0,0 +1,494 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &2526561122196032719
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4870559766374459906}
+ - component: {fileID: 9120523662368299035}
+ - component: {fileID: 4272272459533671291}
+ m_Layer: 0
+ m_Name: InnerCircle
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4870559766374459906
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2526561122196032719}
+ 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: 7837974251700653777}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: -20, y: -20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &9120523662368299035
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2526561122196032719}
+ m_CullTransparentMesh: 1
+--- !u!114 &4272272459533671291
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2526561122196032719}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.19958171, g: 0.6509434, b: 0.38791147, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 29d3ed44a0e674c79a85a1e0c8a4c711, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &6767828511135579132
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 528827791184905148}
+ - component: {fileID: 1586734695760498009}
+ - component: {fileID: 2178112397209904133}
+ m_Layer: 0
+ m_Name: AfterLevelScreen
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &528827791184905148
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6767828511135579132}
+ 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:
+ - {fileID: 2714522394596541298}
+ - {fileID: 7837974251700653777}
+ - {fileID: 3862883944146069140}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1586734695760498009
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6767828511135579132}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 1e66cb4c75da4713b97ddea1d5629c60, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _restartButton: {fileID: 3820932631433536641}
+ _animationComponent: {fileID: 2178112397209904133}
+--- !u!111 &2178112397209904133
+Animation:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6767828511135579132}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Animation: {fileID: 0}
+ m_Animations:
+ - {fileID: 7400000, guid: 54176e08ff17f4efba46a04d9c9f5f07, type: 2}
+ m_WrapMode: 0
+ m_PlayAutomatically: 0
+ m_AnimatePhysics: 0
+ m_CullingType: 0
+--- !u!1 &7037904086326401158
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7837974251700653777}
+ - component: {fileID: 7055047362974753683}
+ - component: {fileID: 8208436072824198022}
+ - component: {fileID: 3820932631433536641}
+ m_Layer: 0
+ m_Name: Restart_Button
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7837974251700653777
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7037904086326401158}
+ 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:
+ - {fileID: 4870559766374459906}
+ - {fileID: 6193764975065161259}
+ m_Father: {fileID: 528827791184905148}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -17}
+ m_SizeDelta: {x: 300, y: 300}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &7055047362974753683
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7037904086326401158}
+ m_CullTransparentMesh: 1
+--- !u!114 &8208436072824198022
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7037904086326401158}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0.08627451, g: 0.26666668, b: 0.17254902, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 29d3ed44a0e674c79a85a1e0c8a4c711, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 0.5
+--- !u!114 &3820932631433536641
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7037904086326401158}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Navigation:
+ m_Mode: 3
+ m_WrapAround: 0
+ m_SelectOnUp: {fileID: 0}
+ m_SelectOnDown: {fileID: 0}
+ m_SelectOnLeft: {fileID: 0}
+ m_SelectOnRight: {fileID: 0}
+ m_Transition: 1
+ m_Colors:
+ m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+ m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+ m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+ m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+ m_ColorMultiplier: 1
+ m_FadeDuration: 0.1
+ m_SpriteState:
+ m_HighlightedSprite: {fileID: 0}
+ m_PressedSprite: {fileID: 0}
+ m_SelectedSprite: {fileID: 0}
+ m_DisabledSprite: {fileID: 0}
+ m_AnimationTriggers:
+ m_NormalTrigger: Normal
+ m_HighlightedTrigger: Highlighted
+ m_PressedTrigger: Pressed
+ m_SelectedTrigger: Selected
+ m_DisabledTrigger: Disabled
+ m_Interactable: 1
+ m_TargetGraphic: {fileID: 8208436072824198022}
+ m_OnClick:
+ m_PersistentCalls:
+ m_Calls: []
+--- !u!1 &8206786695959001430
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2714522394596541298}
+ - component: {fileID: 2441207298673566987}
+ - component: {fileID: 8390518528372247864}
+ m_Layer: 0
+ m_Name: Background
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2714522394596541298
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8206786695959001430}
+ 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: 528827791184905148}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2441207298673566987
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8206786695959001430}
+ m_CullTransparentMesh: 1
+--- !u!114 &8390518528372247864
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8206786695959001430}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.5019608}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 0}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &8236766127313766587
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3862883944146069140}
+ - component: {fileID: 1680322291106804345}
+ - component: {fileID: 9054303230421718966}
+ m_Layer: 0
+ m_Name: Header
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3862883944146069140
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8236766127313766587}
+ 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: 528827791184905148}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 215}
+ m_SizeDelta: {x: 490, y: 110}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1680322291106804345
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8236766127313766587}
+ m_CullTransparentMesh: 1
+--- !u!114 &9054303230421718966
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8236766127313766587}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 6346212bea7464a5cae2a38f5f7e1c77, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 1
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &8365170519143469533
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6193764975065161259}
+ - component: {fileID: 372264268867319328}
+ - component: {fileID: 2634446374093594424}
+ m_Layer: 0
+ m_Name: Icon
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6193764975065161259
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8365170519143469533}
+ 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: 7837974251700653777}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &372264268867319328
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8365170519143469533}
+ m_CullTransparentMesh: 1
+--- !u!114 &2634446374093594424
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 8365170519143469533}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 86329eb0d6a3d45678f314d516488440, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab.meta
new file mode 100644
index 0000000..ee4602c
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Content/Resources/AfterLevelScreen.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7905deee7b72c4a4b86f6c262825d9de
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts.meta
new file mode 100644
index 0000000..9538cb6
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e9818f6b61a844ec3889e8a5f08ec92d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs
new file mode 100644
index 0000000..717e973
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs
@@ -0,0 +1,58 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// AfterLevelScreenController manages the post-level screen UI, instantiated from AfterLevelScreenView.
+ /// It handles UI setup and cleanup during its lifecycle.
+ /// Initialization includes displaying the screen and binding a restart button click event to RestartButtonClicked().
+ /// On stopping, it removes event listeners and destroys the UI instance. RestartButtonClicked() triggers a restart
+ /// request through GameModel.RequestRestart().
+ ///
+ public class AfterLevelScreenController : ControllerWithResultBase
+ {
+ private readonly IGameEventsRequestsModel _gameRequestsModel;
+ private readonly ResourcesProvider _resourcesProvider;
+ private readonly Transform _container;
+
+ private AfterLevelScreenView _view;
+
+ public AfterLevelScreenController(
+ IControllerFactory controllerFactory,
+ GameUIView uiView,
+ IGameEventsRequestsModel gameRequestsModel,
+ ResourcesProvider resourcesProvider)
+ : base(controllerFactory)
+ {
+ _container = uiView.PopupsContainer;
+ _gameRequestsModel = gameRequestsModel;
+ _resourcesProvider = resourcesProvider;
+ }
+
+ protected override async UniTask OnFlowAsync(CancellationToken cancellationToken)
+ {
+ var prefab = await _resourcesProvider.LoadAsync("AfterLevelScreen", cancellationToken);
+ cancellationToken.ThrowIfCancellationRequested();
+
+ _view = Object.Instantiate(prefab, _container);
+ _view.Show();
+
+ _view.RestartButton.onClick.AddListener(RestartButtonClicked);
+ }
+
+ protected override void OnStop()
+ {
+ _view.RestartButton.onClick.RemoveAllListeners();
+
+ Object.Destroy(_view.gameObject);
+ }
+
+ private void RestartButtonClicked()
+ {
+ _gameRequestsModel.RequestRestart();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs.meta
new file mode 100644
index 0000000..5e09c05
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 396c32f111ce4092944ab8fbb66745a4
+timeCreated: 1718630338
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs
new file mode 100644
index 0000000..84781d5
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs
@@ -0,0 +1,26 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// AfterLevelScreenView is a MonoBehaviour, manages the view component displayed after completing a game level.
+ ///
+ public class AfterLevelScreenView : MonoBehaviour
+ {
+ private const string ShowAnimationName = "AfterLevelScreen_Show";
+
+ public Button RestartButton => _restartButton;
+
+ [SerializeField]
+ private Button _restartButton;
+
+ [SerializeField]
+ private Animation _animationComponent;
+
+ public void Show()
+ {
+ _animationComponent.Play(ShowAnimationName);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs.meta
new file mode 100644
index 0000000..7b12411
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/AfterLevelScreen/Scripts/AfterLevelScreenView.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 1e66cb4c75da4713b97ddea1d5629c60
+timeCreated: 1718630395
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits.meta
new file mode 100644
index 0000000..caca9c7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b86da0894c25e44b98da21816147846f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content.meta
new file mode 100644
index 0000000..c88eb44
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 07ca34ed9c5f5485aab0a806d013702f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations.meta
new file mode 100644
index 0000000..a048f5a
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 23b671af1039a454a881027fb871c104
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim
new file mode 100644
index 0000000..ee69904
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim
@@ -0,0 +1,288 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: CollectedFruitItem_Hide
+ serializedVersion: 7
+ m_Legacy: 1
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 1, y: 1, z: 1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.31666666
+ value: {x: 1.2, y: 1.2, z: 1.2}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_FloatCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 50
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_AnchoredPosition.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Image
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.31666666
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 50
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_AnchoredPosition.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_Color.a
+ path: Image
+ classID: 114
+ script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 1.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 1.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.31666666
+ value: 1.2
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim.meta
new file mode 100644
index 0000000..2dc710b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Hide.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c0cba101a0cec4e048b8dfdd50d5b5bb
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim
new file mode 100644
index 0000000..0813aa7
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim
@@ -0,0 +1,276 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: CollectedFruitItem_Show
+ serializedVersion: 7
+ m_Legacy: 1
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves:
+ - curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: {x: 0, y: 0, z: 0}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.18333334
+ value: {x: 1.1, y: 1.1, z: 1.1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.28333333
+ value: {x: 0.95, y: 0.95, z: 0.95}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.35
+ value: {x: 1.05, y: 1.05, z: 1.05}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ - serializedVersion: 3
+ time: 0.4
+ value: {x: 1, y: 1, z: 1}
+ inSlope: {x: 0, y: 0, z: 0}
+ outSlope: {x: 0, y: 0, z: 0}
+ tangentMode: 0
+ weightedMode: 0
+ inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ path:
+ m_FloatCurves: []
+ m_PPtrCurves: []
+ m_SampleRate: 60
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings: []
+ pptrCurveMapping: []
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.4
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves:
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.28333333
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.35
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.x
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.28333333
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.35
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.y
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ - serializedVersion: 2
+ curve:
+ serializedVersion: 2
+ m_Curve:
+ - serializedVersion: 3
+ time: 0
+ value: 0
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.18333334
+ value: 1.1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.28333333
+ value: 0.95
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.35
+ value: 1.05
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ - serializedVersion: 3
+ time: 0.4
+ value: 1
+ inSlope: 0
+ outSlope: 0
+ tangentMode: 136
+ weightedMode: 0
+ inWeight: 0.33333334
+ outWeight: 0.33333334
+ m_PreInfinity: 2
+ m_PostInfinity: 2
+ m_RotationOrder: 4
+ attribute: m_LocalScale.z
+ path:
+ classID: 224
+ script: {fileID: 0}
+ flags: 0
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim.meta
new file mode 100644
index 0000000..12fcb40
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Animations/CollectedFruitItem_Show.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2039b00fd20f24e68afa674e71c0bb5a
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs.meta
new file mode 100644
index 0000000..52ec813
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f1a6c81363aae45c29892af66e2a6081
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab
new file mode 100644
index 0000000..92ee1bb
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab
@@ -0,0 +1,146 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1850136844171517301
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3260882128620691191}
+ - component: {fileID: 1372158923887844196}
+ - component: {fileID: 983164680730148715}
+ m_Layer: 0
+ m_Name: FruitPreview
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3260882128620691191
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1850136844171517301}
+ 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:
+ - {fileID: 2722285307728118647}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1372158923887844196
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1850136844171517301}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fffe88dcb0ce4c51b00e75828638bb1d, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _image: {fileID: 9199024696812505408}
+ _animationComponent: {fileID: 983164680730148715}
+--- !u!111 &983164680730148715
+Animation:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1850136844171517301}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Animation: {fileID: 7400000, guid: 2039b00fd20f24e68afa674e71c0bb5a, type: 2}
+ m_Animations:
+ - {fileID: 7400000, guid: 2039b00fd20f24e68afa674e71c0bb5a, type: 2}
+ - {fileID: 7400000, guid: c0cba101a0cec4e048b8dfdd50d5b5bb, type: 2}
+ m_WrapMode: 0
+ m_PlayAutomatically: 1
+ m_AnimatePhysics: 0
+ m_CullingType: 0
+--- !u!1 &6558884335042385852
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2722285307728118647}
+ - component: {fileID: 2135340954695457783}
+ - component: {fileID: 9199024696812505408}
+ m_Layer: 0
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &2722285307728118647
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6558884335042385852}
+ 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: 3260882128620691191}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &2135340954695457783
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6558884335042385852}
+ m_CullTransparentMesh: 1
+--- !u!114 &9199024696812505408
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6558884335042385852}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: b57a0883b7b5a43608eeccc0fe7ba449, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab.meta
new file mode 100644
index 0000000..3b81756
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitPreview.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0d00c72e4f0d745ebb40e19d3aac038c
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab
new file mode 100644
index 0000000..163f2e3
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab
@@ -0,0 +1,163 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1151905939476842381
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6994769223713818873}
+ - component: {fileID: 7366130751407268700}
+ m_Layer: 0
+ m_Name: FruitSlot
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6994769223713818873
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1151905939476842381}
+ 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:
+ - {fileID: 6249959047361075924}
+ - {fileID: 8484078520297554197}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 120, y: 150}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &7366130751407268700
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1151905939476842381}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: a8878fb764c742daad68d2e92a698234, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _container: {fileID: 8484078520297554197}
+--- !u!1 &2438758660865418212
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6249959047361075924}
+ - component: {fileID: 4177919984734175448}
+ - component: {fileID: 962500823197341684}
+ m_Layer: 0
+ m_Name: Image
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6249959047361075924
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2438758660865418212}
+ 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: 6994769223713818873}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -56.9}
+ m_SizeDelta: {x: 100, y: 20}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &4177919984734175448
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2438758660865418212}
+ m_CullTransparentMesh: 1
+--- !u!114 &962500823197341684
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2438758660865418212}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 0, g: 0, b: 0, a: 0.39215687}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 29d3ed44a0e674c79a85a1e0c8a4c711, type: 3}
+ m_Type: 1
+ m_PreserveAspect: 0
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &6324969151804432985
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8484078520297554197}
+ m_Layer: 0
+ m_Name: Container
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &8484078520297554197
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6324969151804432985}
+ 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: 6994769223713818873}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 0.5}
+ m_AnchorMax: {x: 0.5, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: -12.1}
+ m_SizeDelta: {x: 100, y: 100}
+ m_Pivot: {x: 0.5, y: 0.5}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab.meta
new file mode 100644
index 0000000..e13ba74
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Content/Prefabs/FruitSlot.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ac46d014486c242e48a5fecd74bfbdb8
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts.meta
new file mode 100644
index 0000000..7bc6f57
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f6dcefea263eb40b88f75a3606cf98d8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs
new file mode 100644
index 0000000..e3e2bda
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs
@@ -0,0 +1,38 @@
+using System.Threading;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUICollectedFruitItemView, a MonoBehaviour, manages individual visual representations of collected fruits in the game's UI.
+ /// This class facilitates dynamic display and animation management of collected fruit items within the game's UI system.
+ ///
+ public class GameUICollectedFruitItemView : MonoBehaviour
+ {
+ private const string ShowAnimationName = "CollectedFruitItem_Show";
+ private const string HideAnimationName = "CollectedFruitItem_Hide";
+
+ [SerializeField]
+ private Image _image;
+
+ [SerializeField]
+ private Animation _animationComponent;
+
+ public void SetVisualisation(Sprite sprite)
+ {
+ _image.sprite = sprite;
+ }
+
+ public void Show()
+ {
+ _animationComponent.Play(ShowAnimationName);
+ }
+
+ public UniTask HideAsync(CancellationToken cancellationToken)
+ {
+ return _animationComponent.PlayAsync(HideAnimationName, cancellationToken);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs.meta
new file mode 100644
index 0000000..c05c553
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitItemView.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fffe88dcb0ce4c51b00e75828638bb1d
+timeCreated: 1718549026
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs
new file mode 100644
index 0000000..f834149
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs
@@ -0,0 +1,15 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUICollectedFruitSlotView, a MonoBehaviour, represents a slot in the UI for displaying collected fruit items.
+ ///
+ public class GameUICollectedFruitSlotView : MonoBehaviour
+ {
+ public Transform Container => _container;
+
+ [SerializeField]
+ private Transform _container;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs.meta
new file mode 100644
index 0000000..fca7309
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitSlotView.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: a8878fb764c742daad68d2e92a698234
+timeCreated: 1718549013
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs
new file mode 100644
index 0000000..ff1cbbb
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs
@@ -0,0 +1,98 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUICollectedFruitsController handles the UI display of collected fruits in the game.
+ /// It dynamically manages visual slots based on changes in the GameModel.
+ /// Initialization clears and sets up the UI slots. Event handlers update the UI when fruits are added or removed,
+ /// providing visual feedback asynchronously for removal animations.
+ ///
+ public class GameUICollectedFruitsController : ControllerBase
+ {
+ private readonly GameModel _gameModel;
+ private readonly FruitVisualisationProvider _visualisationProvider;
+ private readonly GameUICollectedFruitsView _view;
+
+ private List _slotViews;
+
+ public GameUICollectedFruitsController(
+ IControllerFactory controllerFactory,
+ GameModel gameModel,
+ FruitVisualisationProvider visualisationProvider,
+ GameUICollectedFruitsView view)
+ : base(controllerFactory)
+ {
+ _gameModel = gameModel;
+ _visualisationProvider = visualisationProvider;
+ _view = view;
+
+ _slotViews = new List(_gameModel.GameConfiguration.MaxFruitsCollectedCount);
+ }
+
+ protected override void OnStart()
+ {
+ _view.Container.Clear();
+
+ for (var i = 0; i < _slotViews.Capacity; i++)
+ {
+ var slotInstance = Object.Instantiate(_view.SlotPrefab, _view.Container);
+ _slotViews.Add(slotInstance);
+ }
+
+ _gameModel.FruitAddedToList += OnFruitAddedToList;
+ _gameModel.FruitsRemovedFromList += OnFruitsRemovedFromList;
+ }
+
+ protected override void OnStop()
+ {
+ _gameModel.FruitAddedToList -= OnFruitAddedToList;
+ _gameModel.FruitsRemovedFromList -= OnFruitsRemovedFromList;
+ }
+
+ private void OnFruitAddedToList(int index, FruitData data)
+ {
+ OnFruitAddedToListAsync(index, data).Forget();
+ }
+
+ private async UniTask OnFruitAddedToListAsync(int index, FruitData data)
+ {
+ var slotView = _slotViews[index];
+
+ var fruitInstance = Object.Instantiate(_view.ItemPrefab, slotView.Container);
+ var sprite = await _visualisationProvider.GetSpriteAsync(data.ResourceId, CancellationToken);
+
+ fruitInstance.SetVisualisation(sprite);
+ fruitInstance.Show();
+ }
+
+ private void OnFruitsRemovedFromList(List indexesList)
+ {
+ OnFruitsRemovedFromListAsync(indexesList).Forget();
+ }
+
+ private async UniTask OnFruitsRemovedFromListAsync(List indexesList)
+ {
+ await UniTask.WaitForSeconds(0.2f, cancellationToken: CancellationToken);
+
+ foreach (var index in indexesList)
+ {
+ var slotView = _slotViews[index];
+ ClearSlot(slotView).Forget();
+
+ await UniTask.WaitForSeconds(0.1f, cancellationToken: CancellationToken);
+ }
+ }
+
+ private async UniTaskVoid ClearSlot(GameUICollectedFruitSlotView slotView)
+ {
+ var fruitInstance = slotView.Container.GetComponentInChildren();
+ await fruitInstance.HideAsync(CancellationToken);
+
+ Object.Destroy(fruitInstance.gameObject);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs.meta
new file mode 100644
index 0000000..6a9f257
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsController.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b093027700fe49a2bb3964f41f194da6
+timeCreated: 1718549529
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs
new file mode 100644
index 0000000..3568cfc
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs
@@ -0,0 +1,24 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUICollectedFruitsView, a MonoBehaviour, manages UI components for displaying collected fruits in the game.
+ /// These elements facilitate the organization and presentation of collected fruits within the game's UI system.
+ ///
+ public class GameUICollectedFruitsView : MonoBehaviour
+ {
+ public Transform Container => _container;
+ public GameUICollectedFruitSlotView SlotPrefab => _slotPrefab;
+ public GameUICollectedFruitItemView ItemPrefab => _itemPrefab;
+
+ [SerializeField]
+ private Transform _container;
+
+ [SerializeField]
+ private GameUICollectedFruitSlotView _slotPrefab;
+
+ [SerializeField]
+ private GameUICollectedFruitItemView _itemPrefab;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs.meta
new file mode 100644
index 0000000..b057ad4
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/CollectedFruits/Scripts/GameUICollectedFruitsView.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 66fc8cb6b4154d2b89bac2ec45e3b8c2
+timeCreated: 1718548990
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core.meta
new file mode 100644
index 0000000..f0550df
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 51050f809993545798dca46b57da6eee
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content.meta
new file mode 100644
index 0000000..662fc88
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0c03607d717134b0f9609979b719c09e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab.meta
new file mode 100644
index 0000000..cb88b96
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f9b0d4bdae64344de9f26559435e5b3d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab
new file mode 100644
index 0000000..022e956
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab
@@ -0,0 +1,482 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &85316130108556961
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7477592136115080557}
+ m_Layer: 0
+ m_Name: Container
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7477592136115080557
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 85316130108556961}
+ 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:
+ - {fileID: 7955743631434330736}
+ - {fileID: 3632451623478443297}
+ - {fileID: 6603288801512602969}
+ m_Father: {fileID: 3236629527562902630}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &824219678940355041
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7955743631434330736}
+ m_Layer: 0
+ m_Name: Bottom
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &7955743631434330736
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 824219678940355041}
+ 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:
+ - {fileID: 4569798590878230768}
+ m_Father: {fileID: 7477592136115080557}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 0}
+ m_AnchoredPosition: {x: 0, y: 150}
+ m_SizeDelta: {x: 0, y: 150}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &1597224226876947175
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3632451623478443297}
+ - component: {fileID: 5476776564589974241}
+ - component: {fileID: 6088538719968442926}
+ m_Layer: 0
+ m_Name: Logo
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3632451623478443297
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1597224226876947175}
+ 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: 7477592136115080557}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0.5, y: 1}
+ m_AnchorMax: {x: 0.5, y: 1}
+ m_AnchoredPosition: {x: 0, y: -147}
+ m_SizeDelta: {x: 303, y: 161}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &5476776564589974241
+CanvasRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1597224226876947175}
+ m_CullTransparentMesh: 1
+--- !u!114 &6088538719968442926
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1597224226876947175}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Material: {fileID: 0}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_RaycastTarget: 1
+ m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+ m_Maskable: 1
+ m_OnCullStateChanged:
+ m_PersistentCalls:
+ m_Calls: []
+ m_Sprite: {fileID: 21300000, guid: 3dbffecfdfe164eada18b648d2703621, type: 3}
+ m_Type: 0
+ m_PreserveAspect: 1
+ m_FillCenter: 1
+ m_FillMethod: 4
+ m_FillAmount: 1
+ m_FillClockwise: 1
+ m_FillOrigin: 0
+ m_UseSpriteMesh: 0
+ m_PixelsPerUnitMultiplier: 1
+--- !u!1 &2073810355654277025
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 6603288801512602969}
+ m_Layer: 0
+ m_Name: PopupsContainer
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &6603288801512602969
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2073810355654277025}
+ 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: 7477592136115080557}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 1, y: 1}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &2813183336786420558
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4558575284159568479}
+ - component: {fileID: 6446168473523129486}
+ m_Layer: 0
+ m_Name: UI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4558575284159568479
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2813183336786420558}
+ 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:
+ - {fileID: 3236629527562902630}
+ - {fileID: 4829668081568553210}
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &6446168473523129486
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2813183336786420558}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 6815a37090d984807b4af832ec46765e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _popupsContainer: {fileID: 6603288801512602969}
+ _collectedFruitsView: {fileID: 4306734778237751510}
+--- !u!1 &6064220107897425181
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4829668081568553210}
+ - component: {fileID: 2636077902862789415}
+ - component: {fileID: 809521506585560895}
+ m_Layer: 0
+ m_Name: EventSystem
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4829668081568553210
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6064220107897425181}
+ 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: 4558575284159568479}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &2636077902862789415
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6064220107897425181}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_FirstSelected: {fileID: 0}
+ m_sendNavigationEvents: 1
+ m_DragThreshold: 10
+--- !u!114 &809521506585560895
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6064220107897425181}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_SendPointerHoverToParent: 1
+ m_HorizontalAxis: Horizontal
+ m_VerticalAxis: Vertical
+ m_SubmitButton: Submit
+ m_CancelButton: Cancel
+ m_InputActionsPerSecond: 10
+ m_RepeatDelay: 0.5
+ m_ForceModuleActive: 0
+--- !u!1 &7433040372188402657
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3236629527562902630}
+ - component: {fileID: 6081273471566441561}
+ - component: {fileID: 5181258863223321829}
+ - component: {fileID: 5776269012292518535}
+ m_Layer: 0
+ m_Name: Canvas
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &3236629527562902630
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7433040372188402657}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0, y: 0, z: 0}
+ m_ConstrainProportionsScale: 0
+ m_Children:
+ - {fileID: 7477592136115080557}
+ m_Father: {fileID: 4558575284159568479}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0}
+ m_AnchorMax: {x: 0, y: 0}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 0}
+ m_Pivot: {x: 0, y: 0}
+--- !u!223 &6081273471566441561
+Canvas:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7433040372188402657}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_RenderMode: 1
+ m_Camera: {fileID: 0}
+ m_PlaneDistance: 10
+ m_PixelPerfect: 0
+ m_ReceivesEvents: 1
+ m_OverrideSorting: 0
+ m_OverridePixelPerfect: 0
+ m_SortingBucketNormalizedSize: 0
+ m_VertexColorAlwaysGammaSpace: 0
+ m_AdditionalShaderChannelsFlag: 25
+ m_UpdateRectTransformForStandalone: 0
+ m_SortingLayerID: 0
+ m_SortingOrder: 10
+ m_TargetDisplay: 0
+--- !u!114 &5181258863223321829
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7433040372188402657}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_UiScaleMode: 1
+ m_ReferencePixelsPerUnit: 100
+ m_ScaleFactor: 1
+ m_ReferenceResolution: {x: 720, y: 1280}
+ m_ScreenMatchMode: 0
+ m_MatchWidthOrHeight: 0
+ m_PhysicalUnit: 3
+ m_FallbackScreenDPI: 96
+ m_DefaultSpriteDPI: 96
+ m_DynamicPixelsPerUnit: 1
+ m_PresetInfoIsWorld: 0
+--- !u!114 &5776269012292518535
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7433040372188402657}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_IgnoreReversedGraphics: 1
+ m_BlockingObjects: 0
+ m_BlockingMask:
+ serializedVersion: 2
+ m_Bits: 4294967295
+--- !u!1 &7647860120084800745
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4569798590878230768}
+ - component: {fileID: 3999048062377227180}
+ - component: {fileID: 4306734778237751510}
+ m_Layer: 0
+ m_Name: Slots
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!224 &4569798590878230768
+RectTransform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7647860120084800745}
+ 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: 7955743631434330736}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+ m_AnchorMin: {x: 0, y: 0.5}
+ m_AnchorMax: {x: 1, y: 0.5}
+ m_AnchoredPosition: {x: 0, y: 0}
+ m_SizeDelta: {x: 0, y: 150}
+ m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &3999048062377227180
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7647860120084800745}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ m_Padding:
+ m_Left: 0
+ m_Right: 0
+ m_Top: 0
+ m_Bottom: 0
+ m_ChildAlignment: 4
+ m_Spacing: 0
+ m_ChildForceExpandWidth: 0
+ m_ChildForceExpandHeight: 0
+ m_ChildControlWidth: 0
+ m_ChildControlHeight: 0
+ m_ChildScaleWidth: 0
+ m_ChildScaleHeight: 0
+ m_ReverseArrangement: 0
+--- !u!114 &4306734778237751510
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7647860120084800745}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 66fc8cb6b4154d2b89bac2ec45e3b8c2, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _container: {fileID: 4569798590878230768}
+ _slotPrefab: {fileID: 7366130751407268700, guid: ac46d014486c242e48a5fecd74bfbdb8, type: 3}
+ _itemPrefab: {fileID: 1372158923887844196, guid: 0d00c72e4f0d745ebb40e19d3aac038c, type: 3}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab.meta
new file mode 100644
index 0000000..d75bff9
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Prefab/UI.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a0834be56fd764d10a01d4cdc187508d
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites.meta
new file mode 100644
index 0000000..a6b5f5c
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0a50a69a48932459cbd5b0f9aab4831c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png
new file mode 100644
index 0000000..aede416
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png.meta
new file mode 100644
index 0000000..da678a4
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/AfterLevelHeader.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 6346212bea7464a5cae2a38f5f7e1c77
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png
new file mode 100644
index 0000000..d5c1851
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png.meta
new file mode 100644
index 0000000..0402c45
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Circle.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 29d3ed44a0e674c79a85a1e0c8a4c711
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 128, y: 0, z: 128, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2 b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2
new file mode 100644
index 0000000..5c9475e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2
@@ -0,0 +1,15 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!612988286 &1
+SpriteAtlasAsset:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ serializedVersion: 2
+ m_MasterAtlas: {fileID: 0}
+ m_ImporterData:
+ packables:
+ - {fileID: 102900000, guid: 0a50a69a48932459cbd5b0f9aab4831c, type: 3}
+ m_IsVariant: 0
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2.meta
new file mode 100644
index 0000000..0b99d03
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Generic_Atlas.spriteatlasv2.meta
@@ -0,0 +1,30 @@
+fileFormatVersion: 2
+guid: b1fba6d1620124253a8676890874b859
+SpriteAtlasImporter:
+ externalObjects: {}
+ textureSettings:
+ serializedVersion: 2
+ anisoLevel: 1
+ compressionQuality: 50
+ maxTextureSize: 2048
+ textureCompression: 0
+ filterMode: 1
+ generateMipMaps: 0
+ readable: 0
+ crunchedCompression: 0
+ sRGB: 1
+ platformSettings: []
+ packingSettings:
+ serializedVersion: 2
+ padding: 4
+ blockOffset: 1
+ allowAlphaSplitting: 0
+ enableRotation: 0
+ enableTightPacking: 0
+ enableAlphaDilation: 0
+ secondaryTextureSettings: {}
+ variantMultiplier: 1
+ bindAsDefault: 1
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png
new file mode 100644
index 0000000..48a2841
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png.meta
new file mode 100644
index 0000000..1ec8f69
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Logo.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 3dbffecfdfe164eada18b648d2703621
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png
new file mode 100644
index 0000000..c122a68
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png.meta
new file mode 100644
index 0000000..d912344
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/Outline.png.meta
@@ -0,0 +1,153 @@
+fileFormatVersion: 2
+guid: 0923c2b2eb3804a049980390c7420125
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 64, y: 0, z: 64, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: iPhone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Android
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 1537655665
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png
new file mode 100644
index 0000000..7f9ba24
Binary files /dev/null and b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png differ
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png.meta
new file mode 100644
index 0000000..f2e5085
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Content/Sprites/refresh.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 86329eb0d6a3d45678f314d516488440
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 12
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 0
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ flipGreenChannel: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ vTOnly: 0
+ ignoreMipmapLimit: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: 1
+ aniso: 1
+ mipBias: 0
+ wrapU: 1
+ wrapV: 1
+ wrapW: 1
+ nPOTScale: 0
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 1
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 1
+ spriteTessellationDetail: -1
+ textureType: 8
+ textureShape: 1
+ singleChannelComponent: 0
+ flipbookRows: 1
+ flipbookColumns: 1
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ ignorePngGamma: 0
+ applyGammaDecoding: 0
+ swizzle: 50462976
+ cookieLightType: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Standalone
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ - serializedVersion: 3
+ buildTarget: Server
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ ignorePlatformSupport: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID: 5e97eb03825dee720800000000000000
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ nameFileIdTable: {}
+ mipmapLimitGroupName:
+ pSDRemoveMatte: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts.meta
new file mode 100644
index 0000000..724192e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0cd6e0473de924504b3ed88326cf4670
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs
new file mode 100644
index 0000000..49e4e5c
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs
@@ -0,0 +1,43 @@
+using Cysharp.Threading.Tasks;
+using Playtika.Controllers;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUIController extends ControllerBase to manage the game's UI interactions.
+ /// It listens for events from GameModel (Win and Lose) to trigger UI updates through OnLevelEnd().
+ /// Initialization includes starting a GameUICollectedFruitsController to handle fruit collection UI.
+ /// Cleanup involves removing event listeners to ensure proper lifecycle management.
+ ///
+ public class GameUIController : ControllerBase
+ {
+ private readonly IGameEventsModel _gameEventsModel;
+
+ public GameUIController(
+ IControllerFactory controllerFactory,
+ IGameEventsModel gameEventsModel)
+ : base(controllerFactory)
+ {
+ _gameEventsModel = gameEventsModel;
+ }
+
+ protected override void OnStart()
+ {
+ _gameEventsModel.Win += OnLevelEnd;
+ _gameEventsModel.Lose += OnLevelEnd;
+
+ Execute();
+ }
+
+ protected override void OnStop()
+ {
+ _gameEventsModel.Win -= OnLevelEnd;
+ _gameEventsModel.Lose -= OnLevelEnd;
+ }
+
+ private void OnLevelEnd()
+ {
+ ExecuteAndWaitResultAsync(CancellationToken).Forget();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs.meta
new file mode 100644
index 0000000..b594638
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cc0dbff93867d45ed9769312e18dff45
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs
new file mode 100644
index 0000000..46ea700
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+
+namespace ControllersTree.Samples.FruitsMerge
+{
+ ///
+ /// GameUIView is a MonoBehaviour representing the UI view components in the game.
+ /// It provides access to PopupsContainer, a serialized reference to manage pop-up UI elements,
+ /// and CollectedFruitsView, which connects to GameUICollectedFruitsView for displaying collected fruits UI.
+ /// This class facilitates interaction with and management of UI elements within the game scene.
+ ///
+ public class GameUIView : MonoBehaviour
+ {
+ public Transform PopupsContainer => _popupsContainer;
+ public GameUICollectedFruitsView CollectedFruitsView => _collectedFruitsView;
+
+ [SerializeField]
+ private Transform _popupsContainer;
+
+ [SerializeField]
+ private GameUICollectedFruitsView _collectedFruitsView;
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs.meta
new file mode 100644
index 0000000..f1c1420
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Features/UI/Core/Scripts/GameUIView.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6815a37090d984807b4af832ec46765e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes.meta
new file mode 100644
index 0000000..7c1c919
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e6d51a30a6e6e476ab2343a453cc28d4
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity
new file mode 100644
index 0000000..b36078e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity
@@ -0,0 +1,248 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!29 &1
+OcclusionCullingSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_OcclusionBakeSettings:
+ smallestOccluder: 5
+ smallestHole: 0.25
+ backfaceThreshold: 100
+ m_SceneGUID: 00000000000000000000000000000000
+ m_OcclusionCullingData: {fileID: 0}
+--- !u!104 &2
+RenderSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 9
+ m_Fog: 0
+ m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
+ m_FogMode: 3
+ m_FogDensity: 0.01
+ m_LinearFogStart: 0
+ m_LinearFogEnd: 300
+ m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
+ m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
+ m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
+ m_AmbientIntensity: 1
+ m_AmbientMode: 3
+ m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
+ m_SkyboxMaterial: {fileID: 0}
+ m_HaloStrength: 0.5
+ m_FlareStrength: 1
+ m_FlareFadeSpeed: 3
+ m_HaloTexture: {fileID: 0}
+ m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
+ m_DefaultReflectionMode: 0
+ m_DefaultReflectionResolution: 128
+ m_ReflectionBounces: 1
+ m_ReflectionIntensity: 1
+ m_CustomReflection: {fileID: 0}
+ m_Sun: {fileID: 0}
+ m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}
+ m_UseRadianceAmbientProbe: 0
+--- !u!157 &3
+LightmapSettings:
+ m_ObjectHideFlags: 0
+ serializedVersion: 12
+ m_GIWorkflowMode: 1
+ m_GISettings:
+ serializedVersion: 2
+ m_BounceScale: 1
+ m_IndirectOutputScale: 1
+ m_AlbedoBoost: 1
+ m_EnvironmentLightingMode: 0
+ m_EnableBakedLightmaps: 0
+ m_EnableRealtimeLightmaps: 0
+ m_LightmapEditorSettings:
+ serializedVersion: 12
+ m_Resolution: 2
+ m_BakeResolution: 40
+ m_AtlasSize: 1024
+ m_AO: 0
+ m_AOMaxDistance: 1
+ m_CompAOExponent: 1
+ m_CompAOExponentDirect: 0
+ m_ExtractAmbientOcclusion: 0
+ m_Padding: 2
+ m_LightmapParameters: {fileID: 0}
+ m_LightmapsBakeMode: 1
+ m_TextureCompression: 1
+ m_FinalGather: 0
+ m_FinalGatherFiltering: 1
+ m_FinalGatherRayCount: 256
+ m_ReflectionCompression: 2
+ m_MixedBakeMode: 2
+ m_BakeBackend: 1
+ m_PVRSampling: 1
+ m_PVRDirectSampleCount: 32
+ m_PVRSampleCount: 512
+ m_PVRBounces: 2
+ m_PVREnvironmentSampleCount: 256
+ m_PVREnvironmentReferencePointCount: 2048
+ m_PVRFilteringMode: 1
+ m_PVRDenoiserTypeDirect: 1
+ m_PVRDenoiserTypeIndirect: 1
+ m_PVRDenoiserTypeAO: 1
+ m_PVRFilterTypeDirect: 0
+ m_PVRFilterTypeIndirect: 0
+ m_PVRFilterTypeAO: 0
+ m_PVREnvironmentMIS: 1
+ m_PVRCulling: 1
+ m_PVRFilteringGaussRadiusDirect: 1
+ m_PVRFilteringGaussRadiusIndirect: 5
+ m_PVRFilteringGaussRadiusAO: 2
+ m_PVRFilteringAtrousPositionSigmaDirect: 0.5
+ m_PVRFilteringAtrousPositionSigmaIndirect: 2
+ m_PVRFilteringAtrousPositionSigmaAO: 1
+ m_ExportTrainingData: 0
+ m_TrainingDataDestination: TrainingData
+ m_LightProbeSampleCountMultiplier: 4
+ m_LightingDataAsset: {fileID: 0}
+ m_LightingSettings: {fileID: 0}
+--- !u!196 &4
+NavMeshSettings:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_BuildSettings:
+ serializedVersion: 3
+ agentTypeID: 0
+ agentRadius: 0.5
+ agentHeight: 2
+ agentSlope: 45
+ agentClimb: 0.4
+ ledgeDropHeight: 0
+ maxJumpAcrossDistance: 0
+ minRegionArea: 2
+ manualCellSize: 0
+ cellSize: 0.16666667
+ manualTileSize: 0
+ tileSize: 256
+ buildHeightMesh: 0
+ maxJobWorkers: 0
+ preserveTilesOutsideBounds: 0
+ debug:
+ m_Flags: 0
+ m_NavMeshData: {fileID: 0}
+--- !u!1 &1763343937
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1763343939}
+ - component: {fileID: 1763343938}
+ m_Layer: 0
+ m_Name: RootScope
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &1763343938
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1763343937}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9e7ad20ae2d7440c6b3e2e99ab49e651, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ parentReference:
+ TypeName:
+ autoRun: 1
+ autoInjectGameObjects: []
+ _gameView: {fileID: 1847860521}
+--- !u!4 &1763343939
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1763343937}
+ 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_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1001 &1847860520
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 0}
+ m_Modifications:
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 2834930602603086173, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 3416476144409564023, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ propertyPath: m_Name
+ value: GameView
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+--- !u!114 &1847860521 stripped
+MonoBehaviour:
+ m_CorrespondingSourceObject: {fileID: 762718665078696411, guid: c86c4274b83dd415389c40df57c6f2df, type: 3}
+ m_PrefabInstance: {fileID: 1847860520}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: aae241492282e463aa9efe7e1b975bca, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+--- !u!1660057539 &9223372036854775807
+SceneRoots:
+ m_ObjectHideFlags: 0
+ m_Roots:
+ - {fileID: 1763343939}
+ - {fileID: 1847860520}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity.meta
new file mode 100644
index 0000000..963ff8e
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Scenes/DemoScene.unity.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8c9cfa26abfee488c85f1582747f6a02
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders.meta
new file mode 100644
index 0000000..9a6cd79
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8532401cde4d8417e922714c66d06b20
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader
new file mode 100644
index 0000000..71f9a1b
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader
@@ -0,0 +1,70 @@
+Shader "Sprites/GradientShader"
+{
+ Properties
+ {
+ [PerRendererData]
+ _MainTex ("Texture", 2D) = "white" {}
+ _FirstColor ("First Color", Color) = (0.0,0.0,0.0,1.0)
+ _SecondColor ("Second Color", Color) = (0.0,0.0,0.0,1.0)
+ _TransitionPosition ("Transition Position", Range(0.0, 1.0)) = 0.5
+ _GradientWidth ("Gradient Width", Range(0.0, 1.0)) = 0.3
+ [Enum(UnityEngine.Rendering.BlendOp)] _BlendOption ("Blend Option", Float) = 1
+ [Enum(UnityEngine.Rendering.BlendMode)] _BlendSrc ("Blend mode Source", Int) = 1
+ [Enum(UnityEngine.Rendering.BlendMode)] _BlendDst ("Blend mode Destination", Int) = 0
+ }
+ SubShader
+ {
+ Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
+ LOD 100
+
+ ZWrite Off
+ BlendOp [_BlendOption]
+ Blend [_BlendSrc] [_BlendDst]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+
+ #include "UnityCG.cginc"
+
+ struct appdata
+ {
+ float4 vertex : POSITION;
+ float2 uv : TEXCOORD0;
+ };
+
+ struct v2f
+ {
+ float2 uv : TEXCOORD0;
+ float4 vertex : SV_POSITION;
+ };
+
+ sampler2D _MainTex;
+ float4 _FirstColor;
+ float4 _SecondColor;
+ float _TransitionPosition;
+ float _GradientWidth;
+ float4 _MainTex_ST;
+
+ v2f vert (appdata v)
+ {
+ v2f o;
+ o.vertex = UnityObjectToClipPos(v.vertex);
+ o.uv = TRANSFORM_TEX(v.uv, _MainTex);
+
+ return o;
+ }
+
+ fixed4 frag (v2f i) : SV_Target
+ {
+ float halfGradientWidth = _GradientWidth/2;
+ float4 col = lerp(_FirstColor, _SecondColor, smoothstep(_TransitionPosition - halfGradientWidth, _TransitionPosition + halfGradientWidth, i.uv.y));
+
+ return col;
+ }
+ ENDCG
+ }
+ }
+}
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader.meta
new file mode 100644
index 0000000..eed7828
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/GradientShader.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ca7d927c60b9d462084d2ca005255890
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ nonModifiableTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader
new file mode 100644
index 0000000..f7adce1
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader
@@ -0,0 +1,92 @@
+Shader "Sprites/ScrollingSprite"
+{
+ Properties
+ {
+ [PerRendererData]
+ _MainTex ("Sprite Texture", 2D) = "white" {}
+ _Color ("Tint", Color) = (1,1,1,1)
+ _ScrollSpeed ("Scroll Speed", Vector) = (0,0,0,0)
+ [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ "PreviewType"="Plane"
+ "CanUseSpriteAtlas"="True"
+ }
+
+ Cull Off
+ Lighting Off
+ ZWrite Off
+ Blend One OneMinusSrcAlpha
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #pragma multi_compile _ PIXELSNAP_ON
+ #include "UnityCG.cginc"
+
+ struct appdata_t
+ {
+ float4 vertex : POSITION;
+ float4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
+ };
+
+ fixed4 _Color;
+
+ v2f vert(appdata_t IN)
+ {
+ v2f OUT;
+ OUT.vertex = UnityObjectToClipPos(IN.vertex);
+ OUT.texcoord = IN.texcoord;
+ OUT.color = IN.color * _Color;
+ #ifdef PIXELSNAP_ON
+ OUT.vertex = UnityPixelSnap (OUT.vertex);
+ #endif
+
+ return OUT;
+ }
+
+ sampler2D _MainTex;
+ float4 _MainTex_ST;
+ sampler2D _AlphaTex;
+ fixed4 _ScrollSpeed;
+ float _AlphaSplitEnabled;
+
+ fixed4 SampleSpriteTexture (float2 uv)
+ {
+ fixed4 color = tex2D (_MainTex, uv*_MainTex_ST + _ScrollSpeed * _Time.x);
+
+#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
+ if (_AlphaSplitEnabled)
+ color.a = tex2D (_AlphaTex, uv).r;
+#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
+
+ return color;
+ }
+
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
+ c.rgb *= c.a;
+ return c;
+ }
+ ENDCG
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader.meta b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader.meta
new file mode 100644
index 0000000..f49daed
--- /dev/null
+++ b/src/ControllersTreeSamples/Samples~/FruitsMerge/Shaders/ScrollingSprite.shader.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: b62bf4f62333045a38793f9915535fc6
+ShaderImporter:
+ externalObjects: {}
+ defaultTextures: []
+ nonModifiableTextures: []
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/src/ControllersTreeSamples/package.json b/src/ControllersTreeSamples/package.json
new file mode 100644
index 0000000..ab1f666
--- /dev/null
+++ b/src/ControllersTreeSamples/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "com.playtika.controllers-tree-samples",
+ "displayName": "ControllersTreeSamples",
+ "version": "1.0.0",
+ "unity": "2018.3",
+ "description": "Samples for controllers tree package",
+ "keywords": [
+ "Unity",
+ "HMVC",
+ "controllers-tree",
+ "Hierarchy of controllers",
+ "Unity controllers"
+ ],
+ "documentationUrl": "https://github.com/Playtika/unity-controllers-tree/blob/develop/README.md",
+ "samples": [
+ {
+ "displayName": "Fruits Merge Sample",
+ "description": "Contains sample for small merge game to show how to use controllers tree",
+ "path": "Samples~/FruitsMerge"
+ }
+ ],
+ "dependencies": {
+ "com.cysharp.unitask": "1.0.0",
+ "jp.hadashikick.vcontainer": "1.0.0",
+ "com.playtika.controllers-tree": "1.0.0"
+ }
+}
\ No newline at end of file
diff --git a/src/ControllersTreeSamples/package.json.meta b/src/ControllersTreeSamples/package.json.meta
new file mode 100644
index 0000000..1058431
--- /dev/null
+++ b/src/ControllersTreeSamples/package.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: f036fba1389454ab88bb59ea040bf0b8
+PackageManifestImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant: