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

本章完。感谢阅读!

相关推荐
猿来是你_L1 小时前
UGUI笔记——3D坐标转换成UGUI坐标
笔记·3d
张人玉5 小时前
C#WPF UI路由事件:事件冒泡与隧道机制
ui·c#·wpf
崎岖Qiu6 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
野奔在山外的猫7 小时前
【解决】解决方案内存在对应命名空间,但程序引用显示无该命名空间问题
unity
B0URNE7 小时前
【Unity基础详解】(5)Unity核心:Coroutines协程
unity·游戏引擎
雪域迷影7 小时前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get
lkbhua莱克瓦247 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github
yue0087 小时前
C#类继承
java·开发语言·c#
Larry_Yanan8 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互
im_AMBER8 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法