Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / generator / ResourcePathGenerator.cs
  1.  
  2. using System.IO;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using Godot;
  6.  
  7. namespace Generator;
  8.  
  9. /// <summary>
  10. /// ResourcePath 类文件生成器
  11. /// </summary>
  12. public static class ResourcePathGenerator
  13. {
  14. //支持后缀
  15. private static string[] suffix =
  16. {
  17. ".png", ".jpg", ".txt", ".json", ".ini", ".tscn", ".tres", ".otf", ".gdshader", ".ogg", ".mp3", ".wav", ".svg"
  18. };
  19. //排除第一层的文件夹
  20. private static string[] exclude =
  21. {
  22. ".vscode", ".idea", ".git", ".import", ".mono", "android", "addons", ".godot"
  23. };
  24. private static string currDir = System.Environment.CurrentDirectory;
  25.  
  26. private static string resultStr = "";
  27.  
  28. //保存路径
  29. public static string savePath = "src/game/manager/ResourcePath.cs";
  30.  
  31. /// <summary>
  32. /// 执行生成操作
  33. /// </summary>
  34. public static void Generate()
  35. {
  36. resultStr = "/// <summary>\n" +
  37. "/// 编辑器下所有资源路径, 该类为 Automation 面板下自动生成的, 请不要手动编辑!\n" +
  38. "/// </summary>\n" +
  39. "public class ResourcePath\n" +
  40. "{\n";
  41.  
  42. GD.Print("更新 ResourcePath...");
  43.  
  44. var directoryInfo = new DirectoryInfo(currDir);
  45.  
  46. var directories = directoryInfo.GetDirectories();
  47. for (int i = 0; i < directories.Length; i++)
  48. {
  49. var directory = directories[i];
  50. if (!exclude.Contains(directory.Name))
  51. {
  52. EachDir(directory);
  53. }
  54. }
  55.  
  56. var fileInfos = directoryInfo.GetFiles();
  57. for (var i = 0; i < fileInfos.Length; i++)
  58. {
  59. HandleFile(fileInfos[i]);
  60. }
  61.  
  62. resultStr += "}";
  63. File.WriteAllText(savePath, resultStr);
  64. GD.Print("ResourcePath.cs 写出完成!");
  65. }
  66. private static void EachDir(DirectoryInfo directoryInfos)
  67. {
  68. var fileInfos = directoryInfos.GetFiles();
  69. for (var i = 0; i < fileInfos.Length; i++)
  70. {
  71. HandleFile(fileInfos[i]);
  72. }
  73.  
  74. var directories = directoryInfos.GetDirectories();
  75. for (var i = 0; i < directories.Length; i++)
  76. {
  77. EachDir(directories[i]);
  78. }
  79. }
  80.  
  81. private static void HandleFile(FileInfo fileInfo)
  82. {
  83. if (suffix.Contains(fileInfo.Extension))
  84. {
  85. var field = fileInfo.FullName.Substring(currDir.Length + 1);
  86. field = field.Replace("\\", "/");
  87. var resPath = "res://" + field;
  88. field = field.Replace(".", "_");
  89. field = field.Replace("/", "_");
  90. field = Regex.Replace(field, "[^\\w_]", "");
  91. resultStr += $" public const string {field} = \"{resPath}\";\n";
  92. }
  93. }
  94. }