本节的难度比较大,基本上全部都是代码相关的问题,应该着重弄懂,可以默写. 在上节课当中我们已经实现了对象池,可以从对象池中拿到卡牌,释放卡牌.这节课我们需要实现的内容是制作卡牌库实现抽卡. 这里我们首先要弄明白,卡牌库,抽牌堆,手牌,弃牌堆这些内容. 我们在游戏不断进行过程中,每一个关卡胜利之后,我们都会获得一张卡牌,去填充我们的卡牌库. 在每一个关卡开始的时候,我们的抽牌堆会进行更新,将我们的卡牌库的所有牌都充入其中,同时抽出几张牌放入我们的手牌当中,当手牌打出就进入弃牌堆,当游戏结束剩余的卡牌也要进入弃牌堆,因此上述逻辑是我们本节课的关节内容. 我们依照上述内容进行本节课的展开 ### 制作卡牌库 我们的游戏是在不断的打怪升级中发展的,因此我们的卡牌库也是不断更新的,但是我们游戏最开始的时候有一套最初始的卡牌库,因此游戏当中的卡牌库一共有两个. 1.游戏最开始的卡牌库 2.随着游戏不断进行不断更新的卡牌库(当前卡牌库) 确定好了卡牌库,我们要确定卡牌库的内容,我们的卡牌库要储存各种各样的卡牌,还要储存他们的数量,简化就是卡牌的种类和卡牌的数量,因此我们使用SO文件创建卡牌库,他当中有一个列表,列表的类型是自定义的类型,这个类型只有两个字段,一个CardDataSO表明类型,一个int表明数量. 同时在我们的CardManager当中,声明这两个卡牌库,并且在初始化的时候,将游戏最开始的卡牌库赋值给当前卡牌库. ### 实现抽卡 抽卡我们需要单独创建一个空物体,并且为他创造一个脚本来实现抽卡的相关逻辑. 我们的抽卡,就是从抽牌堆中拿出一张牌,放入我们的手牌堆当中. 因此我们需要这三个列表. ``` private List drawDeck = new(); //抽牌堆     private List disCardDeck = new();//弃牌堆     private List 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.Init(currentCardData);             handCardObjectList.Add(card);         }     } ```