Excal数据转化成Asset数据文件

我们知道,在Unity当中的文件都可以称之为Asset文件,在项目开发当中需要把数据读取来之后存放起来,而有的数据是不可以改变的,今天就来写一个demo处理一下这些数据,在这里就不写读取Excal数据的方法了,如果需要了解就百度一下,关于这样的帖子和文章有很多

首先我们需要一个类来“模仿”一下Excal数据,可以定义一下类:

using UnityEngine;
using System.Collections;

/// <summary>
/// 数据类
/// </summary>
[System.Serializable]
public class ItemData
{             //换句话说就是每一行就是一个类
    public string id;
    public string name;
    public int addAttack;
    public int addHp;
    public int addDefense;
}

 因为一个Excal里面有很多行,也就是说有很多类,所以这一个类是满足不了我们的,我们需要吧数据读出来之后把数据放起来,在这里我用的是List。如下:

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

/// <summary>
/// 存放Asset数据
/// </summary>
public class ItemDataList : ScriptableObject
{
    public List<ItemData> itemData;   //表示一个Excal表格
}

紧接着就是生成数据了,如下,需要说明的是,此类事编辑器类,需要放在Editor里面,把下面的脚本放在Unity里面之后会在Unity的菜单栏里面出现一个Demo-CreateAsset,单击一下就可以生成Asset数据了,该数据是放在Resources,所以前提是需要有一个Resources文件,点击生成的文件就可以看到数据了

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

/// <summary>
/// 把数据打包成为Asset文件
/// </summary>
public class CreateAssetData
{
    [MenuItem("Demo/CreateAsset")]
    static void CreateAsset()
    {
        ItemDataList list = ItemDataList.CreateInstance<ItemDataList>();
        list.itemData = DataTest();
        AssetDatabase.CreateAsset(list,"Assets/CreateAsset/Resources/ItemData.asset");
    }

    public static List<ItemData> DataTest()  //测试数据
    {
        List<ItemData> data = new List<ItemData>();
        for (int i = 0; i < 20; i++)
        {
            ItemData d = new ItemData();
            d.id = "000" + i;
            d.name = "000" + i;
            d.addHp = i;
            d.addDefense = i*2;
            d.addAttack = i*3;
            data.Add(d);
        }
        return data;
    }
}

最后就是用这些数据了,因为之前我是在Resources里面放着的,所以我是用Resources类来加载数据,如下,

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

/// <summary>
/// 加载数据
/// </summary>
public class AssetLoad : MonoBehaviour 
{

    [SerializeField]
    private List<ItemData> itemData;

    void Awake()
    {
        StartCoroutine(LoadAssetData());
    }

    IEnumerator LoadAssetData()
    {
        ItemDataList list = Resources.Load<ItemDataList>("ItemData");
        itemData = list.itemData;
        yield return null;
    }
}

附:也可以把该数据打包成AssetBundle文件,然后用WWW类来加载,之后转化成为ItemDataList类型就可以拿到数据了。另外这个数据打成Asset文件之后就一定固定了,不能再改变了。

原文地址:https://www.cnblogs.com/ZhiXing-Blogs/p/5572487.html