CSV是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。其显著特点是:文件内的数据以逗号 ,
分隔,呈现一个表格形式。
在进行游戏制作时我们会需要使用到表格信息,如物品的名字,价格,序号等。可以在CSV文件中很方便的进行编辑和修改。
要对CSV文件进行读取还是比较简单的,我们可以将其以文本的形式打开来读取。
//打开文件EnemyData.csv
TextAsset EnemyDatas = Resources.Load<TextAsset>("DataAssets/EnemyData");
//Resources.Load 默认打开的是工程Assets/Resources
//也就是说这里的代码实际上访问路径为:Assets/Resources/DataAssets/EnemyData
//文件不用加后缀
因为文件内的数据以逗号 ,
分隔来组成表格,每一行数据的结尾都是换行符"/n",我们首先可以按行分割数据,再将结果存在数组当中。
string[] str_row = EnemyDatas.text.Split("\n");
Debug.Log("str_row.Length");
//这里会发现行数比实际行数要多1,这是因为CSV文件末尾有一个空白行
然后再通过以逗号按列分割再存入数组当中就可以直接用了,但是这样的话在使用的时候我们不清楚数据是拿来做什么的,还得去翻原始表格。而且每次使用时都要先读取一次,不太方便。于是下面打算给他读取之后存起来。
于是在这里先建立两个类,按照表格的内容给每个元素分配一个简单好辨识的名字,在实际工程中我通过summary为每个变量注释了一下,更好分辨其作用,起名字就可以很随意了。
[System.Serializable]//序列化
public class Enemy
{
public string Id;//序号
public string Name;//名字
public string Jianjie;//简述
public uint health;//基础血量
public uint wuli;//物理抗性
public uint yuansu;//元素抗性
public string lujin;//预制体路径
public uint FirstTime;//生成时间条件
public uint gailv;//生成概率(权重
}
public class EnemyManager : ScriptableObject
{
public Enemy[] dataArray;
}
做好上面的部分之后我们只需要将数据转移再生成文件就好了
贴一张读取的代码
public static Enemy[] ReadCSV()
{
//以文本方式获取CSV
TextAsset EnemyDatas = Resources.Load<TextAsset>("DataAssets/EnemyData");
//分割行
string[] str_row = EnemyDatas.text.Split("\n");
int rowNum = str_row.Length - 1;
//第二行开始才是数据
Enemy[] enemy_array = new Enemy[rowNum - 1];
for (int i = 1; i < rowNum ; i++)
{
string[] collect = str_row[i].Split(",");
Enemy enemy = new Enemy();
//解析每列的数据
enemy.Id = collect[0];
enemy.Name = collect[1];
enemy.Jianjie = collect[2];
enemy.health = uint.Parse(collect[3]);
enemy.wuli = uint.Parse(collect[4]);
enemy.yuansu = uint.Parse(collect[5]);
enemy.lujin = collect[6];
enemy.FirstTime = uint.Parse(collect[7]);
enemy.gailv = uint.Parse(collect[8]);
enemy_array[i - 1] = enemy;
}
return enemy_array;
}
然后利用objectscript类存起来就好了,下面是生成文件的代码。这里是将文件放在了Assets/Resources/DataAssets路径下名为Enemy的Asset文件当中。
public static void CreateEnemyAsset()
{
EnemyManager enemyManager = ScriptableObject.CreateInstance<EnemyManager>();
enemyManager.dataArray = ReadCSV();
string assetPath = string.Format("{0}{1}.asset", "Assets/Resources/DataAssets/", "Enemy");
AssetDatabase.CreateAsset(enemyManager, assetPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
这样做完后我们在更变CSV文件后只需要读取一次数据,以后只用去使用转存后的数据了。还可以利用哈希表制作索引帮助读写文件