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

一、创建csv文件

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

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

3. 保存文件,导出为csv格式

4. csv格式是将各个数据用逗号分隔,最终的效果如下所示:

5. 创建一个名为Data的文件夹,将csv文件移动到此文件夹

二、创建CardStore脚本

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

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. 创建卡牌数据的文本资源文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

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

2. 创建allCards链表用来存储所有卡牌

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>();
}

3. 定义一个loadCardData方法,用来加载卡牌数据

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

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");
    }
}

4. 使用foreach遍历文件中的每行数据,再定义一个字符串数组data,将每一个数据存储到data中的每个元素中。使用if语句判断每行的第一个元素是否为“#”,如果是则跳过这行

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;
            }
        }
    }
}

5. 将导入的数据存储到对应变量中,创建卡牌对象,并添加到allCards链表中

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

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;
            }
        }
    }
}

6. 在游戏开始时调用loadCardData方法

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游戏物体存储卡牌数据

2. 在Card Store游戏物体上添加CardStore脚本

3. 将Card List.csv文件挂载到CardStore脚本上

4. 点击运行,控制台的输出如下图所示:

        本章完。感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值