Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / ResourceManager.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using Config;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 资源管理器
  8. /// </summary>
  9. public static class ResourceManager
  10. {
  11. /// <summary>
  12. /// 默认权重值
  13. /// </summary>
  14. public const int DefaultWeight = 100;
  15. /// <summary>
  16. /// 颜色混合材质
  17. /// </summary>
  18. public static ShaderMaterial BlendMaterial
  19. {
  20. get
  21. {
  22. if (_shadowMaterial == null)
  23. {
  24. _shadowMaterial = Load<ShaderMaterial>(ResourcePath.resource_material_Blend_tres);
  25. }
  26.  
  27. return _shadowMaterial;
  28. }
  29. }
  30.  
  31. private static ShaderMaterial _shadowMaterial;
  32. public static ShaderMaterial NewBlendMaterial => Load<ShaderMaterial>(ResourcePath.resource_material_Blend_tres, false);
  33.  
  34. /// <summary>
  35. /// 颜色混合Shader
  36. /// </summary>
  37. public static Shader BlendShader
  38. {
  39. get
  40. {
  41. if (_shadowShader == null)
  42. {
  43. _shadowShader = Load<Shader>(ResourcePath.resource_material_Blend_tres);
  44. }
  45.  
  46. return _shadowShader;
  47. }
  48. }
  49.  
  50. private static Shader _shadowShader;
  51.  
  52. /// <summary>
  53. /// 默认字体资源, 字体大小16px
  54. /// </summary>
  55. public static Font DefaultFont16Px
  56. {
  57. get
  58. {
  59. if (_defaultFont16Px == null)
  60. {
  61. _defaultFont16Px = Load<Font>(ResourcePath.resource_font_VonwaonBitmap16px_ttf);
  62. }
  63.  
  64. return _defaultFont16Px;
  65. }
  66. }
  67. private static Font _defaultFont16Px;
  68. /// <summary>
  69. /// 默认字体资源, 字体大小12px
  70. /// </summary>
  71. public static Font DefaultFont12Px
  72. {
  73. get
  74. {
  75. if (_defaultFont12Px == null)
  76. {
  77. _defaultFont12Px = Load<Font>(ResourcePath.resource_font_VonwaonBitmap12px_ttf);
  78. }
  79.  
  80. return _defaultFont12Px;
  81. }
  82. }
  83. private static Font _defaultFont12Px;
  84. //缓存的资源
  85. private static readonly Dictionary<string, object> CachePack = new Dictionary<string, object>();
  86.  
  87. /// <summary>
  88. /// 加载资源对象, 并且缓存当前资源对象, 可频繁获取
  89. /// </summary>
  90. /// <param name="path">资源路径</param>
  91. /// <param name="useCache">是否使用缓存中的资源</param>
  92. public static T Load<T>(string path, bool useCache = true) where T : class
  93. {
  94. if (!useCache)
  95. {
  96. var res = ResourceLoader.Load<T>(path, null, ResourceLoader.CacheMode.Ignore);
  97. if (res == null)
  98. {
  99. Debug.LogError("加载资源失败, 未找到资源: " + path);
  100. return default;
  101. }
  102.  
  103. return res;
  104. }
  105.  
  106. if (CachePack.TryGetValue(path, out var pack))
  107. {
  108. return pack as T;
  109. }
  110.  
  111. pack = ResourceLoader.Load<T>(path);
  112. if (pack != null)
  113. {
  114. CachePack.Add(path, pack);
  115. return pack as T;
  116. }
  117. else
  118. {
  119. Debug.LogError("加载资源失败, 未找到资源: " + path);
  120. }
  121.  
  122. return default;
  123. }
  124.  
  125. /// <summary>
  126. /// 加载并且实例化场景, 并返回
  127. /// </summary>
  128. /// <param name="path">场景路径</param>
  129. /// <param name="useCache">是否使用缓存中的资源</param>
  130. public static Node LoadAndInstantiate(string path, bool useCache = true)
  131. {
  132. var packedScene = Load<PackedScene>(path, useCache);
  133. return packedScene.Instantiate();
  134. }
  135. /// <summary>
  136. /// 加载并且实例化场景, 并返回
  137. /// </summary>
  138. /// <param name="path">场景路径</param>
  139. /// <param name="useCache">是否使用缓存中的资源</param>
  140. public static T LoadAndInstantiate<T>(string path, bool useCache = true) where T : Node
  141. {
  142. var packedScene = Load<PackedScene>(path, useCache);
  143. return packedScene.Instantiate<T>();
  144. }
  145.  
  146. /// <summary>
  147. /// 读取文本资源
  148. /// </summary>
  149. public static string LoadText(string path)
  150. {
  151. string text;
  152. using (var fileAccess = FileAccess.Open(path, FileAccess.ModeFlags.Read))
  153. {
  154. text = fileAccess.GetAsText();
  155. }
  156. return text;
  157. }
  158.  
  159. /// <summary>
  160. /// 加载2d纹理资源
  161. /// </summary>
  162. /// <param name="path">资源路径</param>
  163. /// <param name="useCache">是否使用缓存中的资源</param>
  164. public static Texture2D LoadTexture2D(string path, bool useCache = true)
  165. {
  166. return Load<Texture2D>(path, useCache);
  167. }
  168.  
  169. /// <summary>
  170. /// 根据标记数据获取标记图标
  171. /// </summary>
  172. public static Texture2D GetMarkIcon(MarkInfo markInfo)
  173. {
  174. if (markInfo != null)
  175. {
  176. if (markInfo.SpecialMarkType == SpecialMarkType.BirthPoint) //出生标记
  177. {
  178. return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_BirthMark_png);
  179. }
  180. else if (markInfo.SpecialMarkType == SpecialMarkType.OutPoint) //出口标记
  181. {
  182. return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_BirthMark_png);
  183. }
  184. else if (markInfo.MarkList != null) //普通标记
  185. {
  186. if (markInfo.MarkList.Count > 1) //多个物体
  187. {
  188. return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_PackageMark_png);
  189. }
  190. else if (markInfo.MarkList.Count == 1) //单个物体
  191. {
  192. var id = markInfo.MarkList[0].Id;
  193. if (id != null)
  194. {
  195. var activityBase = PreinstallMarkManager.GetMarkConfig(id);
  196. if (activityBase != null)
  197. {
  198. return LoadTexture2D(activityBase.Icon);
  199. }
  200. }
  201. }
  202. }
  203. }
  204. //未知物体
  205. return LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_UnknownActivity_png);
  206. }
  207. /// <summary>
  208. /// 将普通路径转化为 Godot 资源路径
  209. /// </summary>
  210. public static string ToResPath(string path)
  211. {
  212. var field = path.Replace("\\", "/");
  213. return "res://" + field;
  214. }
  215.  
  216. /// <summary>
  217. /// 移除资源后缀名
  218. /// </summary>
  219. public static string RemoveExtension(string name)
  220. {
  221. var index = name.LastIndexOf(".", StringComparison.Ordinal);
  222. if (index >= 0)
  223. {
  224. return name.Substring(0, index);
  225. }
  226.  
  227. return name;
  228. }
  229. }