前言
- 本内容为本人原创提供
- 本内特为学习者提供原创完整的工程源码下载,可参考学习或其他用途。
- 本内容从enemy相关属性出发,对数据存取操作,一步一步推进,能直观感受。
- 如果后续有其他的存取游戏数据的方式,将继续提供给大家借鉴参考,希望能协助大家完成自己项目。
目录
一、什么是excel
excel是一款办公图表工具,于1993年微软发布的Microsoft Office组件——Excel5.0版,后逐步成为该类型软件的榜一。
excel能对大量数据进行制表和图示,很直观反应对象和数据。除了制作图表,excel支持VB开发和宏,也能创建窗体。
鉴于它能进行数据相关工作,所以采用excel对游戏数据进行存取。
二、excel必要认识
1、sheet
工作薄,类似写字本中的一页,这么理解就好了。
2、行和列
就相当于写字本中一页中的行和列。
总之,很好理解。excel其余的内容和知识不是本文重点。我们学习的目的,主要是对工作薄、列、行进行数据操作,最终得到类似如下数据效果:
三、unity实战
本次实战采用enemy属性单元展开,对enemy的属性进行存档和读档操作。
1、untiy对excel操作的准备工作
1.1、 在下创建 Plugins 文件夹。
1.2、 Plugins文件夹引入 EPPlus、 Excel 、ICSharpCode.SharpZipLib 三个文件
2、c#对excel操作的起始工作
2.1、创建游戏管理类
public class Gamemanager
{
private static Gamemanager _instance;
public static Gamemanager Instance
{
get
{
if (_instance == null)
{
_instance = new Gamemanager();
}
return _instance;
}
}
public int gameLv;
public Enemy enemy;
public List<Enemy> enemyList;
//临时道具名称数据
public List<string> itemTempList = new List<string>() { "灵石", "补灵丸", "铁剑", "布甲" };
}
2.2、创建enemy属性
首先,设定敌方单位属性,创建相应的类或者结构体,这里选择创建类,这是为了管理复杂数据。
public class Enemy
{
public int role_id { get; set; }
public int role_lv { get; set; }
public string role_name { get; set; }
public int role_hp { get; set; }
public int role_mp { get; set; }
public int role_atc { get; set; }
public int role_def { get; set; }
public List<string> drop_item { get; set; }
}
2.3、C#引用
c#解析excel需要引用:
using OfficeOpenXml;
unity对File文件进行操作,需要引用:
using System.IO;
在之前 xml存取玩家属性的文章中,我们引用的是:
using UnityEngine.Windows;
但是 using UnityEngine.Windows; 不能调用 FileStream 所以我们直接引用 System.IO;
2.4、文件路径
文件路径设置
private string excelPath = Application.dataPath + "/Save/gameexcel.xlsx";
3、创建excel文件
创建一个excel文件,可以手动创建,或者可以程序创建一个excel表。在熟悉unity开发后,如果想开发某游戏属性编辑器,地图编辑等可以用该方法。
3.1、检测文件
public bool IsHaveExcelDoc()
{
return File.Exists(excelPath);
}
3.2、创建一个excel文件
先创建一个excel文件
//创建新的Excel文件
FileInfo newFile = new FileInfo(excelPath);
ExcelPackage package = new ExcelPackage(newFile);
再创建一个sheet(工作簿)
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("EnemyRole");
再将敌方单位的属性赋值给表格的行和列
worksheet.Cells[1, 1].Value = "id";
worksheet.Cells[1, 2].Value = "lv";
worksheet.Cells[1, 3].Value = "名称";
worksheet.Cells[1, 4].Value = "hp";
worksheet.Cells[1, 5].Value = "mp";
worksheet.Cells[1, 6].Value = "atc";
worksheet.Cells[1, 7].Value = "def";
worksheet.Cells[1, 8].Value = "dropItem";
worksheet.Cells[2, 1].Value = "1001";
worksheet.Cells[2, 2].Value = "1";
worksheet.Cells[2, 3].Value = "树枝虫";
worksheet.Cells[2, 4].Value = "3";
worksheet.Cells[2, 5].Value = "0";
worksheet.Cells[2, 6].Value = "1";
worksheet.Cells[2, 7].Value = "0";
worksheet.Cells[2, 8].Value = "00001|00002";
worksheet.Cells[3, 1].Value = "1002";
worksheet.Cells[3, 2].Value = "1";
worksheet.Cells[3, 3].Value = "青狼";
worksheet.Cells[3, 4].Value = "30";
worksheet.Cells[3, 5].Value = "0";
worksheet.Cells[3, 6].Value = "5";
worksheet.Cells[3, 7].Value = "1";
worksheet.Cells[3, 8].Value = "00001|00002|00003|00004";
注意:
- value是表格每个格子的填充内容。
-
中 [2,1] 表示【行,列】
这里是最容易出错的地方,一定要记住了。
最后是保存和释放excel
package.Save();
package.Dispose();
3.3、最终创建效果
4、保存文件
与创建文件基本相似,这里直接上代码
public void SaveExcelDoc()
{
if (Gamemanager.Instance.enemyList.Count <= 0)
return;
//不能用 FileStream, excel被打开状态是无法保存的,所以用FileInfo
var file = new FileInfo(excelPath);
var excelPackage = new ExcelPackage(file);
// 根据表名称,获取工作表
var worksheet = excelPackage.Workbook.Worksheets["EnemyRole"];
int row = 2;
for (int i = row; i < Gamemanager.Instance.enemyList.Count + row; i++)
{
worksheet.Cells[i, 1].Value = Gamemanager.Instance.enemyList[i - row].role_id;
worksheet.Cells[i, 2].Value = Gamemanager.Instance.enemyList[i - row].role_lv;
worksheet.Cells[i, 3].Value = Gamemanager.Instance.enemyList[i - row].role_name;
worksheet.Cells[i, 4].Value = Gamemanager.Instance.enemyList[i - row].role_hp;
worksheet.Cells[i, 5].Value = Gamemanager.Instance.enemyList[i - row].role_mp;
worksheet.Cells[i, 6].Value = Gamemanager.Instance.enemyList[i - row].role_atc;
worksheet.Cells[i, 7].Value = Gamemanager.Instance.enemyList[i - row].role_def;
for (int j = 0; j < Gamemanager.Instance.enemyList[i - row].drop_item.Count; j++)
{
worksheet.Cells[i, 8].Value = Gamemanager.Instance.enemyList[i - row].drop_item[j].ToString() + "|";
}
}
excelPackage.Save();
excelPackage.Dispose();
}
特别注意是:这里不能用 FileStream 读取 excel 路径文件没反应, 因 excel 被打开状态是无法保存的,所以用 FileInfo 读就行了。
5、读取文件
5.1、按路径获取文件
var fileStream = new FileStream(excelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var excelPackage = new ExcelPackage(fileStream);
5.2、读取指定的sheet(工作簿)
var worksheet = excelPackage.Workbook.Worksheets["EnemyRole"];
EnemyRole 是sheet的名称
worksheet就是全部表格对象了,它抽象化理解就是所有格子,所有行列都在其中。
查询表格,将行列里面的数据赋值给玩家
// 遍历工作表的行
for (int row = 2; row <= worksheet.Dimension.End.Row; row++)
{
// 读取单元格中的数据 复制给敌方单位
Gamemanager.Instance.enemy = new Enemy()
{
role_id = int.Parse(worksheet.Cells[row, 1].Value.ToString()),
role_lv = int.Parse(worksheet.Cells[row, 2].Value.ToString()),
role_name = worksheet.Cells[row, 3].Value.ToString(),
role_hp = int.Parse(worksheet.Cells[row, 4].Value.ToString()),
role_mp = int.Parse(worksheet.Cells[row, 5].Value.ToString()),
role_atc = int.Parse(worksheet.Cells[row, 6].Value.ToString()),
role_def = int.Parse(worksheet.Cells[row, 7].Value.ToString()),
drop_item = new List<string>(ReadBag(worksheet.Cells[row, 8].Value.ToString()))
};
// 敌方数据加入单位集群
Gamemanager.Instance.enemyList.Add(Gamemanager.Instance.enemy);
}
在以往的数组中,0 是第一个元素,但是在excel的行列中,第一个元素是序列是 1 而不是 0。
这里的 row = 2,是因为列表中 第一行是标题,如红框内容
记住数字0和1,这是excel存档和读档经常报错出bug的地方。
5.3 解析背包
背包中用|分开了数据,读取背包数据时需要解析
//读取背包
List<string> ReadBag(string str)
{
List<string> list = new List<string>();
string[] tarry = str.Split('|');
for (int i = 0; i < tarry.Length; i++)
{
list.Add(tarry[i]);
}
return list;
}
6、删除文件
public void DeleteExcelDoc()
{
if (File.Exists(excelPath))
File.Delete(excelPath);
}
四、运行图示
五、总结
- excel存取数据效率会较低,但是更为直观观察数据,更多时候作为编辑器使用。
- excel可以作为mod制作工具,方便玩家编辑游戏数据查看。
- excel存取数据跨平台不利,在window很方便。
- 特别注意,在打开excel时候,如果进行调试,程序会报错,所以请关闭excel再启动untiy操作。
写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。