diff --git a/ProjectNLD/Assets/Code/Scripts/Framework/UI/Pictorial/PictorialBackground.cs b/ProjectNLD/Assets/Code/Scripts/Framework/UI/Pictorial/PictorialBackground.cs
index 163496579a4..0f7e1e9145e 100644
--- a/ProjectNLD/Assets/Code/Scripts/Framework/UI/Pictorial/PictorialBackground.cs
+++ b/ProjectNLD/Assets/Code/Scripts/Framework/UI/Pictorial/PictorialBackground.cs
@@ -545,7 +545,7 @@ namespace Framework.UI.Pictorial
if (hasExitAnim)
{
Debug.Log("[画报系统] 播放旧画报退出动画");
- await PlayExitAnimAsync(oldAnimData);
+ await PlayExitAnimAsync(oldAnimData, token);
if (token.IsCancellationRequested)
{
Debug.Log("[画报系统] 构建已被新请求取消(退出动画后)");
@@ -734,7 +734,7 @@ namespace Framework.UI.Pictorial
if (hasEnterAnim || hasCustomAnim)
{
Debug.Log("[画报系统] 播放新画报进入动画");
- await PlayEnterAnimAsync(animData, bgImage);
+ await PlayEnterAnimAsync(animData, bgImage, token);
}
}
}
@@ -746,7 +746,7 @@ namespace Framework.UI.Pictorial
/// 进入动画:元素从(实际位置 + offset)移动回实际位置,alpha 从 alphaStart 到 alphaEnd
/// 各元素独立 duration + delay,并行播放,等待所有元素完成
///
- public async UniTask PlayEnterAnimAsync(PictorialAnimData animData, Image bgImageOverride = null)
+ public async UniTask PlayEnterAnimAsync(PictorialAnimData animData, Image bgImageOverride = null, System.Threading.CancellationToken cancellationToken = default)
{
if (animData == null) return;
@@ -761,7 +761,7 @@ namespace Framework.UI.Pictorial
if (targets.Count == 0) return;
- await RunAnimTweenParallel(targets, isEnter: true);
+ await RunAnimTweenParallel(targets, isEnter: true, cancellationToken);
}
///
@@ -769,7 +769,7 @@ namespace Framework.UI.Pictorial
/// 退出动画:元素从实际位置移动到(实际位置 + offset),alpha 从 alphaStart 到 alphaEnd
/// 各元素独立 duration + delay,并行播放,等待所有元素完成
///
- public async UniTask PlayExitAnimAsync(PictorialAnimData animData)
+ public async UniTask PlayExitAnimAsync(PictorialAnimData animData, System.Threading.CancellationToken cancellationToken = default)
{
if (animData == null) return;
@@ -789,7 +789,7 @@ namespace Framework.UI.Pictorial
if (targets.Count == 0) return;
- await RunAnimTweenParallel(targets, isEnter: false);
+ await RunAnimTweenParallel(targets, isEnter: false, cancellationToken);
}
///
@@ -947,13 +947,14 @@ namespace Framework.UI.Pictorial
/// isEnter=true : 从 (basePos + offset, alphaStart) 延迟后运动到 (basePos, alphaEnd)
/// isEnter=false: 从 (basePos, alphaStart) 延迟后运动到 (basePos + offset, alphaEnd)
///
- private async UniTask RunAnimTweenParallel(List targets, bool isEnter)
+ private async UniTask RunAnimTweenParallel(List targets, bool isEnter, System.Threading.CancellationToken cancellationToken = default)
{
if (targets.Count == 0) return;
// 先将所有目标设置为延迟前的初始可见状态(延迟期间保持在起始位置+起始alpha)
foreach (var t in targets)
{
+ if (cancellationToken.IsCancellationRequested) return;
if (t.rectTransform == null) continue;
t.rectTransform.anchoredPosition3D = isEnter ? (t.basePosition + t.animData.offset) : t.basePosition;
@@ -989,14 +990,14 @@ namespace Framework.UI.Pictorial
}
// 并行启动每个目标的独立动画任务,整体 WhenAll 等待全部完成
- var tasks = targets.Select(t => RunSingleAnimTween(t, isEnter)).ToArray();
+ var tasks = targets.Select(t => RunSingleAnimTween(t, isEnter, cancellationToken)).ToArray();
await UniTask.WhenAll(tasks);
}
///
/// 单个动画目标的补间(delay 秒等待后再播放 duration 秒动画)
///
- private async UniTask RunSingleAnimTween(AnimTarget t, bool isEnter)
+ private async UniTask RunSingleAnimTween(AnimTarget t, bool isEnter, System.Threading.CancellationToken cancellationToken = default)
{
if (t.rectTransform == null)
{
@@ -1018,6 +1019,7 @@ namespace Framework.UI.Pictorial
{
await UniTask.Yield();
waited += Time.unscaledDeltaTime;
+ if (cancellationToken.IsCancellationRequested) return;
// 延迟期间 rectTransform 可能已销毁
if (t.rectTransform == null)
{
@@ -1049,6 +1051,7 @@ namespace Framework.UI.Pictorial
{
await UniTask.Yield();
elapsed += Time.unscaledDeltaTime;
+ if (cancellationToken.IsCancellationRequested) return;
if (t.rectTransform == null) return;
float rawT = Mathf.Clamp01(elapsed / duration);
@@ -1064,7 +1067,7 @@ namespace Framework.UI.Pictorial
if (t.image != null)
{
SetImageAlpha(t.image, currentAlpha);
-
+
// 如果这是画报元素,同步其 ButtonMagnifiers 的 alpha(如果未配置独立动画)
if (t.itemIndex >= 0 && t.itemIndex < pictorialData.items.Count)
{