【Unity2D 2022:Data】读取csv格式文件的数据

一、创建csv文件

  1. 打开Excel,创建xlsx格式文件

  2. 编辑卡牌数据:这里共写了两类卡牌,第一类是灵物卡,具有编号、卡名、生命、攻击四个属性;第二类是法术卡,具有编号、卡名、效果三个属性。每类卡的第一行以"#"开头,后面以卡牌类型单词开头

  1. 保存文件,导出为csv格式
  1. csv格式是将各个数据用逗号分隔,最终的效果如下所示:
  1. 创建一个名为Data的文件夹,将csv文件移动到此文件夹

二、创建CardStore脚本

在此之前,已经定义了Card类,Card类又分为SpiritCard类和SpellCard类。每张卡牌都有编号和卡名两个属性,灵物卡有生命值、最大生命值、攻击力三个属性,法术卡有一个效果属性,并且每个类都有其对应的构造方法。Card类代码如下:

cs 复制代码
public class Card
{
    public int id; 
    public string name;

    public Card(int _id, string _name)
    {
        this.id = _id;
        this.name = _name;
    }
}

// 灵物卡
public class SpiritCard : Card
{
    public int HP;
    public int maxHP;
    public int ATK;

    public SpiritCard(int _id, string _name, int _maxHP, int _ATK) : base(_id, _name)
    {
        this.HP = _maxHP;
        this.maxHP = _maxHP;
        this.ATK = _ATK;
    }
}

// 法术卡
public class SpellCard : Card
{
    public string description;

    public SpellCard(int _id, string _name, string _description) : base(_id, _name)
    {
        description = _description;
    }
}
  1. 创建卡牌数据的文本资源文件
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;
}
  1. 创建allCards链表用来存储所有卡牌
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;

    // 创建cards链表用来存储所有卡牌
    public List<Card> allCards = new List<Card>();
}
  1. 定义一个loadCardData方法,用来加载卡牌数据

定义一个字符串数组dataRow,将每一行的数据存储到dataRow中的每个元素中

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;

    // 创建cards链表用来存储所有卡牌
    public List<Card> allCards = new List<Card>();

    // 加载所有卡牌数据
    public void loadCardData()
    {
        // 用回车分割每一行
        string[] dataRow = cardData.text.Split("\n");
    }
}
  1. 使用foreach遍历文件中的每行数据,再定义一个字符串数组data,将每一个数据存储到data中的每个元素中。使用if语句判断每行的第一个元素是否为"#",如果是则跳过这行
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;

    // 创建cards链表用来存储所有卡牌
    public List<Card> allCards = new List<Card>();

    // 加载所有卡牌数据
    public void loadCardData()
    {
        // 用回车分割每一行
        string[] dataRow = cardData.text.Split("\n");

        // 用逗号分割每个数据
        foreach(string row in dataRow) {
            string[] data = row.Split(",");
            if(data[0] == "#") {
                continue;
            }
        }
    }
}
  1. 将导入的数据存储到对应变量中,创建卡牌对象,并添加到allCards链表中

使用Debug.Log语句在控制台打印数据

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;

    // 创建cards链表用来存储所有卡牌
    public List<Card> allCards = new List<Card>();

    // 加载所有卡牌数据
    public void loadCardData()
    {
        // 用回车分割每一行
        string[] dataRow = cardData.text.Split("\n");

        // 用逗号分割每个数据
        foreach(string row in dataRow) {
            string[] data = row.Split(",");
            if(data[0] == "#") {
                continue;
            }

            // 将导入的数据存储到对应变量中,创建卡牌对象,并添加到allCards链表中
            int id;
            string name;
            switch(data[0]) {
                case "Spirit":
                    id = int.Parse(data[1]);
                    name = data[2];
                    int HP = int.Parse(data[3]);
                    int ATK = int.Parse(data[4]);
                    SpiritCard spiritCard = new SpiritCard(id, name, HP, ATK);
                    allCards.Add(spiritCard);
                    Debug.Log("链表中第" + allCards.Count + "个卡牌是:" + spiritCard.name);
                    break;
                case "Spell":
                    id = int.Parse(data[1]);
                    name = data[2];
                    string desdescription = data[3];
                    SpellCard spellCard = new SpellCard(id, name, desdescription);
                    allCards.Add(spellCard);
                    Debug.Log("链表中第" + allCards.Count + "个卡牌是:" + spellCard.name);
                    break;
            }
        }
    }
}
  1. 在游戏开始时调用loadCardData方法
cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class CardStore : MonoBehaviour
{
    // 创建卡牌数据的文本资源文件
    public TextAsset cardData;

    // 创建cards链表用来存储所有卡牌
    public List<Card> allCards = new List<Card>();

    void Start()
    {
        loadCardData();
    }

    // 加载所有卡牌数据
    public void loadCardData()
    {
        // 用回车分割每一行
        string[] dataRow = cardData.text.Split("\n");

        // 用逗号分割每个数据
        foreach(string row in dataRow) {
            string[] data = row.Split(",");
            if(data[0] == "#") {
                continue;
            }

            // 将导入的数据存储到对应变量中,创建卡牌对象,并添加到allCards链表中
            int id;
            string name;
            switch(data[0]) {
                case "Spirit":
                    id = int.Parse(data[1]);
                    name = data[2];
                    int HP = int.Parse(data[3]);
                    int ATK = int.Parse(data[4]);
                    SpiritCard spiritCard = new SpiritCard(id, name, HP, ATK);
                    allCards.Add(spiritCard);
                    Debug.Log("链表中第" + allCards.Count + "个卡牌是:" + spiritCard.name);
                    break;
                case "Spell":
                    id = int.Parse(data[1]);
                    name = data[2];
                    string desdescription = data[3];
                    SpellCard spellCard = new SpellCard(id, name, desdescription);
                    allCards.Add(spellCard);
                    Debug.Log("链表中第" + allCards.Count + "个卡牌是:" + spellCard.name);
                    break;
            }
        }
    }
}

三、创建CardStore游戏物体

  1. 创建Card Store游戏物体存储卡牌数据
  1. 在Card Store游戏物体上添加CardStore脚本
  1. 将Card List.csv文件挂载到CardStore脚本上
  1. 点击运行,控制台的输出如下图所示:

本章完。感谢阅读!

相关推荐
qq_284274059 小时前
数控铣床与加工中心笔记:铣刀与刀柄系统、G54试切对刀、镜像加工指令、孔加工工艺(钻扩铰镗)与固定循环G73/G83/G81/G76/G87/G84
笔记·学习·自动化·制造
Titan202410 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
深圳老胡12 小时前
STM32CubeMX 生成 CMake 工程,用 VSCode 编译与调试的完整流程
笔记·stm32·单片机·代码规范
坤坤子吖12 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
上位机妹子12 小时前
EF Core 两种继承映射:每层次一张表(TPH)与每类型一张表(TPT)
数据库·c#·.netcore·ef core
乐橙开放平台12 小时前
智慧连锁客流检测和离岗检测怎么对接
大数据·人工智能·笔记·物联网·自动化·音视频·智能家居
零基础12312 小时前
FinalShell 使用教程:从安装到高效运维
运维·经验分享·笔记·finalshell
ACP广源盛1392462567312 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
小羊没烦恼!14 小时前
jQuery1.5的改进细节
java·服务器·开发语言·前端·c#
敲个大西瓜14 小时前
langchain笔记(一)
redis·笔记·langchain