添加了UXService->UIToolkitPanel的过渡动画

This commit is contained in:
CortexCore 2024-12-26 23:07:15 +08:00
parent 1c00d8fb1c
commit f1a6ede97b
3 changed files with 67 additions and 27 deletions

View File

@ -60,7 +60,7 @@ namespace BITKit.Console
BIT4Log.Warning<UXService>("未找到ux_panel_settings"); BIT4Log.Warning<UXService>("未找到ux_panel_settings");
throw; throw;
} }
document.visualTreeAsset = await ModService.LoadAsset<VisualTreeAsset>("ux_console"); document.visualTreeAsset = await ModService.LoadAsset<VisualTreeAsset>("ui_console");
_rootVisualElement = document.rootVisualElement; _rootVisualElement = document.rootVisualElement;

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Threading; using System.Threading;
using BITKit.Mod; using BITKit.Mod;
using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks;
@ -8,6 +9,8 @@ using UnityEngine;
using UnityEngine.Serialization; using UnityEngine.Serialization;
using UnityEngine.InputSystem; using UnityEngine.InputSystem;
using UnityEngine.UIElements; using UnityEngine.UIElements;
using Debug = UnityEngine.Debug;
// ReSharper disable MemberCanBeProtected.Global // ReSharper disable MemberCanBeProtected.Global
// ReSharper disable ClassWithVirtualMembersNeverInherited.Global // ReSharper disable ClassWithVirtualMembersNeverInherited.Global
// ReSharper disable UnusedMember.Global // ReSharper disable UnusedMember.Global
@ -30,6 +33,7 @@ namespace BITKit.UX
protected VisualTreeAsset VisualTreeAsset { get; private set; } protected VisualTreeAsset VisualTreeAsset { get; private set; }
private readonly ValidHandle _isBusy = new(); private readonly ValidHandle _isBusy = new();
public readonly UniTaskCompletionSource WaitUtilInitialized = new(); public readonly UniTaskCompletionSource WaitUtilInitialized = new();
protected UniTaskCompletionSource WaitUtilTransitionCompleted=new();
protected UIToolKitPanel(IUXService uxService) protected UIToolKitPanel(IUXService uxService)
{ {
UXService = uxService; UXService = uxService;
@ -83,11 +87,26 @@ namespace BITKit.UX
await OnInitiatedAsync.UniTaskFunc(); await OnInitiatedAsync.UniTaskFunc();
WaitUtilInitialized.TrySetResult(); WaitUtilInitialized.TrySetResult();
RootVisualElement.RegisterCallback<TransitionRunEvent>(OnTransitionRun);
RootVisualElement.RegisterCallback<TransitionStartEvent>(OnTransitionStart);
RootVisualElement.RegisterCallback<TransitionEndEvent>(OnTransitionEnd);
RootVisualElement.RegisterCallback<TransitionCancelEvent>(OnTransitionEnd);
WaitUtilTransitionCompleted.TrySetResult();
} }
} }
protected virtual Optional<float> EntryDuration { get; }= new(); private void OnTransitionStart(TransitionStartEvent evt)
protected virtual Optional<float> ExitDuration { get; }= new(); {
WaitUtilTransitionCompleted = new();
}
private void OnTransitionRun(TransitionRunEvent evt)
{
//WaitUtilTransitionCompleted = new();
}
protected static readonly InputActionGroup InputActionGroup = new() protected static readonly InputActionGroup InputActionGroup = new()
{ {
allowGlobalActivation = false, allowGlobalActivation = false,
@ -117,27 +136,21 @@ namespace BITKit.UX
{ {
await InitializeAsync(); await InitializeAsync();
//WaitUtilTransitionCompleted = new();
RootVisualElement.SetActive(true); RootVisualElement.SetActive(true);
//await UniTask.NextFrame();
RootVisualElement.AddToClassList(USSEntry); RootVisualElement.AddToClassList(USSEntry);
await UniTask.NextFrame();
RootVisualElement.AddToClassList(USSEntryAsync); RootVisualElement.AddToClassList(USSEntryAsync);
await UniTask.NextFrame();
if (EntryDuration.Allow) await EntryAsync();
{
var task = EntryAsync();
var durationTask = UniTask.Delay(TimeSpan.FromSeconds(EntryDuration.Value));
await durationTask;
RootVisualElement.RemoveFromClassList(USSEntry);
RootVisualElement.RemoveFromClassList(USSEntryAsync);
RootVisualElement.AddToClassList(USSEntered);
await task;
}
else
{
await EntryAsync();
}
try try
{ {
@ -150,9 +163,17 @@ namespace BITKit.UX
{ {
BIT4Log.LogException(e); BIT4Log.LogException(e);
} }
await WaitUtilTransitionCompleted.Task;
} RootVisualElement.AddToClassList(USSEntered);
public virtual UniTask EntryAsync() }
private void OnTransitionEnd<TChangeEvent>(TChangeEvent evt)
{
WaitUtilTransitionCompleted.TrySetResult();
}
public virtual UniTask EntryAsync()
{ {
return UniTask.CompletedTask; return UniTask.CompletedTask;
} }
@ -160,11 +181,13 @@ namespace BITKit.UX
{ {
OnPanelEntry(); OnPanelEntry();
OnEntryCompleted?.Invoke(); OnEntryCompleted?.Invoke();
RootVisualElement.RemoveFromClassList(USSEntry);
RootVisualElement.RemoveFromClassList(USSEntryAsync);
} }
void IEntryElement.Exit() void IEntryElement.Exit()
{ {
RootVisualElement?.AddToClassList(USSExit);
OnPanelExit(); OnPanelExit();
InputActionGroup.allowInput.RemoveElement(this); InputActionGroup.allowInput.RemoveElement(this);
OnExit?.Invoke(); OnExit?.Invoke();
@ -172,17 +195,26 @@ namespace BITKit.UX
async UniTask IEntryElement.ExitAsync() async UniTask IEntryElement.ExitAsync()
{ {
RootVisualElement?.RemoveFromClassList(USSEntered); RootVisualElement?.RemoveFromClassList(USSEntered);
await UniTask.NextFrame();
RootVisualElement?.AddToClassList(USSExit);
await UniTask.NextFrame();
RootVisualElement?.AddToClassList(USSExitAsync); RootVisualElement?.AddToClassList(USSExitAsync);
await UniTask.NextFrame();
await OnExitAsync.UniTaskFunc(); await OnExitAsync.UniTaskFunc();
if (EntryDuration.Allow is false) return;
await UniTask.Delay(TimeSpan.FromSeconds(EntryDuration.Value)); await WaitUtilTransitionCompleted.Task;
} }
void IEntryElement.Exited() void IEntryElement.Exited()
{ {
RootVisualElement?.RemoveFromClassList(USSExit); RootVisualElement?.RemoveFromClassList(USSExit);
RootVisualElement?.RemoveFromClassList(USSExitAsync); RootVisualElement?.RemoveFromClassList(USSExitAsync);
RootVisualElement?.AddToClassList(USSEntry); RootVisualElement?.AddToClassList(USSExited);
RootVisualElement?.SetActive(false); RootVisualElement?.SetActive(false);
if (AllowReload) if (AllowReload)

View File

@ -3,6 +3,10 @@
-unity-font: initial; -unity-font: initial;
} }
ScrollView {
--unity-metrics-single_line-height: 500px;
}
TabBar Button:disabled { TabBar Button:disabled {
opacity: 1; opacity: 1;
} }
@ -444,6 +448,10 @@ Foldout Toggle Label {
.bitkit-tool-tips.unity-label { .bitkit-tool-tips.unity-label {
background-color: rgb(58, 58, 58); background-color: rgb(58, 58, 58);
color: rgb(255, 255, 255); color: rgb(255, 255, 255);
padding-top: 4px;
padding-right: 8px;
padding-bottom: 4px;
padding-left: 8px;
} }
Button.clear { Button.clear {