Excel与Unity工作流(一):使用Excel进行属性配置

 写在前面

Excel身为办公常用软件,很多功能非常常用,使用Excel进行数据填写与修改也会非常方便(比如查找替换、设置单元格格式、Excel内部函数等)

将Excel与Unity结合起来,可以大大提高文本/资源的输入效率

同时,在一套完整的框架的基础上还可以通过简化、修改、与其他结合等实现一定程度上的无代码编程、UGC(既然都可以无代码编程了,那么UGC理论上也是可以的)、AIGC(让AI输出csv格式的文件)

本系列将更多从文本处理上讨论Excel与Unity的多种结合方案,欢迎大家指正与讨论

 核心思想

利用excel导出的csv格式(逗号分隔格式),通过","与"\n"进行分隔

string[] dialogRows;

string[][] cells;

dialogRows = null;

//_textAsset为导入的csv文件

        dialogRows = _textAsset.text.Split('\n');



        cells = new string[dialogRows.Length][];

        for (int i = 0; i < dialogRows.Length; i++)

        {

            cells[i] = dialogRows[i].Split(',');            

            //之后根据cells的进行属性配置

        }

实例举例

要求

玩家有血量、力量、敏捷三个属性

玩家每升一级,不同的属性都会有不同的加值

Excel配表

策划根据项目要求写了一个表格

玩家升到某一级增加的数值血量增加的数量力量增加的数量敏捷增加的数量
1520
2531
3353

并将这个表格另存为csv格式(要保存为UTF-8编码的)

在项目里放入csv文件

将策划给的文件放在Resources文件夹里,并命名为`PlayerLevelAdd`

(这里以Resouces的文件Load作演示,其他的方式也是可以的)

读取csv文件

//获取csv文件

    string playerLevelAddPath = "PlayerLevelAdd";//Resouces的路径没有后缀,前面也没有Resouces文件夹(直接从文件夹这一层开始写)

    TextAsset textAsset;//输入的文本文件csv

    public void SetTextAsset(string ResourcesPath)

    {

        textAsset = Resources.Load<TextAsset>(ResourcesPath);

    }



    //比较通用的读取csv文件的方法

    string[] dialogRows;

    string[][] cells;

    public void ReadText(TextAsset _textAsset)

    {

        //string content = _textAsset.text;

        //content = Encryption.Decrypt(content);

        //File.WriteAllText("Assets/Resources/System/AfterEncryandDecrypt.csv", content);

        //dialogRows = content.Split('\n');

        dialogRows = null;

        dialogRows = _textAsset.text.Split('\n');



        cells = new string[dialogRows.Length][];

        for (int i = 0; i < dialogRows.Length; i++)

        {

            cells[i] = dialogRows[i].Split(',');            

        }        

    }



   



    //设定一个Key值,将读取的csv存储进字典

    static Dictionary<string, int[]> judges = new Dictionary<string, int[]>();

    void JudgesShow()

    {

        //有效数字多少位(这个要看把哪几列作为Key,哪几列作为Value)

        //在当前实例中,可以把玩家等级作为Key,其他作为Value,所以Value的列数为总列数-key值列数(当前为1)

        if (cells == null || cells.Length < 1) return;

        int[] values = new int[cells[0].Length - 1];

        //因为目前导入的表有抬头(第一行不是数值,是解释),所以i从1开始

        for (int i = 1; i < dialogRows.Length - 1; i++)

        {

            values = new int[cells[0].Length - 1];

            for (int j = 0; j < values.Length; j++)

            {

                //因为目前的Key列只有1列,所以是j + 1(如果为2列,就是j+2)

                values[j] = int.Parse(cells[i][j + 1]);

            }



            if (!judges.ContainsKey(cells[i][0]))

            {

                Debug.Log("Add" + cells[i][0]);

                judges.Add(cells[i][0], values);

            }

            else

            {

                if (values != judges[cells[i][0]])

                {

                    Debug.Log("Add" + cells[i][0]);

                    judges.Remove(cells[i][0]);

                    judges.Add(cells[i][0], values);

                }

            }



        }

    }



    public void ReadPlayerLevelUpValueCSV()

    {

        SetTextAsset(playerLevelAddPath);

        ReadText(textAsset);

        JudgesShow();

    }

调用

int level;//目前的等级
    int health;//血量
    int strength;//力量
    int quickness;//敏捷
    /// <summary>
    /// 增加玩家的等级
    /// </summary>
    /// <param name="addLevel">增加的等级数</param>
    public void PlayerLevelUp()
    {
        level += 1;
        string key = level.ToString();
        if (judges.ContainsKey(key))
        {
            int[] values = judges[key];
            health += values[0];
            strength += values[1];
            quickness += values[2];
        }
        else
        {
            Debug.Log("没有数据");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值