private void Snapsnapable(ISnapPoint selected, ISnapPoint target)
        {
            Transform selectedSnapPoint      = selected.GetTransform();
            Transform selectedSnapable       = selectedSnapPoint.parent;
            Transform selectedShapeContainer = selectedSnapable.parent;
            Transform targetSnapPoint        = target.GetTransform();
            Transform targetSnapable         = targetSnapPoint.parent;
            Transform targetShapeContainer   = targetSnapable.parent;

            float   xOffset        = selectedSnapPoint.position.x - selectedSnapable.position.x;
            float   yOffset        = selectedSnapPoint.position.y - selectedSnapable.position.y;
            Vector2 targetPosition = new Vector2(targetSnapPoint.position.x - xOffset, targetSnapPoint.position.y - yOffset);

            Vector2 startPos = selectedSnapable.position;

            float xOffsetTotal = startPos.x - targetPosition.x;
            float yOffsetTotal = startPos.y - targetPosition.y;

            //Move to target BlockContainer
            foreach (ISnapable snapable in selectedShapeContainer.GetComponentsInChildren <ISnapable>())
            {
                Transform shape = snapable.Transform;
                shape.parent = targetShapeContainer;

                Vector3 position = shape.position;
                position       = new Vector2(position.x - xOffsetTotal, position.y - yOffsetTotal);
                shape.position = position;
            }
            targetShapeContainer.GetComponent <IShapeContainer>().PrepareStart();

            //Destroy old Container
            selectedShapeContainer.GetComponent <IShapeContainer>().Destroy();

            _snapForest.Join(
                selected.GetTransform().parent.GetComponent <Snapable>(),
                target.GetTransform().parent.GetComponent <Snapable>()
                );

            //Deactivates used Snapables
            selected.SetSnapped();
            target.SetSnapped();

            if (_snapSound == null)
            {
                PrepareSnapSound( );
            }
            _snapSound.Play();
        }
        private void TrySnap(ISnapable snapable)
        {
            List <ISnapPoint> snapPoints = snapable.GetSnapPoints();

            foreach (ISnapPoint snapPoint in snapPoints)
            {
                ISnapPoint targetSnapPoint = snapPoint.GetTriggeredSnapable();
                if (targetSnapPoint != null && snapPoint.GetTransform().parent.parent != targetSnapPoint.GetTransform().parent.parent)
                {
                    Snapsnapable(snapPoint, targetSnapPoint);
                    return;
                }
            }
        }