【Unity实战教程】unity用excel存档和读档enemy属性

前言

  1. 本内容为本人原创提供
  2. 本内特为学习者提供原创完整的工程源码下载,可参考学习或其他用途。
  3. 本内容从enemy相关属性出发,对数据存取操作,一步一步推进,能直观感受。
  4. 如果后续有其他的存取游戏数据的方式,将继续提供给大家借鉴参考,希望能协助大家完成自己项目。

目录

前言

一、什么是excel

二、excel必要认识

三、unity实战

1、untiy对excel操作的准备工作

2、c#对excel操作的起始工作

       2.1、创建游戏管理类

       2.2、创建enemy属性

       2.3、C#引用

       2.4、文件路径

3、创建excel文件

        3.1、检测文件

        3.2、创建一个excel文件

        3.3、最终创建效果

4、保存文件

5、读取文件

        5.1、按路径获取文件

        5.2、读取指定的sheet(工作簿)

        5.3 解析背包

6、删除文件

四、运行图示

 五、总结

 六、工程下载地址 


一、什么是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操作。

写着写着就这么多了,可能不是特别全,不介意费时就看看吧。有时间还会接着更新。

 六、工程下载地址 

【unity实战案例】excel存取工程下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学与用

原创作者,在线要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值