public bool Play()
    {
        if (!isPlaying)
        {
            lerp         = 0f;
            lerpRotation = 0f;
            isPlaying    = true;
            time1        = 0f;
            phase        = AnimationPhaseTypeEnum.PHASE1;

            if (particleSystem1 != null)
            {
                Destroy(particleSystem1.gameObject);
            }

            switch (_animation)
            {
            case LetterAnimationTypeEnum.FireWorks:
                StartFireWorksAnimation();
                break;

            case LetterAnimationTypeEnum.FireWorks2:
                StartFireWorks2Animation();
                break;

            case LetterAnimationTypeEnum.FireWorks3:
                StartFireWorks3Animation();
                break;

            case LetterAnimationTypeEnum.FireWorks4:
                StartFireWorks4Animation();
                break;

            case LetterAnimationTypeEnum.NONE:
                break;
            }

            return(true);
        }
        else
        {
            return(false);
        }
    }
    private void HandleOnTrailAnimationStops()
    {
        switch (_animation)
        {
        case LetterAnimationTypeEnum.FireWorks:
            break;

        case LetterAnimationTypeEnum.FireWorks2:
            phase = AnimationPhaseTypeEnum.PHASE2;
            break;

        case LetterAnimationTypeEnum.FireWorks3:
            phase = AnimationPhaseTypeEnum.PHASE2;
            break;

        case LetterAnimationTypeEnum.FireWorks4:
            phase = AnimationPhaseTypeEnum.PHASE2;
            break;
        }
    }
    private void PlayFrameFireWorksAnimation()
    {
        lerp         += Time.deltaTime * speed;
        lerpRotation += Time.deltaTime * rotationSpeed;

        if (lerpRotation > 1f)
        {
            lerpRotation = 0f;
        }

        if (lerp < 1f)
        {
            letter.rectTransform.localPosition = Vector3.Lerp(startPosition, endPosition, lerp);
            letter.text.color                = new Color(letter.text.color.r, letter.text.color.g, letter.text.color.b, Mathf.Lerp(0f, 1f, lerp));
            letter.rectTransform.rotation    = Quaternion.Lerp(Quaternion.Euler(0f, 0f, 0f), Quaternion.Euler(0f, 0f, 359f), lerpRotation);
            letter.text.fontSize             = (int)Mathf.Lerp(letter.realFontSize * (1f - fontSizeNormalizedPercentDiff), letter.realFontSize, lerp);
            letter.rectTransform.eulerAngles = Vector3.Lerp(new Vector3(0f, 0f, 0f), new Vector3(0f, 0f, 359), lerp);
        }
        else
        {
            phase     = AnimationPhaseTypeEnum.PHASE2;
            isPlaying = false;
        }
    }
    private void PlayFrameFireworks4Animation()
    {
        switch (phase)
        {
        case AnimationPhaseTypeEnum.PHASE1:
            if (!trail.IsPlaying)
            {
                trail.Play(speed, startPosition, endPosition, true);
                PlayRandomSound(fireworkWhistles);
            }

            break;

        case AnimationPhaseTypeEnum.PHASE2:

            lerp  += Time.deltaTime * speed2;
            time1 += Time.deltaTime;

            if (time1 < interval1)
            {
                if (lerp < 1f)
                {
                    letter.text.fontSize = ((int)Mathf.Lerp((float)fontSize, (float)fontSize * (1f + fontSizeNormalizedPercentDiff), lerp));
                    letter.text.color    = new Color(letter.text.color.r, letter.text.color.g, letter.text.color.b, Mathf.Lerp(1f, 0f, lerp));
                }
                else
                {
                    letter.text.fontSize = ((int)Mathf.Lerp((float)fontSize, (float)fontSize * (1f + fontSizeNormalizedPercentDiff), 1f));
                    letter.text.color    = new Color(letter.text.color.r, letter.text.color.g, letter.text.color.b, Mathf.Lerp(1f, 0f, 1f));
                    lerp = 0f;
                }
            }
            else
            {
                letter.text.color = new Color(letter.text.color.r, letter.text.color.g, letter.text.color.b, 0f);
                phase             = AnimationPhaseTypeEnum.PHASE3;
                time1             = 0f;
                lerp = 0f;
            }

            break;

        case AnimationPhaseTypeEnum.PHASE3:

            if (particleSystem1 == null)
            {
                particleSystem1 = Instantiate(particleSystem2Prefab, endPosition, Quaternion.identity).GetComponent <ParticleSystem>();

                ParticleSystem.MainModule main = particleSystem1.main;
                Color randomColor = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
                main.startColor = new ParticleSystem.MinMaxGradient(randomColor);

                PlayRandomSound(fireworkShots);
            }
            else
            {
                time1 += Time.deltaTime;

                if (time1 >= 1f)
                {
                    if (!particleSystem1.isPlaying)
                    {
                        Destroy(particleSystem1.gameObject);
                        Stop();
                    }
                }
            }

            break;
        }
    }