112 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|