From 4ea0f58bc751ab52951e8017d40aef27759e5c8f Mon Sep 17 00:00:00 2001 From: rowan Date: Fri, 18 Jul 2025 20:38:44 -0400 Subject: [PATCH] ui effects working --- .../UI/Fade In.asset} | 15 ++-- .../UI/Fade In.asset.meta} | 2 +- Assets/SOAP/UI/Modal.asset | 7 +- Assets/SOAP/UI/Modal.asset.meta | 2 +- Assets/SOAP/UI/New Modal Element.asset | 17 ----- Assets/SOAP/UI/New Modal Element.asset.meta | 8 --- Assets/Scripts/Extension/Collection.cs | 6 ++ Assets/Scripts/Extension/Collection.cs.meta | 2 + Assets/Scripts/Extension/Observable.cs | 24 +++++++ .../Scripts/UI/Effect/AddTransitionEffect.cs | 40 +++++++++++ .../UI/Effect/AddTransitionEffect.cs.meta | 2 + Assets/Scripts/UI/Effect/FadeEffect.cs | 68 +++++++++++++----- Assets/Scripts/UI/Effect/IUIEffect.cs | 16 ----- Assets/Scripts/UI/Effect/IUiEffect.cs | 18 +++++ .../{IUIEffect.cs.meta => IUiEffect.cs.meta} | 0 Assets/Scripts/UI/Elements/ModalElement.cs | 10 ++- Assets/Scripts/UI/Notification.cs | 2 +- .../UI/Orchestration/SpawnElementRequest.cs | 6 +- .../{UIOrchestrator.cs => UiOrchestrator.cs} | 4 +- ...strator.cs.meta => UiOrchestrator.cs.meta} | 0 .../{UISceneManager.cs => UiSceneManager.cs} | 53 +++++++------- ...Manager.cs.meta => UiSceneManager.cs.meta} | 0 Assets/Scripts/UI/TestThing.cs | 2 +- Assets/Scripts/UI/UIElement.cs | 31 -------- Assets/Scripts/UI/UiElement.cs | 56 +++++++++++++++ .../{UIElement.cs.meta => UiElement.cs.meta} | 0 Assets/Scripts/UI/UiElementInstance.cs | 71 +++++++++++++++++++ Assets/Scripts/UI/UiElementInstance.cs.meta | 2 + 28 files changed, 327 insertions(+), 137 deletions(-) rename Assets/{UI/New Transition Effect.asset => SOAP/UI/Fade In.asset} (75%) rename Assets/{UI/New Transition Effect.asset.meta => SOAP/UI/Fade In.asset.meta} (79%) delete mode 100644 Assets/SOAP/UI/New Modal Element.asset delete mode 100644 Assets/SOAP/UI/New Modal Element.asset.meta create mode 100644 Assets/Scripts/Extension/Collection.cs create mode 100644 Assets/Scripts/Extension/Collection.cs.meta create mode 100644 Assets/Scripts/UI/Effect/AddTransitionEffect.cs create mode 100644 Assets/Scripts/UI/Effect/AddTransitionEffect.cs.meta delete mode 100644 Assets/Scripts/UI/Effect/IUIEffect.cs create mode 100644 Assets/Scripts/UI/Effect/IUiEffect.cs rename Assets/Scripts/UI/Effect/{IUIEffect.cs.meta => IUiEffect.cs.meta} (100%) rename Assets/Scripts/UI/Orchestration/{UIOrchestrator.cs => UiOrchestrator.cs} (85%) rename Assets/Scripts/UI/Orchestration/{UIOrchestrator.cs.meta => UiOrchestrator.cs.meta} (100%) rename Assets/Scripts/UI/Orchestration/{UISceneManager.cs => UiSceneManager.cs} (77%) rename Assets/Scripts/UI/Orchestration/{UISceneManager.cs.meta => UiSceneManager.cs.meta} (100%) delete mode 100644 Assets/Scripts/UI/UIElement.cs create mode 100644 Assets/Scripts/UI/UiElement.cs rename Assets/Scripts/UI/{UIElement.cs.meta => UiElement.cs.meta} (100%) create mode 100644 Assets/Scripts/UI/UiElementInstance.cs create mode 100644 Assets/Scripts/UI/UiElementInstance.cs.meta diff --git a/Assets/UI/New Transition Effect.asset b/Assets/SOAP/UI/Fade In.asset similarity index 75% rename from Assets/UI/New Transition Effect.asset rename to Assets/SOAP/UI/Fade In.asset index 26b1c57..14da527 100644 --- a/Assets/UI/New Transition Effect.asset +++ b/Assets/SOAP/UI/Fade In.asset @@ -10,13 +10,16 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 94cc50e7b5f20a817aef3384d0889279, type: 3} - m_Name: New Transition Effect + m_Name: Fade In m_EditorClassIdentifier: - propertyName: + addTransition: 1 + propertyName: opacity duration: - duration: 0 - unit: 0 - easing: 0 + duration: 0.3 + unit: 2 + easing: 3 delay: duration: 0 - unit: 0 + unit: 2 + from: 0 + to: 1 diff --git a/Assets/UI/New Transition Effect.asset.meta b/Assets/SOAP/UI/Fade In.asset.meta similarity index 79% rename from Assets/UI/New Transition Effect.asset.meta rename to Assets/SOAP/UI/Fade In.asset.meta index cf376fd..ed7e96d 100644 --- a/Assets/UI/New Transition Effect.asset.meta +++ b/Assets/SOAP/UI/Fade In.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 630c186ef2ab4b37495b5001d208878f +guid: 0902dc21238be2bb3ae758e1d5218922 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/SOAP/UI/Modal.asset b/Assets/SOAP/UI/Modal.asset index 00dcf15..184698c 100644 --- a/Assets/SOAP/UI/Modal.asset +++ b/Assets/SOAP/UI/Modal.asset @@ -9,9 +9,12 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 0} + m_Script: {fileID: 11500000, guid: 0b01085379e9a10319622dd3dd23f4bd, type: 3} m_Name: Modal - m_EditorClassIdentifier: Assembly-CSharp:KitsuneCafe.UI:ModalElementSO + m_EditorClassIdentifier: visualTreeAsset: {fileID: 9197481963319205126, guid: bc70bdaaf37609283aac14435c5441a2, type: 3} + effects: + - timing: 0 + effect: {fileID: 11400000, guid: 0902dc21238be2bb3ae758e1d5218922, type: 2} titleId: title contentId: content diff --git a/Assets/SOAP/UI/Modal.asset.meta b/Assets/SOAP/UI/Modal.asset.meta index a8fdc05..04805e6 100644 --- a/Assets/SOAP/UI/Modal.asset.meta +++ b/Assets/SOAP/UI/Modal.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1a47b12328bfde496ab2f3847d762a79 +guid: 71a6f29fae4392a4f97870a52b6adf1e NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/SOAP/UI/New Modal Element.asset b/Assets/SOAP/UI/New Modal Element.asset deleted file mode 100644 index 9f325f3..0000000 --- a/Assets/SOAP/UI/New Modal Element.asset +++ /dev/null @@ -1,17 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0b01085379e9a10319622dd3dd23f4bd, type: 3} - m_Name: New Modal Element - m_EditorClassIdentifier: - visualTreeAsset: {fileID: 9197481963319205126, guid: bc70bdaaf37609283aac14435c5441a2, type: 3} - titleId: title - contentId: content diff --git a/Assets/SOAP/UI/New Modal Element.asset.meta b/Assets/SOAP/UI/New Modal Element.asset.meta deleted file mode 100644 index 04805e6..0000000 --- a/Assets/SOAP/UI/New Modal Element.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 71a6f29fae4392a4f97870a52b6adf1e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Extension/Collection.cs b/Assets/Scripts/Extension/Collection.cs new file mode 100644 index 0000000..d3f5eb9 --- /dev/null +++ b/Assets/Scripts/Extension/Collection.cs @@ -0,0 +1,6 @@ +namespace KitsuneCafe.Extension +{ + public static class CollectionExtension + { + } +} diff --git a/Assets/Scripts/Extension/Collection.cs.meta b/Assets/Scripts/Extension/Collection.cs.meta new file mode 100644 index 0000000..0848803 --- /dev/null +++ b/Assets/Scripts/Extension/Collection.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4134cfdaf5630d9e49cdf518b31bc662 \ No newline at end of file diff --git a/Assets/Scripts/Extension/Observable.cs b/Assets/Scripts/Extension/Observable.cs index 517660a..aeff464 100644 --- a/Assets/Scripts/Extension/Observable.cs +++ b/Assets/Scripts/Extension/Observable.cs @@ -4,6 +4,7 @@ using System; using KitsuneCafe.System; using System.Collections.Generic; using System.Threading; +using UnityEngine.Rendering.Universal; namespace KitsuneCafe.Extension { @@ -177,6 +178,29 @@ namespace KitsuneCafe.Extension { return source.Where(Func.Identity); } + + public static Observable ObserveBool(this T component, Func predicate) where T : MonoBehaviour + { + if (predicate(component)) + { + return Observable.Return(component); + } + + return Observable.EveryValueChanged(component, predicate) + .Where(Func.Identity) + .Take(1) + .Select(_ => component); + } + + public static Observable ObserveAwake(this T component) where T : MonoBehaviour + { + return component.ObserveBool(c => c.didAwake); + } + + public static Observable ObserveStart(this T component) where T : MonoBehaviour + { + return component.ObserveBool(c => c.didStart); + } } } diff --git a/Assets/Scripts/UI/Effect/AddTransitionEffect.cs b/Assets/Scripts/UI/Effect/AddTransitionEffect.cs new file mode 100644 index 0000000..61bf43a --- /dev/null +++ b/Assets/Scripts/UI/Effect/AddTransitionEffect.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Threading; +using R3; +using UnityEngine.UIElements; + +namespace KitsuneCafe.UI +{ + public readonly struct AddTransitionEffect : IUiEffect + { + public readonly StylePropertyName PropertyName; + public readonly TimeValue Duration; + public readonly EasingFunction Easing; + public readonly TimeValue Delay; + public readonly IUiEffect Effect; + + public AddTransitionEffect(StylePropertyName name, TimeValue duration, EasingFunction easing, TimeValue delay, IUiEffect effect) + { + PropertyName = name; + Duration = duration; + Easing = easing; + Delay = delay; + Effect = effect; + } + + private static StyleList ToStyleList(T value) + { + return new StyleList(new List { value }); + } + + public Observable Execute(VisualElement target, CancellationToken token) + { + target.style.transitionProperty = ToStyleList(PropertyName); + target.style.transitionDuration = ToStyleList(Duration); + target.style.transitionTimingFunction = ToStyleList(Easing); + target.style.transitionDelay = ToStyleList(Delay); + + return Effect.Execute(target, token); + } + } +} diff --git a/Assets/Scripts/UI/Effect/AddTransitionEffect.cs.meta b/Assets/Scripts/UI/Effect/AddTransitionEffect.cs.meta new file mode 100644 index 0000000..2a61a5f --- /dev/null +++ b/Assets/Scripts/UI/Effect/AddTransitionEffect.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a0412a2b6dff88311aec68b3fc4dee47 \ No newline at end of file diff --git a/Assets/Scripts/UI/Effect/FadeEffect.cs b/Assets/Scripts/UI/Effect/FadeEffect.cs index 2275360..2e22402 100644 --- a/Assets/Scripts/UI/Effect/FadeEffect.cs +++ b/Assets/Scripts/UI/Effect/FadeEffect.cs @@ -1,4 +1,6 @@ +using System.Threading; using KitsuneCafe.System; +using KitsuneCafe.System.Attributes; using R3; using UnityEngine; using UnityEngine.UIElements; @@ -6,44 +8,72 @@ using UnityEngine.UIElements; namespace KitsuneCafe.UI { [CreateAssetMenu(menuName = KitsuneCafeMenu.UiEffect + "Fade")] - public class TransitionEffect : BaseUIEffect + public class FadeEffect : BaseUiEffect { [SerializeField] - private string propertyName; + private bool addTransition = false; - [SerializeField] + [SerializeField, ShowIf("addTransition")] + private string propertyName = "opacity"; + + [SerializeField, ShowIf("addTransition")] private SerializableDuration duration; - [SerializeField] + [SerializeField, ShowIf("addTransition")] private EasingMode easing; - [SerializeField] + [SerializeField, ShowIf("addTransition")] private SerializableDuration delay; - public override IUIEffect Instantiate() + [SerializeField, Range(0f, 1f)] + private float from; + + [SerializeField, Range(0f, 1f)] + private float to; + + public override IUiEffect Instantiate() { - return new TransitionEffectInstance(propertyName, duration, easing, delay); + var fade = new FadeEffectInstance(from, to); + + if (addTransition) + { + return new AddTransitionEffect(propertyName, duration, easing, delay, fade); + } + + return fade; } } - public readonly struct TransitionEffectInstance : IUIEffect + public readonly struct FadeEffectInstance : IUiEffect { - public readonly StylePropertyName PropertyName; - public readonly TimeValue Duration; - public readonly EasingFunction Easing; - public readonly TimeValue Delay; + public readonly float From; + public readonly float To; - public TransitionEffectInstance(StylePropertyName name, TimeValue duration, EasingFunction easing, TimeValue delay) + public FadeEffectInstance(float from, float to) { - PropertyName = name; - Duration = duration; - Easing = easing; - Delay = delay; + From = from; + To = to; } - public Observable Execute(VisualElement target) + private void DoTransition(VisualElement target) { - return Observable.Empty(); + 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(); + } + } } diff --git a/Assets/Scripts/UI/Effect/IUIEffect.cs b/Assets/Scripts/UI/Effect/IUIEffect.cs deleted file mode 100644 index 9a3bc7e..0000000 --- a/Assets/Scripts/UI/Effect/IUIEffect.cs +++ /dev/null @@ -1,16 +0,0 @@ -using R3; -using UnityEngine; -using UnityEngine.UIElements; - -namespace KitsuneCafe.UI -{ - public interface IUIEffect - { - Observable Execute(VisualElement target); - } - - public abstract class BaseUIEffect : ScriptableObject - { - public abstract IUIEffect Instantiate(); - } -} diff --git a/Assets/Scripts/UI/Effect/IUiEffect.cs b/Assets/Scripts/UI/Effect/IUiEffect.cs new file mode 100644 index 0000000..3491efa --- /dev/null +++ b/Assets/Scripts/UI/Effect/IUiEffect.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Threading; +using R3; +using UnityEngine; +using UnityEngine.UIElements; + +namespace KitsuneCafe.UI +{ + public interface IUiEffect + { + Observable Execute(VisualElement target, CancellationToken token); + } + + public abstract class BaseUiEffect : ScriptableObject + { + public abstract IUiEffect Instantiate(); + } +} diff --git a/Assets/Scripts/UI/Effect/IUIEffect.cs.meta b/Assets/Scripts/UI/Effect/IUiEffect.cs.meta similarity index 100% rename from Assets/Scripts/UI/Effect/IUIEffect.cs.meta rename to Assets/Scripts/UI/Effect/IUiEffect.cs.meta diff --git a/Assets/Scripts/UI/Elements/ModalElement.cs b/Assets/Scripts/UI/Elements/ModalElement.cs index 7fdcbab..cf498b8 100644 --- a/Assets/Scripts/UI/Elements/ModalElement.cs +++ b/Assets/Scripts/UI/Elements/ModalElement.cs @@ -1,10 +1,11 @@ +using System.Collections.Generic; using KitsuneCafe.System; using UnityEngine; using UnityEngine.UIElements; namespace KitsuneCafe.UI { - public readonly struct ModalElementInstance : IUIElement + public readonly struct ModalElementInstance : IUiElement { public readonly string Title; public readonly string Content; @@ -31,10 +32,15 @@ namespace KitsuneCafe.UI ve.Q