Files
2026-05-03 14:06:26 +08:00

67 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
本节的难度比较大,基本上全部都是代码相关的问题,应该着重弄懂,可以默写.
在上节课当中我们已经实现了对象池,可以从对象池中拿到卡牌,释放卡牌.这节课我们需要实现的内容是制作卡牌库实现抽卡.
这里我们首先要弄明白,卡牌库,抽牌堆,手牌,弃牌堆这些内容.
我们在游戏不断进行过程中,每一个关卡胜利之后,我们都会获得一张卡牌,去填充我们的卡牌库.
在每一个关卡开始的时候,我们的抽牌堆会进行更新,将我们的卡牌库的所有牌都充入其中,同时抽出几张牌放入我们的手牌当中,当手牌打出就进入弃牌堆,当游戏结束剩余的卡牌也要进入弃牌堆,因此上述逻辑是我们本节课的关节内容.
我们依照上述内容进行本节课的展开
### 制作卡牌库
我们的游戏是在不断的打怪升级中发展的,因此我们的卡牌库也是不断更新的,但是我们游戏最开始的时候有一套最初始的卡牌库,因此游戏当中的卡牌库一共有两个.
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);
        }
    }
```