写在前面
Excel身为办公常用软件,很多功能非常常用,使用Excel进行数据填写与修改也会非常方便(比如查找替换、设置单元格格式、Excel内部函数等)
将Excel与Unity结合起来,可以大大提高文本/资源的输入效率
同时,在一套完整的框架的基础上还可以通过简化、修改、与其他结合等实现一定程度上的无代码编程、UGC(既然都可以无代码编程了,那么UGC理论上也是可以的)、AIGC(让AI输出csv格式的文件)
本系列将更多从文本处理上讨论Excel与Unity的多种结合方案,欢迎大家指正与讨论
核心思想
利用excel导出的csv格式(逗号分隔格式),通过","与"\n"进行分隔
string[] dialogRows;
string[][] cells;
dialogRows = null;
//_textAsset为导入的csv文件
dialogRows = _textAsset.text.Split('\n');
cells = new string[dialogRows.Length][];
for (int i = 0; i < dialogRows.Length; i++)
{
cells[i] = dialogRows[i].Split(',');
//之后根据cells的进行属性配置
}
实例举例
要求
玩家有血量、力量、敏捷三个属性
玩家每升一级,不同的属性都会有不同的加值
Excel配表
策划根据项目要求写了一个表格
| 玩家升到某一级增加的数值 | 血量增加的数量 | 力量增加的数量 | 敏捷增加的数量 |
| 1 | 5 | 2 | 0 |
| 2 | 5 | 3 | 1 |
| 3 | 3 | 5 | 3 |
并将这个表格另存为csv格式(要保存为UTF-8编码的)
在项目里放入csv文件
将策划给的文件放在Resources文件夹里,并命名为`PlayerLevelAdd`
(这里以Resouces的文件Load作演示,其他的方式也是可以的)
读取csv文件
//获取csv文件
string playerLevelAddPath = "PlayerLevelAdd";//Resouces的路径没有后缀,前面也没有Resouces文件夹(直接从文件夹这一层开始写)
TextAsset textAsset;//输入的文本文件csv
public void SetTextAsset(string ResourcesPath)
{
textAsset = Resources.Load<TextAsset>(ResourcesPath);
}
//比较通用的读取csv文件的方法
string[] dialogRows;
string[][] cells;
public void ReadText(TextAsset _textAsset)
{
//string content = _textAsset.text;
//content = Encryption.Decrypt(content);
//File.WriteAllText("Assets/Resources/System/AfterEncryandDecrypt.csv", content);
//dialogRows = content.Split('\n');
dialogRows = null;
dialogRows = _textAsset.text.Split('\n');
cells = new string[dialogRows.Length][];
for (int i = 0; i < dialogRows.Length; i++)
{
cells[i] = dialogRows[i].Split(',');
}
}
//设定一个Key值,将读取的csv存储进字典
static Dictionary<string, int[]> judges = new Dictionary<string, int[]>();
void JudgesShow()
{
//有效数字多少位(这个要看把哪几列作为Key,哪几列作为Value)
//在当前实例中,可以把玩家等级作为Key,其他作为Value,所以Value的列数为总列数-key值列数(当前为1)
if (cells == null || cells.Length < 1) return;
int[] values = new int[cells[0].Length - 1];
//因为目前导入的表有抬头(第一行不是数值,是解释),所以i从1开始
for (int i = 1; i < dialogRows.Length - 1; i++)
{
values = new int[cells[0].Length - 1];
for (int j = 0; j < values.Length; j++)
{
//因为目前的Key列只有1列,所以是j + 1(如果为2列,就是j+2)
values[j] = int.Parse(cells[i][j + 1]);
}
if (!judges.ContainsKey(cells[i][0]))
{
Debug.Log("Add" + cells[i][0]);
judges.Add(cells[i][0], values);
}
else
{
if (values != judges[cells[i][0]])
{
Debug.Log("Add" + cells[i][0]);
judges.Remove(cells[i][0]);
judges.Add(cells[i][0], values);
}
}
}
}
public void ReadPlayerLevelUpValueCSV()
{
SetTextAsset(playerLevelAddPath);
ReadText(textAsset);
JudgesShow();
}
调用
int level;//目前的等级
int health;//血量
int strength;//力量
int quickness;//敏捷
/// <summary>
/// 增加玩家的等级
/// </summary>
/// <param name="addLevel">增加的等级数</param>
public void PlayerLevelUp()
{
level += 1;
string key = level.ToString();
if (judges.ContainsKey(key))
{
int[] values = judges[key];
health += values[0];
strength += values[1];
quickness += values[2];
}
else
{
Debug.Log("没有数据");
}
}
364

被折叠的 条评论
为什么被折叠?



