GameFramework学习笔记--第四节 加载文件

文章讲述了如何在Unity中创建文本文件,使用DTNPC脚本解析NPC数据,以及在游戏过程中订阅数据加载事件并操作数据表的过程。

一、创建一个文本文件

        1.新建excel表文件

PS:“#”号不会被读取,可以当成是注释或者说明行功能

        2.文件--另存为,如图:

        3.打开保存的文件,再次另存为,这时把文件编码类型改成utf-8,如下图:

4.导入到untiy中

二、创建对应的存储脚本

        1.新建DTNPC脚本文件对应刚才导入的NPC.txt文本,当文本加载时,用DTNPC这个脚本接收。DTNPC脚本继承DataRowBase,必须实现Id,数据管理中必须存在id,另外,文本中的每一种数据都需要对应也给方法,同时还要实现ParseDataRow()来解析每一行的数据,把每一行的数据都存放在DTNPC这个脚本中,我猜想可能会给每一行数据实例化一个脚本文件。这个方法有两个实现方式:上面可以用来转换文本文件,下面可能用来转换图片视频等。

 /// <summary>

        /// 解析数据表行。

        /// </summary>

        /// <param name="dataRowString">要解析的数据表行字符串。</param>

        /// <param name="userData">用户自定义数据。</param>

 /// <summary>

        /// 解析数据表行。

        /// </summary>

        /// <param name="dataRowBytes">要解析的数据表行二进制流。</param>

        /// <param name="startIndex">数据表行二进制流的起始位置。</param>

        /// <param name="length">数据表行二进制流的长度。</param>

        /// <param name="userData">用户自定义数据。</param>

using UnityGameFramework.Runtime;

public class DTNPC : DataRowBase
{
    private int m_Id;
    public override int Id => m_Id;
    public override bool ParseDataRow(string dataRowString, object userData)
    {
        string[] col = dataRowString.Split('\t');
        int index = 1;//第一列是#不要。
        m_Id = int.Parse(col[index++]);
        Name = col[index++];
        Attack = int.Parse(col[index++]);
        HP = int.Parse(col[index++]);
        MP = int.Parse(col[index++]);
        return true;
        // return base.ParseDataRow(dataRowString, userData);
    }
    public string Name
    {
        get;
        private set;
    }
    public int Attack
    {
        get;
        private set;
    }
//.....本文中有多少就需要写多少实现方法....
}

三、在适当位置调用数据

        1.在ProcedureLaunch的OnEnter方法中,首先订阅一个加载数据表成功的事件,成功后的回调函数为OnLoadDataTableSuc。

protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
        {
            base.OnEnter(procedureOwner);
            Log.Info("ProcedureExample OnEnter");
            GameEntry.Event.Subscribe(LoadDataTableSuccessEventArgs.EventId, OnLoadDataTableSuc);
            //1.创建数据表,数据表类型为DataTableBase
            DataTableBase IDTNPC = (DataTableBase)GameEntry.DataTable.CreateDataTable<DTNPC>();
            //2.读取文本中的数据
            IDTNPC.ReadData("Assets/GameMain/DataTables/NPC.txt", this);
        }

2.OnLoadDataTableSuc函数如下:成功后的回调函数不会把数据带回来,而需要通过GameEntry.DataTable.GetDataTable<T>()方法获取到加载成功的数据表。这里需要注意的是,获取的数据表是从第1行开始的,而不是从第0行开始的,所以索引时要从1开始。

        private void OnLoadDataTableSuc(object sender, GameEventArgs e)
        {
            LoadDataTableSuccessEventArgs ne = (LoadDataTableSuccessEventArgs)e;
            if (ne.UserData == this)
            {
                IDataTable<DTNPC> dTNPC = GameEntry.DataTable.GetDataTable<DTNPC>();
                //i=1数据表好像是从1开始的表示第1行,没有第0行。
                for (int i = 1; i <= dTNPC.Count; i++)
                {
                    Log.Info("Name:" + dTNPC[i].Name+"Position:"+dTNPC[i].Position);
                }
            }
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值