diff --git a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Automation.cs b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Automation.cs index e8b7e51..576b44f 100644 --- a/DungeonShooting_Godot/addons/dungeonShooting_plugin/Automation.cs +++ b/DungeonShooting_Godot/addons/dungeonShooting_plugin/Automation.cs @@ -1,64 +1,16 @@ #if TOOLS -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.Json; -using System.Text.RegularExpressions; +using Generator; using Godot; -using File = System.IO.File; [Tool] public partial class Automation : Control { - //支持后缀 - private string[] suffix = - { - ".png", ".jpg", ".txt", ".json", ".ini", ".tscn", ".tres", ".otf", ".gdshader", ".ogg", ".mp3", ".wav", ".svg" - }; - //排除第一层的文件夹 - private string[] exclude = - { - ".vscode", ".idea", ".git", ".import", ".mono", "android", "addons", ".godot" - }; - private string currDir = System.Environment.CurrentDirectory; - - private string resultStr = ""; - /// /// 更新 ResourcePath /// private void _on_Button_pressed() { - resultStr = "/// \n" + - "/// 编辑器下所有资源路径, 该类为 Automation 面板下自动生成的, 请不要手动编辑!\n" + - "/// \n" + - "public class ResourcePath\n" + - "{\n"; - - GD.Print("更新 ResourcePath..."); - - var directoryInfo = new DirectoryInfo(currDir); - - var directories = directoryInfo.GetDirectories(); - for (int i = 0; i < directories.Length; i++) - { - var directory = directories[i]; - if (!exclude.Contains(directory.Name)) - { - EachDir(directory); - } - } - - var fileInfos = directoryInfo.GetFiles(); - for (var i = 0; i < fileInfos.Length; i++) - { - HandleFile(fileInfos[i]); - } - - resultStr += "}"; - File.WriteAllText("src/game/manager/ResourcePath.cs", resultStr); - GD.Print("ResourcePath.cs 写出完成!"); + ResourcePathGenerator.Generate(); } /// @@ -66,139 +18,7 @@ /// private void _on_Button2_pressed() { - //地图路径 - var tileDir = DungeonRoomTemplate.RoomTileDir; - //地图描述数据路径 - var tileDataDir = DungeonRoomTemplate.RoomTileDataDir; - - var tileDirInfo = new DirectoryInfo(tileDir); - var tileDataDirInfo = new DirectoryInfo(tileDataDir); - - //所有地图列表 - var mapList = new HashSet(); - - //收集所有名称 - var fileDataInfos = tileDataDirInfo.GetFiles(); - foreach (var fileInfo in fileDataInfos) - { - mapList.Add(RemoveExtension(fileInfo.Name)); - } - //收集所有名称 - var fileInfos = tileDirInfo.GetFiles(); - foreach (var fileInfo in fileInfos) - { - if (fileInfo.Extension == ".tscn") - { - mapList.Add(RemoveExtension(fileInfo.Name)); - } - } - - //剔除多余的 tile.json - var arrays = mapList.ToArray(); - foreach (var item in arrays) - { - if (!File.Exists(tileDir + item + ".tscn")) - { - mapList.Remove(item); - var filePath = tileDataDir + item + ".json"; - if (File.Exists(filePath)) - { - GD.Print($"未找到'{tileDir + item}.tscn', 删除配置文件: {filePath}"); - File.Delete(filePath); - } - } - } - - //手动生成缺失的 tile.json - foreach (var item in mapList) - { - if (!File.Exists(tileDataDir + item + ".json")) - { - var tscnName = tileDir + item + ".tscn"; - var packedScene = ResourceManager.Load(tscnName, false); - if (packedScene != null) - { - var dungeonRoomTemplate = packedScene.Instantiate(); - var usedRect = dungeonRoomTemplate.GetUsedRect(); - var dungeonTile = new DungeonTile(dungeonRoomTemplate); - dungeonTile.SetFloorAtlasCoords(new List() { new Vector2I(0, 8) }); - //计算导航网格 - dungeonTile.GenerateNavigationPolygon(0); - var polygonData = dungeonTile.GetPolygonData(); - DungeonRoomTemplate.SaveConfig(new List(), usedRect.Position, usedRect.Size, polygonData.ToList(), item); - dungeonRoomTemplate.QueueFree(); - } - } - } - - var list = new List(); - //整合操作 - foreach (var item in mapList) - { - var configPath = tileDataDir + item + ".json"; - var configText = File.ReadAllText(configPath); - var roomInfo = DungeonRoomTemplate.DeserializeDungeonRoomInfo(configText); - var split = new DungeonRoomSplit(); - split.ScenePath = ToResPath(tileDir + item + ".tscn"); - split.ConfigPath = ToResPath(configPath); - split.RoomInfo = roomInfo; - list.Add(split); - } - - //写出配置 - var config = new JsonSerializerOptions(); - config.WriteIndented = true; - var text = JsonSerializer.Serialize(list, config); - File.WriteAllText(DungeonRoomTemplate.RoomTileConfigFile, text); - - GD.Print("地牢房间配置, 重新打包完成!"); - } - - private void EachDir(DirectoryInfo directoryInfos) - { - var fileInfos = directoryInfos.GetFiles(); - for (var i = 0; i < fileInfos.Length; i++) - { - HandleFile(fileInfos[i]); - } - - var directories = directoryInfos.GetDirectories(); - for (var i = 0; i < directories.Length; i++) - { - EachDir(directories[i]); - } - } - - private void HandleFile(FileInfo fileInfo) - { - if (suffix.Contains(fileInfo.Extension)) - { - var field = fileInfo.FullName.Substring(currDir.Length + 1); - field = field.Replace("\\", "/"); - var resPath = "res://" + field; - field = field.Replace(".", "_"); - field = field.Replace("/", "_"); - field = Regex.Replace(field, "[^\\w_]", ""); - resultStr += $" public const string {field} = \"{resPath}\";\n"; - } - } - - private string ToResPath(string path) - { - var field = path.Substring(currDir.Length + 1); - field = field.Replace("\\", "/"); - return "res://" + field; - } - - private string RemoveExtension(string name) - { - var index = name.LastIndexOf(".", StringComparison.Ordinal); - if (index >= 0) - { - return name.Substring(0, index); - } - - return name; + RoomPackGenerator.Generate(); } } #endif \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/generator/ResourcePathGenerator.cs b/DungeonShooting_Godot/src/framework/generator/ResourcePathGenerator.cs new file mode 100644 index 0000000..0958ed4 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/generator/ResourcePathGenerator.cs @@ -0,0 +1,96 @@ + +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Godot; + +namespace Generator; + +/// +/// ResourcePath 类文件生成器 +/// +public static class ResourcePathGenerator +{ + //支持后缀 + private static string[] suffix = + { + ".png", ".jpg", ".txt", ".json", ".ini", ".tscn", ".tres", ".otf", ".gdshader", ".ogg", ".mp3", ".wav", ".svg" + }; + //排除第一层的文件夹 + private static string[] exclude = + { + ".vscode", ".idea", ".git", ".import", ".mono", "android", "addons", ".godot" + }; + private static string currDir = System.Environment.CurrentDirectory; + + private static string resultStr = ""; + + //保存路径 + public static string savePath = "src/game/manager/ResourcePath.cs"; + + /// + /// 执行生成操作 + /// + public static void Generate() + { + resultStr = "/// \n" + + "/// 编辑器下所有资源路径, 该类为 Automation 面板下自动生成的, 请不要手动编辑!\n" + + "/// \n" + + "public class ResourcePath\n" + + "{\n"; + + GD.Print("更新 ResourcePath..."); + + var directoryInfo = new DirectoryInfo(currDir); + + var directories = directoryInfo.GetDirectories(); + for (int i = 0; i < directories.Length; i++) + { + var directory = directories[i]; + if (!exclude.Contains(directory.Name)) + { + EachDir(directory); + } + } + + var fileInfos = directoryInfo.GetFiles(); + for (var i = 0; i < fileInfos.Length; i++) + { + HandleFile(fileInfos[i]); + } + + resultStr += "}"; + File.WriteAllText(savePath, resultStr); + GD.Print("ResourcePath.cs 写出完成!"); + } + + private static void EachDir(DirectoryInfo directoryInfos) + { + var fileInfos = directoryInfos.GetFiles(); + for (var i = 0; i < fileInfos.Length; i++) + { + HandleFile(fileInfos[i]); + } + + var directories = directoryInfos.GetDirectories(); + for (var i = 0; i < directories.Length; i++) + { + EachDir(directories[i]); + } + } + + private static void HandleFile(FileInfo fileInfo) + { + if (suffix.Contains(fileInfo.Extension)) + { + var field = fileInfo.FullName.Substring(currDir.Length + 1); + field = field.Replace("\\", "/"); + var resPath = "res://" + field; + field = field.Replace(".", "_"); + field = field.Replace("/", "_"); + field = Regex.Replace(field, "[^\\w_]", ""); + resultStr += $" public const string {field} = \"{resPath}\";\n"; + } + } + +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/generator/RoomPackGenerator.cs b/DungeonShooting_Godot/src/framework/generator/RoomPackGenerator.cs new file mode 100644 index 0000000..046b4ff --- /dev/null +++ b/DungeonShooting_Godot/src/framework/generator/RoomPackGenerator.cs @@ -0,0 +1,128 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using Godot; + +namespace Generator; + +/// +/// 预制房间数据生成器 +/// +public static class RoomPackGenerator +{ + private static string currDir = System.Environment.CurrentDirectory; + + /// + /// 执行生成操作 + /// + public static void Generate() + { + //地图路径 + var tileDir = DungeonRoomTemplate.RoomTileDir; + //地图描述数据路径 + var tileDataDir = DungeonRoomTemplate.RoomTileDataDir; + + var tileDirInfo = new DirectoryInfo(tileDir); + var tileDataDirInfo = new DirectoryInfo(tileDataDir); + + //所有地图列表 + var mapList = new HashSet(); + + //收集所有名称 + var fileDataInfos = tileDataDirInfo.GetFiles(); + foreach (var fileInfo in fileDataInfos) + { + mapList.Add(RemoveExtension(fileInfo.Name)); + } + //收集所有名称 + var fileInfos = tileDirInfo.GetFiles(); + foreach (var fileInfo in fileInfos) + { + if (fileInfo.Extension == ".tscn") + { + mapList.Add(RemoveExtension(fileInfo.Name)); + } + } + + //剔除多余的 tile.json + var arrays = mapList.ToArray(); + foreach (var item in arrays) + { + if (!File.Exists(tileDir + item + ".tscn")) + { + mapList.Remove(item); + var filePath = tileDataDir + item + ".json"; + if (File.Exists(filePath)) + { + GD.Print($"未找到'{tileDir + item}.tscn', 删除配置文件: {filePath}"); + File.Delete(filePath); + } + } + } + + //手动生成缺失的 tile.json + foreach (var item in mapList) + { + if (!File.Exists(tileDataDir + item + ".json")) + { + var tscnName = tileDir + item + ".tscn"; + var packedScene = ResourceManager.Load(tscnName, false); + if (packedScene != null) + { + var dungeonRoomTemplate = packedScene.Instantiate(); + var usedRect = dungeonRoomTemplate.GetUsedRect(); + var dungeonTile = new DungeonTile(dungeonRoomTemplate); + dungeonTile.SetFloorAtlasCoords(new List() { new Vector2I(0, 8) }); + //计算导航网格 + dungeonTile.GenerateNavigationPolygon(0); + var polygonData = dungeonTile.GetPolygonData(); + DungeonRoomTemplate.SaveConfig(new List(), usedRect.Position, usedRect.Size, polygonData.ToList(), item); + dungeonRoomTemplate.QueueFree(); + } + } + } + + var list = new List(); + //整合操作 + foreach (var item in mapList) + { + var configPath = tileDataDir + item + ".json"; + var configText = File.ReadAllText(configPath); + var roomInfo = DungeonRoomTemplate.DeserializeDungeonRoomInfo(configText); + var split = new DungeonRoomSplit(); + split.ScenePath = ToResPath(tileDir + item + ".tscn"); + split.ConfigPath = ToResPath(configPath); + split.RoomInfo = roomInfo; + list.Add(split); + } + + //写出配置 + var config = new JsonSerializerOptions(); + config.WriteIndented = true; + var text = JsonSerializer.Serialize(list, config); + File.WriteAllText(DungeonRoomTemplate.RoomTileConfigFile, text); + + GD.Print("地牢房间配置, 重新打包完成!"); + } + + private static string ToResPath(string path) + { + var field = path.Substring(currDir.Length + 1); + field = field.Replace("\\", "/"); + return "res://" + field; + } + + private static string RemoveExtension(string name) + { + var index = name.LastIndexOf(".", StringComparison.Ordinal); + if (index >= 0) + { + return name.Substring(0, index); + } + + return name; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs new file mode 100644 index 0000000..c6c8380 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs @@ -0,0 +1,7 @@ + +namespace Generator; + +public static class UiGenerator +{ + +} \ No newline at end of file