67 lines
3.8 KiB
Markdown
67 lines
3.8 KiB
Markdown
|
|
本节的难度比较大,基本上全部都是代码相关的问题,应该着重弄懂,可以默写.
|
|||
|
|
在上节课当中我们已经实现了对象池,可以从对象池中拿到卡牌,释放卡牌.这节课我们需要实现的内容是制作卡牌库实现抽卡.
|
|||
|
|
这里我们首先要弄明白,卡牌库,抽牌堆,手牌,弃牌堆这些内容.
|
|||
|
|
我们在游戏不断进行过程中,每一个关卡胜利之后,我们都会获得一张卡牌,去填充我们的卡牌库.
|
|||
|
|
在每一个关卡开始的时候,我们的抽牌堆会进行更新,将我们的卡牌库的所有牌都充入其中,同时抽出几张牌放入我们的手牌当中,当手牌打出就进入弃牌堆,当游戏结束剩余的卡牌也要进入弃牌堆,因此上述逻辑是我们本节课的关节内容.
|
|||
|
|
我们依照上述内容进行本节课的展开
|
|||
|
|
### 制作卡牌库
|
|||
|
|
我们的游戏是在不断的打怪升级中发展的,因此我们的卡牌库也是不断更新的,但是我们游戏最开始的时候有一套最初始的卡牌库,因此游戏当中的卡牌库一共有两个.
|
|||
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|