canto/Assets/Scripts/UI/Effect/FadeEffect.cs
2025-07-18 20:38:44 -04:00

79 lines
1.9 KiB
C#

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<R3.Unit> Execute(VisualElement target, CancellationToken token)
{
target.style.opacity = From;
var to = To;
return Observable.NextFrame(cancellationToken: token)
.Do(_ =>
{
target.style.opacity = to;
})
.AsUnitObservable();
}
}
}