架构大更
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Continentis.MainGame.Card;
|
||||
using Continentis.MainGame.Character;
|
||||
using DG.Tweening;
|
||||
using SLSFramework.General;
|
||||
using UniRx;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
@@ -14,51 +14,57 @@ namespace Continentis.MainGame.Commands
|
||||
{
|
||||
private readonly DeckSubmodule deck;
|
||||
private readonly float interval;
|
||||
private readonly float singleCardAnimationDuration = 0.5f; // 单张卡牌的动画时长
|
||||
|
||||
|
||||
private const float SingleCardAnimationDuration = 0.5f;
|
||||
|
||||
public Cmd_ReshuffleDeck(DeckSubmodule deck, float interval)
|
||||
{
|
||||
this.deck = deck;
|
||||
this.interval = interval;
|
||||
}
|
||||
|
||||
protected override IObservable<Unit> OnExecute(CommandContext outerContext)
|
||||
protected override async UniTask ExecuteAsync(CommandContext outerContext)
|
||||
{
|
||||
var cardStream = deck.DiscardPile.ToObservable();
|
||||
var timerStream = Observable.Interval(TimeSpan.FromSeconds(interval));
|
||||
var cards = new List<CardInstance>(deck.DiscardPile);
|
||||
if (cards.Count == 0) return;
|
||||
|
||||
return timerStream
|
||||
.Zip(cardStream, (_, card) => card)
|
||||
.Select(card => MoveCardToDrawPile(card))
|
||||
.Merge()
|
||||
.Last()
|
||||
.Do(_ => deck.DrawPile.Shuffle())
|
||||
.AsUnitObservable();
|
||||
// 使用 Interval 语义:第一张卡在 t=interval 开始(与旧版 Observable.Interval 一致)
|
||||
var tasks = new UniTask[cards.Count];
|
||||
for (int i = 0; i < cards.Count; i++)
|
||||
{
|
||||
CardInstance captured = cards[i];
|
||||
tasks[i] = MoveCardWithDelayAsync(captured, (i + 1) * interval);
|
||||
}
|
||||
await UniTask.WhenAll(tasks);
|
||||
|
||||
deck.DrawPile.Shuffle();
|
||||
}
|
||||
|
||||
private IObservable<Unit> MoveCardToDrawPile(CardInstance card)
|
||||
|
||||
private async UniTask MoveCardWithDelayAsync(CardInstance card, float delay)
|
||||
{
|
||||
if (delay > 0f)
|
||||
await UniTask.Delay(TimeSpan.FromSeconds(delay));
|
||||
await MoveCardToDrawPileAsync(card);
|
||||
}
|
||||
|
||||
private async UniTask MoveCardToDrawPileAsync(CardInstance card)
|
||||
{
|
||||
deck.TransferCard(deck.DiscardPile, deck.DrawPile, card);
|
||||
//card.cardLogic.eventSubmodule.onInitiativeDiscard.Invoke();
|
||||
|
||||
card.handCardView.TransferCardView(CombatUIManager.Instance.combatMainPage.drawPile);
|
||||
|
||||
|
||||
Vector3 deltaMove = Vector3.zero - card.handCardView.cardTransform.localPosition;
|
||||
Vector3 randomLift = new Vector3(Random.Range(-200f, 200f), Random.Range(200f, 600f), 0);
|
||||
|
||||
Vector3 randomLift = new Vector3(Random.Range(-200f, 200f), Random.Range(200f, 600f), 0f);
|
||||
|
||||
card.handCardView.cardOrb.gameObject.SetActive(true);
|
||||
card.handCardView.cardTransform.DOBlendableLocalMoveBy(deltaMove, singleCardAnimationDuration)
|
||||
.OnComplete(() =>
|
||||
{
|
||||
card.handCardView.cardOrb.gameObject.SetActive(false);
|
||||
}).Play();
|
||||
|
||||
card.handCardView.cardTransform.DOBlendableLocalMoveBy(randomLift, singleCardAnimationDuration * 0.5f).SetLoops(2, LoopType.Yoyo).Play();
|
||||
|
||||
card.handCardView.cardTransform.DOScale(Vector3.zero, singleCardAnimationDuration).Play();
|
||||
card.handCardView.cardTransform
|
||||
.DOBlendableLocalMoveBy(deltaMove, SingleCardAnimationDuration)
|
||||
.OnComplete(() => card.handCardView.cardOrb.gameObject.SetActive(false)).Play();
|
||||
card.handCardView.cardTransform
|
||||
.DOBlendableLocalMoveBy(randomLift, SingleCardAnimationDuration * 0.5f)
|
||||
.SetLoops(2, LoopType.Yoyo).Play();
|
||||
card.handCardView.cardTransform.DOScale(Vector3.zero, SingleCardAnimationDuration).Play();
|
||||
|
||||
return Observable.Timer(TimeSpan.FromSeconds(singleCardAnimationDuration)).AsUnitObservable();
|
||||
await UniTask.Delay(TimeSpan.FromSeconds(SingleCardAnimationDuration));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user