//When a line finishes movement, we'll automatically complete the transformation of all off screen characters that were started.
    private void TransformationLine_LineFinished(TransformationLine i_TransformationLine)
    {
        CharacterForm affectedForm = r_FormLineDict[i_TransformationLine];

        i_TransformationLine.OnLineFinished -= TransformationLine_LineFinished;

        affectedForm.TransformRate = 1;
    }
    //Creates a new transformation sequence on this character and maps it to the invoking transformation line.
    private CharacterForm createNewTransformation(TransformationLine i_TransformationLine)
    {
        if (r_FormLineDict[i_TransformationLine])
        {
            throw new ArgumentException("A form already exists for given transformation line on this character");
        }

        CharacterForm newForm = m_NextForm;

        i_TransformationLine.OnLineFinished += TransformationLine_LineFinished;
        newForm.OnTransformationComplete    += CharacterForm_TransformationComplete;

        r_FormLineDict.Add(newForm, i_TransformationLine);

        return(newForm);
    }
    /// <summary>
    /// Transforms a character in its current transformation sequence up to the x point of the given point.
    /// </summary>
    /// <param name="i_TransformationLine">The transformation line that invoked this transformation. Each unique line that affects this character will be linked to a unique specific form object.</param>
    /// <param name="i_WorldPointHit">The world point where the transformation line hit. We'll transform the character with this point's x as the seperator.</param>
    public void TransformByPoint(TransformationLine i_TransformationLine, Vector2 i_WorldPointHit)
    {
        CharacterForm affectedForm = r_FormLineDict[i_TransformationLine];

        if (affectedForm == null)
        {
            affectedForm = createNewTransformation(i_TransformationLine);
        }

        //First we'll get the x point of the hit in local spaces (-sprite width / 2 <= Pixel in sprite <= sprite width / 2).
        float centerRelativeHitX = transform.InverseTransformPoint(i_WorldPointHit).x;
        //Then we offset it to sprite size (0 <= pixel in sprite <= sprite width), since sprite local spaces in unity can be negative.
        float pixelHitX = centerRelativeHitX + affectedForm.Sprite.rectTransform.rect.width / 2;
        //And finally we got the normal of the hit (What % of the transformation is complete).
        float hitFillNormal = pixelHitX / affectedForm.Sprite.rectTransform.rect.width;

        affectedForm.TransformRate = hitFillNormal;
    }