在上一期中,我们制作了自己的第一张卡牌,并且通过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"); 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"); 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/