덱 만들기

Tom·2024년 12월 22일
0

카드게임 만들기

목록 보기
5/13

매번 카드를 랜덤으로 뽑을수는 없을 노릇이니, 보유중인 카드를 관리할 CardDeck 클래스를 만들어주기로 했다. 여기서 한장씩 뽑아서 손패로 가져오고, 섞어주는 역할을 해주면 되겠지. 스택을 써서 뽑을때마다 Pop해줄지 그냥 리스트로 관리할지 고민해봤는데, 유연성을 생각해봤을때 리스트로 관리하는게 나을 것 같아서 리스트로 관리해주기로 했다.
카드는 카드데이터와 카드로 구성되므로 실질적인 게임오브젝트인 카드가 아닌 카드 데이터를 리스트로 들고있다가 카드가 드로우되는 시점에 데이터를 전달만 해주면 가볍게 들고있을 수 있다.

using System;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;

public class CardDeck : MonoBehaviour
{
    [SerializeField] private List<CardData> cardDeck = new List<CardData>();
    public bool isEmpty { get { return cardDeck.Count == 0; } }

    private void Start()
    {
        foreach (CardValue cardValue in Enum.GetValues(typeof(CardValue)))
        {
            foreach(CardSuit cardSuit in Enum.GetValues(typeof(CardSuit)))
            {
                CardData cardData = new CardData(CardType.common, cardValue, cardSuit);
                Debug.Log(cardData);
            }
        }
    }

    public CardData GetTopCardData()
    {
        int lastCardIndex = cardDeck.Count - 1;
        CardData card = cardDeck[lastCardIndex];
        cardDeck.RemoveAt(lastCardIndex);
        return card;
    }

    public void AddCard(CardData card)
    {
        cardDeck.Add(card);
    }

    public void SuffleDeck()
    {
        for (int i = 0; i < cardDeck.Count; i++)
        {
            int randomIndex = Random.Range(0, cardDeck.Count);
            CardData temp = cardDeck[i];
            cardDeck[i] = cardDeck[randomIndex];
            cardDeck[randomIndex] = temp;
        }
    }
}

리스트로 엔진의 인스펙터에서도 확인하려면 CardData클래스에 [Serializable] 어트리뷰트를 사용해야한다.

[Serializable]
public class CardData
{
    public CardValue cardValue;
    public CardSuit cardSuit;
    public CardType cardType;

    public CardData(CardType _cardType)
    {
        cardType = _cardType;
    }

    public CardData(CardType _cardType, CardValue _cardValue, CardSuit _cardSuit)
    {
        cardValue = _cardValue;
        cardSuit = _cardSuit;
        cardType = _cardType;
    }
}

이러면 시작하는 시점에 덱 한벌의 데이터가 리스트에 담기게 된다. 이제 카드를 뽑을땐 덱에서 가장 위에있는 데이터 받아오기 -> 카드 매니저에서 새로운 카드 생성하기 -> 손에 카드 더해주기의 과정을 거치게 된다.

if(input.GetkeyDown(KeyCode.Space))
{
	CardData cardData = deck.GetTopCardData();
    Card newCard = CardManager.Instance.NewCard(cardData);
    hand.AddNewCard(newCard);
}

이러면 덱에서 카드를 한장씩 뽑는것과 동일한 효과를 낼 수 있다.

profile
여기 글은 보통 틀린 경우가 많음

0개의 댓글

관련 채용 정보