一、创建一个文本文件
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);
}
}
}
文章讲述了如何在Unity中创建文本文件,使用DTNPC脚本解析NPC数据,以及在游戏过程中订阅数据加载事件并操作数据表的过程。
1199

被折叠的 条评论
为什么被折叠?



