using System; using Domain; using FMODUnity; using Presenter; using UnityEngine; using Animation = FramedAnimator.Animation; using Animator = FramedAnimator.Animator; namespace View.Scene { public class GrowAnimation : MonoBehaviour, IRoseGrow { [SerializeField] private Animator animator; [SerializeField] private Animation growAnimation; [SerializeField] private Animation endAnimation; [SerializeField] private Animation startAnimation; [SerializeField] private EventReference growEvent; [SerializeField] private EventReference gloomEvent; private Score _score; private SpawnRose _spawnRose; private bool _firstUpdate = true; public bool Growing { private set; get; } = true; private void Start() { _score = FindObjectOfType().Score; _spawnRose = FindObjectOfType().Spawner; animator.PlayUntil(1f); animator.OnAnimationEnd += AnimationEnded; } private void AnimationEnded(string animationName) { if (animationName == "Rosa_Grow") { animator.ChangeAnimation(endAnimation); RuntimeManager.PlayOneShot(gloomEvent); animator.PlayUntil(1f); return; } if (animationName == "Rosa_End") { _spawnRose.Execute(); animator.ChangeAnimation(startAnimation); animator.PlayUntil(1f); } if (animationName == "Rosa_Start") { Growing = true; animator.ChangeAnimation(growAnimation); animator.PlayUntil(_score.GrowPercentage); } } public void GrowStep() { if (animator.CurrentAnimation == "Rosa_Grow") { if (IsLastGrowState()) Growing = false; animator.PlayUntil(IsLastGrowState() ? 1f : _score.GrowPercentage); if (_score.GrowPercentage < 1f && !_firstUpdate) RuntimeManager.PlayOneShot(growEvent); } _firstUpdate = false; } public bool IsLastGrowState() { if (_score.GrowPercentage != 0) return false; bool isLastFrame = _score.Value % (_score.GrowIterations * _score.SpawnRate) == 0; if (!isLastFrame) return false; if (_firstUpdate) return false; return true; } } }