0%

Unity集换式卡牌游戏_第4期_配表与读取你的卡牌

在上一期中,我们制作了自己的第一张卡牌,并且通过CardDisplay类中的DisplayCard()方法展示了我们卡牌的属性。当时为了方便展示,我们直接在CardDisplay中的Start()里 new 了一张火球术出来

1
2
3
4
5
6
void Start()
{
cardModel = this.GetModel<CardModel>();
card =new SpellCard(1, "Fireball", "Deals 5 damage", 5, new string[] { "Fire" });//就是这句啦
DisplayCard();
}

然鹅,我们显然不能把我们所以的卡牌都以这样的方法 new 出来,我们需要一种更成熟,更方便的方法获取我们的卡牌————读配表。

配表

在实际开发中策划会不断地提出不同的需求,但是他们不会直接对代码进行操作,而是通过和程序的沟通间接完成,而将它们对数值的具体需求,忠实的向程序反映的桥梁就是数据表,一个典型的数据表可能是这样的:

主键 名称 描述
类型 INT STRING STRING
字段名 ID Name Desc
1 勇士 勇敢的战士,遵循你的召唤而降生

当然,实际的表可能会比这复杂的多。程序需要做的,就是去读取这张表,并可能将他以另外某种形式储存起来。持久存储数据的方法有很多,CSV,Json,XML,二进制…今天我们主要介绍的,就是CSV文件的读取。

csv的读取

csv其实就是 Comma-Separated Values -> 逗号分隔的值
想要新建一个 csv 文件,就用 Excel 把 xls 另存为 csv 文件即可。
在视频中,我们新建了一个 CardData 文件,我们是这样读取他的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void LoadCardsFromCsv()
{
cardData = Resources.Load<TextAsset>("Data/cardData");//读取csv文件
string[] dataRow = cardData.text.Split('\n');//按行分割
foreach(var row in dataRow)
{
string[] rowArray = row.Split(',');//按列分割
if (rowArray[0] == "类型")//跳过第一行
{
continue;
}
else if (rowArray[0] == "MonsterCard")
{
MonsterCard monsterCard = new MonsterCard(int.Parse(rowArray[1]), rowArray[2], rowArray[3], int.Parse(rowArray[4]), rowArray[5].Split(';'), int.Parse(rowArray[9]), int.Parse(rowArray[10]));
totalCards.Add(monsterCard);
Debug.Log("monsterCard.Name"+monsterCard.Name);
}
else if (rowArray[0] == "SpellCard")
{
SpellCard spellCard = new SpellCard(int.Parse(rowArray[1]), rowArray[2], rowArray[3], int.Parse(rowArray[4]), rowArray[5].Split(';'));
totalCards.Add(spellCard);
Debug.Log("spellCard.Name" + spellCard.Name);
}
}
}

我们先用/n把文件分割成一行一行的字符串数组,再通过,如法炮制,把每一行都分割成对应 csv 表格的字符串数组,方便我们读取。跳过不需要读取的行, 我们按照事先标记的卡牌的种类,依次 new 出具体的 card,并把他们储存到 List<Card> 中去。 就这样,我们的卡牌的读取就顺利完成了,其实并没有什么难度,也适合自由发挥。
在视频的最后,我留下了 SkillData 没有读取,这里把读取方法一并写出。
我们新建了 Skill 类 和 SkillModel 类

1
2
3
4
5
6
7
public class Skill
{
public int ID;
public string Name;
public string Description;
public int SkillValue;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System.Collections.Generic;
using QFramework;
using UnityEngine;

public class SkillModel :AbstractModel
{

public TextAsset skillData;
List<Skill> totalSkills = new List<Skill>();
protected override void OnInit()
{
LoadSkillsFromCsv();
}
public void LoadSkillsFromCsv()
{
skillData = Resources.Load<TextAsset>("Data/SkillData");//读取csv文件
string[] dataRow = skillData.text.Split('\n');//按行分割
foreach(var row in dataRow)
{
string[] rowArray = row.Split(',');//按列分割
if (rowArray[0] == "技能ID")//跳过第一行
{
continue;
}
else
{
Skill skill = new Skill();
skill.ID = int.Parse(rowArray[0]);
skill.Name = rowArray[1];
skill.Description = rowArray[2];
skill.SkillValue = int.Parse(rowArray[5]);
totalSkills.Add(skill);
Debug.Log("读取了技能"+skill.Name+" 技能ID: "+skill.ID+" 技能描述: "+skill.Description+" 技能数值: "+skill.SkillValue);
}
}
}
}

显然,和上次我们写的 Card 颇有不同,也是想借此告诉大家,程序的设计方法千千万,不必拘泥于某一种写法,因地制宜才是妙招。


本文作于2023-08-15,首发于个人博客https://rdququ.top/

欢迎关注我的其它发布渠道