WizardDuels/WizardDuelsProject/Assets/Scripts/Deck/DeckVisual.cs
2025-03-19 09:23:22 +01:00

112 lines
3.6 KiB
C#

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<GameObject> _cardStack = new Stack<GameObject>();
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<Image>().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<Image>().sprite = _cardBack;
}
private void HandleDeckShuffled()
{
audio.Play("shuffle");
List<GameObject> _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;
}
}
}
}