DefaultDataTableHelper.cs 6.9 KB

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