【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. 点击运行,控制台的输出如下图所示:

本章完。感谢阅读!

相关推荐
_oP_i6 分钟前
unity webgl部署到iis报错
unity
Go_Accepted8 分钟前
Unity全局雾效
unity
向宇it15 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
Hejjon3 小时前
SpringBoot 整合 SQLite 数据库
笔记
每日出拳老爷子3 小时前
【图形渲染】【Unity Shader】【Nvidia CG】有用的参考资料链接
unity·游戏引擎·图形渲染
北海65164 小时前
Dots 常用操作
unity
坐井观老天5 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
西洼工作室5 小时前
【java 正则表达式 笔记】
java·笔记·正则表达式
初学者7.5 小时前
Webpack学习笔记(2)
笔记·学习·webpack
新手上路狂踩坑6 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox