DefaultDataTableHelper.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using GameFramework.DataTable;
  9. using System;
  10. using System.IO;
  11. using System.Text;
  12. using UnityEngine;
  13. namespace UnityGameFramework.Runtime
  14. {
  15. /// <summary>
  16. /// 默认数据表辅助器。
  17. /// </summary>
  18. public class DefaultDataTableHelper : DataTableHelperBase
  19. {
  20. private static readonly string BytesAssetExtension = ".bytes";
  21. private ResourceComponent m_ResourceComponent = null;
  22. /// <summary>
  23. /// 读取数据表。
  24. /// </summary>
  25. /// <param name="dataTable">数据表。</param>
  26. /// <param name="dataTableAssetName">数据表资源名称。</param>
  27. /// <param name="dataTableAsset">数据表资源。</param>
  28. /// <param name="userData">用户自定义数据。</param>
  29. /// <returns>是否读取数据表成功。</returns>
  30. public override bool ReadData(DataTableBase dataTable, string dataTableAssetName, object dataTableAsset, object userData)
  31. {
  32. TextAsset dataTableTextAsset = dataTableAsset as TextAsset;
  33. if (dataTableTextAsset != null)
  34. {
  35. Log.Warning(dataTableTextAsset.text);
  36. if (dataTableAssetName.EndsWith(BytesAssetExtension, StringComparison.Ordinal))
  37. {
  38. return dataTable.ParseData(dataTableTextAsset.bytes, userData);
  39. }
  40. else
  41. {
  42. return dataTable.ParseData(dataTableTextAsset.text, userData);
  43. }
  44. }
  45. Log.Warning("Data table asset '{0}' is invalid.", dataTableAssetName);
  46. return false;
  47. }
  48. /// <summary>
  49. /// 读取数据表。
  50. /// </summary>
  51. /// <param name="dataTable">数据表。</param>
  52. /// <param name="dataTableAssetName">数据表资源名称。</param>
  53. /// <param name="dataTableBytes">数据表二进制流。</param>
  54. /// <param name="startIndex">数据表二进制流的起始位置。</param>
  55. /// <param name="length">数据表二进制流的长度。</param>
  56. /// <param name="userData">用户自定义数据。</param>
  57. /// <returns>是否读取数据表成功。</returns>
  58. public override bool ReadData(DataTableBase dataTable, string dataTableAssetName, byte[] dataTableBytes, int startIndex, int length, object userData)
  59. {
  60. if (dataTableAssetName.EndsWith(BytesAssetExtension, StringComparison.Ordinal))
  61. {
  62. return dataTable.ParseData(dataTableBytes, startIndex, length, userData);
  63. }
  64. else
  65. {
  66. return dataTable.ParseData(Utility.Converter.GetString(dataTableBytes, startIndex, length), userData);
  67. }
  68. }
  69. /// <summary>
  70. /// 解析数据表。
  71. /// </summary>
  72. /// <param name="dataTable">数据表。</param>
  73. /// <param name="dataTableString">要解析的数据表字符串。</param>
  74. /// <param name="userData">用户自定义数据。</param>
  75. /// <returns>是否解析数据表成功。</returns>
  76. public override bool ParseData(DataTableBase dataTable, string dataTableString, object userData)
  77. {
  78. try
  79. {
  80. int position = 0;
  81. string dataRowString = null;
  82. while ((dataRowString = dataTableString.ReadLine(ref position)) != null)
  83. {
  84. if (dataRowString[0] == '#')
  85. {
  86. continue;
  87. }
  88. if (!dataTable.AddDataRow(dataRowString, userData))
  89. {
  90. Log.Warning("Can not parse data row string '{0}'.", dataRowString);
  91. return false;
  92. }
  93. }
  94. return true;
  95. }
  96. catch (Exception exception)
  97. {
  98. Log.Warning("Can not parse data table string with exception '{0}'.", exception.ToString());
  99. return false;
  100. }
  101. }
  102. /// <summary>
  103. /// 解析数据表。
  104. /// </summary>
  105. /// <param name="dataTable">数据表。</param>
  106. /// <param name="dataTableBytes">要解析的数据表二进制流。</param>
  107. /// <param name="startIndex">数据表二进制流的起始位置。</param>
  108. /// <param name="length">数据表二进制流的长度。</param>
  109. /// <param name="userData">用户自定义数据。</param>
  110. /// <returns>是否解析数据表成功。</returns>
  111. public override bool ParseData(DataTableBase dataTable, byte[] dataTableBytes, int startIndex, int length, object userData)
  112. {
  113. try
  114. {
  115. using (MemoryStream memoryStream = new MemoryStream(dataTableBytes, startIndex, length, false))
  116. {
  117. using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
  118. {
  119. while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
  120. {
  121. int dataRowBytesLength = binaryReader.Read7BitEncodedInt32();
  122. if (!dataTable.AddDataRow(dataTableBytes, (int)binaryReader.BaseStream.Position, dataRowBytesLength, userData))
  123. {
  124. Log.Warning("Can not parse data row bytes.");
  125. return false;
  126. }
  127. binaryReader.BaseStream.Position += dataRowBytesLength;
  128. }
  129. }
  130. }
  131. return true;
  132. }
  133. catch (Exception exception)
  134. {
  135. Log.Warning("Can not parse dictionary bytes with exception '{0}'.", exception.ToString());
  136. return false;
  137. }
  138. }
  139. /// <summary>
  140. /// 释放数据表资源。
  141. /// </summary>
  142. /// <param name="dataTable">数据表。</param>
  143. /// <param name="dataTableAsset">要释放的数据表资源。</param>
  144. public override void ReleaseDataAsset(DataTableBase dataTable, object dataTableAsset)
  145. {
  146. m_ResourceComponent.UnloadAsset(dataTableAsset);
  147. }
  148. private void Start()
  149. {
  150. m_ResourceComponent = GameEntry.GetComponent<ResourceComponent>();
  151. if (m_ResourceComponent == null)
  152. {
  153. Log.Fatal("Resource component is invalid.");
  154. return;
  155. }
  156. }
  157. }
  158. }