79 lines
1.9 KiB
C#
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();
|
|
}
|
|
|
|
}
|
|
}
|