using System.Threading; using KitsuneCafe.System; using KitsuneCafe.System.Attributes; using R3; using UnityEngine; using UnityEngine.UIElements; namespace KitsuneCafe.UI { [CreateAssetMenu(menuName = KitsuneCafeMenu.UiEffect + "Fade")] public class FadeEffect : BaseUiEffect { [SerializeField] private bool addTransition = false; [SerializeField, ShowIf("addTransition")] private string propertyName = "opacity"; [SerializeField, ShowIf("addTransition")] private SerializableDuration duration; [SerializeField, ShowIf("addTransition")] private EasingMode easing; [SerializeField, ShowIf("addTransition")] private SerializableDuration delay; [SerializeField, Range(0f, 1f)] private float from; [SerializeField, Range(0f, 1f)] private float to; public override IUiEffect Instantiate() { var fade = new FadeEffectInstance(from, to); if (addTransition) { return new AddTransitionEffect(propertyName, duration, easing, delay, fade); } return fade; } } public readonly struct FadeEffectInstance : IUiEffect { public readonly float From; public readonly float To; public FadeEffectInstance(float from, float to) { From = from; To = to; } private void DoTransition(VisualElement target) { target.style.opacity = From; target.style.opacity = To; } public Observable Execute(VisualElement target, CancellationToken token) { target.style.opacity = From; var to = To; return Observable.NextFrame(cancellationToken: token) .Do(_ => { target.style.opacity = to; }) .AsUnitObservable(); } } }