using System.Collections; using UnityEngine; namespace SpellBoundAR.Items.VFX { [DisallowMultipleComponent] [RequireComponent(typeof(Item))] public class ItemVFXVisibilityScaling : MonoBehaviour { [SerializeField] private float animationSeconds = .3f; [Header("Cache")] private Transform _transform; private Item _item; private Vector3 _scaleWhenVisible; private Vector3 _scaleWhenInvisible = Vector3.zero; private Item Item { get { if (!_item) _item = GetComponent(); return _item; } } private void Awake() { _transform = transform; _scaleWhenVisible = _transform.localScale; } private void OnEnable() { Item.OnVisibleChanged += Refresh; RefreshImmediate(); } private void OnDisable() { Item.OnVisibleChanged -= Refresh; } private void RefreshImmediate() { StopAllCoroutines(); _transform.localScale = Item.Visible ? _scaleWhenVisible : _scaleWhenInvisible; } private void Refresh() { StopAllCoroutines(); StartCoroutine(_item.Visible ? Scale(_transform.localScale, _scaleWhenVisible) : Scale(_transform.localScale, _scaleWhenInvisible) ); } private IEnumerator Scale(Vector3 startScale, Vector3 endScale) { float progress = Mathf.InverseLerp(startScale.x, endScale.x, _transform.localScale.x); for (float timer = progress * animationSeconds; timer < animationSeconds; timer += Time.deltaTime) { progress = timer / animationSeconds; _transform.localScale = Vector3.Lerp(startScale, endScale, progress); yield return null; } _transform.localScale = endScale; } } }