using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; namespace Deck { public class DeckVisual : MonoBehaviour { [SerializeField] private AudioManager audio; [SerializeField] private GameObject cardBack; [SerializeField] private Deck deck; [SerializeField] private float staggerOffset = 0.1f; [SerializeField] Transform topOfDeck; [Header("Shuffle")] [SerializeField] private float moveDistance = 10f; [SerializeField] private float moveSpeed = 5f; private Vector3 _staggerVector; private Stack _cardStack = new Stack(); private Sprite _cardBack; private void OnEnable() { deck.CardDrawn += HandleCardDrawn; deck.CardAdded += HandCardAdded; deck.Shuffled += HandleDeckShuffled; } private void OnDisable() { deck.CardDrawn -= HandleCardDrawn; deck.CardAdded -= HandCardAdded; deck.Shuffled += HandleDeckShuffled; } private void Awake() { _staggerVector = new Vector3(staggerOffset, staggerOffset, -0.01f); } private void Start() { _cardBack = deck.GetCardBack(); topOfDeck.position = deck.gameObject.transform.position; for (int i = 0; i < deck.GetCardCount(); i++) { topOfDeck.position += _staggerVector; GameObject card = Instantiate(cardBack, topOfDeck.position, Quaternion.identity, deck.gameObject.transform); card.GetComponent().sprite = _cardBack; _cardStack.Push(card); } } private void HandleCardDrawn() { topOfDeck.position -= _staggerVector; Destroy(_cardStack.Pop()); } private void HandCardAdded() { topOfDeck.position += _staggerVector; GameObject card = Instantiate(cardBack, topOfDeck.position, Quaternion.identity, deck.gameObject.transform); _cardStack.Push(card); card.GetComponent().sprite = _cardBack; } private void HandleDeckShuffled() { audio.Play("shuffle"); List _cards = _cardStack.ToList(); for (int i = 0; i < _cards.Count; i++) { StartCoroutine(PlayCardShuffleAnimation(_cards[i], i)); } } private IEnumerator PlayCardShuffleAnimation(GameObject card, int index) { Vector3 originalPosition = card.transform.localPosition; Vector3 moveDirection = (index % 2 == 0) ? new Vector3(1, 1, 0) : new Vector3(-1, -1, 0); // Move out yield return MoveCard(card, originalPosition + moveDirection * moveDistance); // Move back yield return MoveCard(card, originalPosition - moveDirection * moveDistance); // Return to original position yield return MoveCard(card, originalPosition); } private IEnumerator MoveCard(GameObject card, Vector3 targetPosition) { while (Vector3.Distance(card.transform.localPosition, targetPosition) > 0.01f) { card.transform.localPosition = Vector3.Lerp( card.transform.localPosition, targetPosition, Time.deltaTime * moveSpeed ); yield return null; } } } }