Files

67 lines
3.8 KiB
Markdown
Raw Permalink Normal View History

2026-05-03 14:06:26 +08:00
本节的难度比较大,基本上全部都是代码相关的问题,应该着重弄懂,可以默写.
在上节课当中我们已经实现了对象池,可以从对象池中拿到卡牌,释放卡牌.这节课我们需要实现的内容是制作卡牌库实现抽卡.
这里我们首先要弄明白,卡牌库,抽牌堆,手牌,弃牌堆这些内容.
我们在游戏不断进行过程中,每一个关卡胜利之后,我们都会获得一张卡牌,去填充我们的卡牌库.
在每一个关卡开始的时候,我们的抽牌堆会进行更新,将我们的卡牌库的所有牌都充入其中,同时抽出几张牌放入我们的手牌当中,当手牌打出就进入弃牌堆,当游戏结束剩余的卡牌也要进入弃牌堆,因此上述逻辑是我们本节课的关节内容.
我们依照上述内容进行本节课的展开
### 制作卡牌库
我们的游戏是在不断的打怪升级中发展的,因此我们的卡牌库也是不断更新的,但是我们游戏最开始的时候有一套最初始的卡牌库,因此游戏当中的卡牌库一共有两个.
1.游戏最开始的卡牌库
2.随着游戏不断进行不断更新的卡牌库(当前卡牌库)
确定好了卡牌库,我们要确定卡牌库的内容,我们的卡牌库要储存各种各样的卡牌,还要储存他们的数量,简化就是卡牌的种类和卡牌的数量,因此我们使用SO文件创建卡牌库,他当中有一个列表,列表的类型是自定义的类型,这个类型只有两个字段,一个CardDataSO表明类型,一个int表明数量.
同时在我们的CardManager当中,声明这两个卡牌库,并且在初始化的时候,将游戏最开始的卡牌库赋值给当前卡牌库.
### 实现抽卡
抽卡我们需要单独创建一个空物体,并且为他创造一个脚本来实现抽卡的相关逻辑.
我们的抽卡,就是从抽牌堆中拿出一张牌,放入我们的手牌堆当中.
因此我们需要这三个列表.
```
private List<CardDataSO> drawDeck = new(); //抽牌堆
    private List<CardDataSO> disCardDeck = new();//弃牌堆
    private List<Card> handCardObjectList = new();//当前的手牌(每回合)
```
同时在游戏开始的时候我们要初始化我们的抽牌堆,这样就需要我们有CardManager,来初始化我们的抽牌堆,我们将CardManager也创建.
在这节课当中,我们这个脚本需要实现的逻辑就是
一.初始化抽牌库
二.抽卡
1.初始化抽牌库我们需要创建一个函数,在start中调用,这个函数的内容就是使用循环语句,将
CardManager当中的currentLibrary一一赋值给我们的抽牌堆,代码如下
```
public void InitializeDeck()
    {
        drawDeck.Clear();//对抽牌堆进行清理
        //循环遍历当前的卡牌库,放进我们的抽牌堆
        foreach (var enter in cardManager.currentLibrary.cardLibraryList)
        {
            for (int i = 0; i < enter.amount; i++)
            {
                drawDeck.Add(enter.cardDataSO);
            }
        }
        //TODO: 洗牌/更新抽牌堆和弃牌堆
    }
```
2.抽卡就是需要我们从抽牌堆当中得到一个SO的文件,然后从对象池中生成一个卡片,并且将这个SO文件用来初始化这个卡牌,代码如下
```
public void DrawCard(int amount)
    {
        for (int i = 0; i < amount; i++)
        {
            if (drawDeck.Count == 0)
            {
                //TODO: 洗牌/更新抽牌堆和弃牌堆
            }
            CardDataSO currentCardData = drawDeck[0];
            drawDeck.RemoveAt(0);
            var card = cardManager.GetCard().GetComponent<Card>();//为什么这里会实例化出来一个新的card对象呢?
            card.Init(currentCardData);
            handCardObjectList.Add(card);
        }
    }
```