using System.Threading; using KitsuneCafe.Extension; using R3; using UnityEngine; using UnityForge.PropertyDrawers; namespace KitsuneCafe.ItemSystem.Entities { public class EquipmentAnimator : MonoBehaviour { [Header("Dependencies")] [SerializeField] private Animator animator; [SerializeField] private EquipmentInstance equipment; [Header("Combat")] [SerializeField, AnimatorParameterName(AnimatorControllerParameterType.Bool, "animator")] private string readyParam; private CancellationTokenSource disableCancellationTokenSource; private CancellationToken disableCancellationToken => disableCancellationTokenSource.Token; private void OnValidate() { this.TryGetComponentIfNull(ref animator); this.TryGetComponentIfNull(ref equipment); } public void OnEnable() { disableCancellationTokenSource = new(); var d = Disposable.CreateBuilder(); Observable.FromEventHandler( e => equipment.Readied += e, e => equipment.Readied -= e ) .Select(eh => eh.e) .Subscribe(ready => animator.SetBool(readyParam, ready)) .AddTo(ref d); d.RegisterTo(disableCancellationToken); } private void OnDisable() { disableCancellationTokenSource.Cancel(); } } }