commit 17185ca7d14b881133e3408f56e1b0692c4a0f63 Author: ShallowT1Dream <869575054@qq.com> Date: Fri May 29 13:43:46 2026 +0800 提交第一个Tool diff --git a/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs b/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs new file mode 100644 index 0000000..06fecdd --- /dev/null +++ b/配置表联动查看器/ConfigLinkViewer/ConfigLinkDatabase.cs @@ -0,0 +1,384 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEngine; + +[Serializable] +public class ConfigTableInfo +{ + public string tableName; + public string displayName; + public string description; + public List relations = new List(); + public bool isExistInProject; +} + +[Serializable] +public class FieldRelation +{ + public string fieldName; + public string targetTable; + public string targetField; + public string relationFormat; + public string description; +} + +public static class ConfigLinkDatabase +{ + private static List _cachedData; + private static HashSet _existingTableNames; + + private const string CONFIG_PATH = "Resources/Resources_moved/config"; + + public static List GetAllTableInfo() + { + if (_cachedData != null) + return _cachedData; + + _cachedData = new List + { + new ConfigTableInfo { tableName = "activity", displayName = "活动表", description = "活动配置表" }, + new ConfigTableInfo { tableName = "activityreward", displayName = "活动奖励表", description = "活动奖励配置", relations = new List { + new FieldRelation { fieldName = "activityId", targetTable = "activity", targetField = "id", description = "关联活动" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "奖励(类型_id_数量)" } + }}, + new ConfigTableInfo { tableName = "achievement", displayName = "成就表", description = "成就配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励(类型_id_数量)" } + }}, + new ConfigTableInfo { tableName = "arenaaward", displayName = "竞技场奖励表", description = "竞技场排名奖励", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励(类型_id_数量)" } + }}, + new ConfigTableInfo { tableName = "attribute", displayName = "属性表", description = "属性配置表" }, + new ConfigTableInfo { tableName = "box", displayName = "宝箱表", description = "宝箱抽奖配置", relations = new List { + new FieldRelation { fieldName = "reward", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "buff", displayName = "Buff表", description = "Buff效果配置" }, + new ConfigTableInfo { tableName = "callstrength", displayName = "召唤强度表", description = "召唤强度概率配置" }, + new ConfigTableInfo { tableName = "checkpointreward", displayName = "关卡奖励表", description = "关卡奖励池配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "rune", targetField = "id", relationFormat = "rune_id_num", description = "符文奖励" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "道具奖励" }, + new FieldRelation { fieldName = "rewards", targetTable = "equip", targetField = "id", relationFormat = "equip_id_num", description = "装备奖励" } + }}, + new ConfigTableInfo { tableName = "collectionreward", displayName = "收藏奖励表", description = "收藏奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "common", displayName = "通用配置表", description = "通用配置项", relations = new List { + new FieldRelation { fieldName = "key", targetTable = "language", targetField = "key", description = "多语言key" } + }}, + new ConfigTableInfo { tableName = "drawlinereward", displayName = "画线奖励表", description = "画线游戏奖励", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "enemy", displayName = "敌人表", description = "敌人基础配置", relations = new List { + new FieldRelation { fieldName = "reward_id", targetTable = "checkpointreward", targetField = "id", description = "掉落奖励" }, + new FieldRelation { fieldName = "skills", targetTable = "skill", targetField = "id", description = "技能列表" } + }}, + new ConfigTableInfo { tableName = "enemylevel", displayName = "敌人等级表", description = "敌人等级成长配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "升级消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "enemy", targetField = "id", description = "关联敌人" } + }}, + new ConfigTableInfo { tableName = "equip", displayName = "装备表", description = "装备基础配置", relations = new List { + new FieldRelation { fieldName = "attr_id", targetTable = "equipAttrRandom", targetField = "id", description = "随机属性ID" }, + new FieldRelation { fieldName = "retrieve_pros", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "回收奖励" } + }}, + new ConfigTableInfo { tableName = "equipAttrRandom", displayName = "装备随机属性表", description = "装备随机属性配置" }, + new ConfigTableInfo { tableName = "equiplevel", displayName = "装备等级表", description = "装备等级成长配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "升级消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "equip", targetField = "id", description = "关联装备" } + }}, + new ConfigTableInfo { tableName = "equipstage", displayName = "装备品阶表", description = "装备品阶配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "突破消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "equip", targetField = "id", description = "关联装备" } + }}, + new ConfigTableInfo { tableName = "fight_arena", displayName = "竞技场战斗表", description = "竞技场关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_fb1", displayName = "副本战斗表1", description = "副本关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_fb2", displayName = "副本战斗表2", description = "副本关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act2", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_fb3", displayName = "副本战斗表3", description = "副本关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act3", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_fb4", displayName = "副本战斗表4", description = "副本关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act4", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_sample", displayName = "战斗样例表", description = "战斗关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "pass_rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "回合进度奖励" }, + new FieldRelation { fieldName = "out_enemy_config", targetTable = "map_act", targetField = "id", relationFormat = "表名", description = "出怪表名" } + }}, + new ConfigTableInfo { tableName = "fight_x", displayName = "战斗X表", description = "战斗关卡配置", relations = new List { + new FieldRelation { fieldName = "enemy_ids", targetTable = "enemy", targetField = "id", relationFormat = "id_pos_lv", description = "敌人(格式: id_位置_等级)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "pass_rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "回合进度奖励" } + }}, + new ConfigTableInfo { tableName = "funopencondition", displayName = "功能开放条件表", description = "功能开放条件配置" }, + new ConfigTableInfo { tableName = "gacha", displayName = "抽卡表", description = "抽卡配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "hero", targetField = "id", description = "抽卡获得的英雄" } + }}, + new ConfigTableInfo { tableName = "gachareward", displayName = "抽卡奖励表", description = "抽卡奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "game2048reward", displayName = "2048游戏奖励表", description = "2048游戏奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "guide", displayName = "引导表", description = "新手引导配置" }, + new ConfigTableInfo { tableName = "guildbox", displayName = "公会宝箱表", description = "公会宝箱配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "guilddonate", displayName = "公会捐献表", description = "公会捐献配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "消耗" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "guildlevel", displayName = "公会等级表", description = "公会等级配置" }, + new ConfigTableInfo { tableName = "guildname", displayName = "公会名称表", description = "公会名称配置" }, + new ConfigTableInfo { tableName = "hero", displayName = "英雄表", description = "英雄基础配置", relations = new List { + new FieldRelation { fieldName = "level_attr_id", targetTable = "attribute", targetField = "id", description = "升级显示属性" }, + new FieldRelation { fieldName = "stage_attr_id", targetTable = "attribute", targetField = "id", description = "升阶显示属性" }, + new FieldRelation { fieldName = "skills", targetTable = "skill", targetField = "id", description = "技能列表" }, + new FieldRelation { fieldName = "compose", targetTable = "hero", targetField = "id", description = "合成所需英雄" }, + new FieldRelation { fieldName = "equips", targetTable = "equip", targetField = "id", description = "装备列表" }, + new FieldRelation { fieldName = "buffs", targetTable = "buff", targetField = "id", relationFormat = "buffId_lv", description = "升阶解锁buff" }, + new FieldRelation { fieldName = "internal_buffs", targetTable = "buff", targetField = "id", description = "初始可抽取buff" }, + new FieldRelation { fieldName = "shardItem", targetTable = "prop", targetField = "id", description = "碎片道具ID" }, + new FieldRelation { fieldName = "activateRewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "激活奖励" } + }}, + new ConfigTableInfo { tableName = "herolevel", displayName = "英雄等级表", description = "英雄等级成长配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "升级消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "hero", targetField = "id", description = "关联英雄" } + }}, + new ConfigTableInfo { tableName = "herolevelinternal", displayName = "英雄内丹表", description = "英雄内丹配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "消耗" }, + new FieldRelation { fieldName = "buffs", targetTable = "buff", targetField = "id", description = "对应提升buff" } + }}, + new ConfigTableInfo { tableName = "herostage", displayName = "英雄品阶表", description = "英雄品阶配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "道具消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "hero", targetField = "id", description = "关联英雄" } + }}, + new ConfigTableInfo { tableName = "idlereward", displayName = "挂机奖励表", description = "挂机奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "挂机宝箱奖励" } + }}, + new ConfigTableInfo { tableName = "language", displayName = "语言表", description = "多语言配置" }, + new ConfigTableInfo { tableName = "link", displayName = "英雄羁绊表", description = "英雄羁绊配置", relations = new List { + new FieldRelation { fieldName = "hero_ids", targetTable = "hero", targetField = "id", description = "英雄ID列表" } + }}, + new ConfigTableInfo { tableName = "mail", displayName = "邮件表", description = "邮件配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "mall", displayName = "商店表", description = "商店商品配置", relations = new List { + new FieldRelation { fieldName = "productId", targetTable = "prop", targetField = "id", description = "商品道具ID" }, + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "购买消耗" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "购买获得奖励" } + }}, + new ConfigTableInfo { tableName = "map", displayName = "地图表", description = "地图房间配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "初始怪物" } + }}, + new ConfigTableInfo { tableName = "map1", displayName = "地图1表", description = "地图1房间配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "初始怪物" } + }}, + new ConfigTableInfo { tableName = "map2", displayName = "地图2表", description = "地图2房间配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "初始怪物" } + }}, + new ConfigTableInfo { tableName = "map3", displayName = "地图3表", description = "地图3房间配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "初始怪物" } + }}, + new ConfigTableInfo { tableName = "map_act", displayName = "出怪表", description = "关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物(格式: id_等级_数量_时间)" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss(格式: id_等级_数量_限时)" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "map_act2", displayName = "出怪表2", description = "关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "map_act3", displayName = "出怪表3", description = "关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "map_act4", displayName = "出怪表4", description = "关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "map_act_x", displayName = "出怪表X", description = "关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "mapx", displayName = "地图X表", description = "地图X房间配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "初始怪物" } + }}, + new ConfigTableInfo { tableName = "monthlycard", displayName = "月卡表", description = "月卡配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "recharge_id", targetTable = "recharge", targetField = "id", description = "购买立即获得" } + }}, + new ConfigTableInfo { tableName = "name", displayName = "名字表", description = "随机名字配置" }, + new ConfigTableInfo { tableName = "outenemypoint", displayName = "外出敌人点表", description = "外出敌人点配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num", description = "怪物" } + }}, + new ConfigTableInfo { tableName = "pandora", displayName = "潘多拉表", description = "潘多拉奖励池配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励池" } + }}, + new ConfigTableInfo { tableName = "pass", displayName = "通行证表", description = "通行证奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "免费奖励" }, + new FieldRelation { fieldName = "rewards2", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "付费奖励" } + }}, + new ConfigTableInfo { tableName = "player", displayName = "玩家表", description = "玩家基础配置", relations = new List { + new FieldRelation { fieldName = "equips", targetTable = "equip", targetField = "id", description = "初始装备" } + }}, + new ConfigTableInfo { tableName = "playerlevel", displayName = "玩家等级表", description = "玩家等级成长配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "升级消耗" }, + new FieldRelation { fieldName = "talent_id", targetTable = "playertalent", targetField = "id", description = "天赋ID" }, + new FieldRelation { fieldName = "target_id", targetTable = "player", targetField = "id", description = "关联玩家" } + }}, + new ConfigTableInfo { tableName = "playerskin", displayName = "玩家皮肤表", description = "玩家皮肤配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "激活消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "player", targetField = "id", description = "关联玩家" } + }}, + new ConfigTableInfo { tableName = "playerstage", displayName = "玩家境界表", description = "玩家境界配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "突破消耗" }, + new FieldRelation { fieldName = "target_id", targetTable = "player", targetField = "id", description = "关联玩家" } + }}, + new ConfigTableInfo { tableName = "playertalent", displayName = "玩家天赋表", description = "玩家天赋配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "升级消耗" }, + new FieldRelation { fieldName = "lostConsumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "抛弃消耗" } + }}, + new ConfigTableInfo { tableName = "prop", displayName = "道具表", description = "道具配置" }, + new ConfigTableInfo { tableName = "pushboxreward", displayName = "推箱奖励表", description = "推箱游戏奖励", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "qirilibao", displayName = "七日礼包表", description = "七日礼包配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "免费奖励" }, + new FieldRelation { fieldName = "rewards2", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "付费奖励" } + }}, + new ConfigTableInfo { tableName = "quest", displayName = "任务表", description = "任务配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "任务奖励" }, + new FieldRelation { fieldName = "next", targetTable = "quest", targetField = "id", description = "下一个任务" } + }}, + new ConfigTableInfo { tableName = "recharge", displayName = "充值表", description = "充值配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" }, + new FieldRelation { fieldName = "children", targetTable = "recharge", targetField = "id", description = "打包售卖关联的孩子" } + }}, + new ConfigTableInfo { tableName = "rechargegift", displayName = "累充礼物表", description = "累充礼物配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }}, + new ConfigTableInfo { tableName = "rune", displayName = "符文表", description = "符文基础配置", relations = new List { + new FieldRelation { fieldName = "attr_id", targetTable = "attribute", targetField = "id", description = "属性ID" } + }}, + new ConfigTableInfo { tableName = "runelevel", displayName = "符文等级表", description = "符文等级配置", relations = new List { + new FieldRelation { fieldName = "target_id", targetTable = "rune", targetField = "id", description = "关联符文" } + }}, + new ConfigTableInfo { tableName = "scene", displayName = "场景表", description = "场景配置", relations = new List { + new FieldRelation { fieldName = "fight_cf_name", targetTable = "fight_sample", targetField = "id", relationFormat = "表名", description = "战斗配置表名" }, + new FieldRelation { fieldName = "map_cf_name", targetTable = "map", targetField = "id", relationFormat = "表名", description = "地图配置表名" } + }}, + new ConfigTableInfo { tableName = "serverError", displayName = "服务器错误表", description = "服务器错误码配置" }, + new ConfigTableInfo { tableName = "signin", displayName = "签到表", description = "签到奖励配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "签到奖励" } + }}, + new ConfigTableInfo { tableName = "skill", displayName = "技能表", description = "技能配置", relations = new List { + new FieldRelation { fieldName = "to_partner_buff", targetTable = "buff", targetField = "id", description = "给己方的buff" }, + new FieldRelation { fieldName = "to_enemy_buff", targetTable = "buff", targetField = "id", description = "给敌方的buff" } + }}, + new ConfigTableInfo { tableName = "skilllevel", displayName = "技能等级表", description = "技能等级配置", relations = new List { + new FieldRelation { fieldName = "target_id", targetTable = "skill", targetField = "id", description = "关联技能" } + }}, + new ConfigTableInfo { tableName = "systemopen", displayName = "系统开放表", description = "系统开放条件配置" }, + new ConfigTableInfo { tableName = "test_map_act", displayName = "测试出怪表", description = "测试关卡出怪配置", relations = new List { + new FieldRelation { fieldName = "monsters", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "怪物" }, + new FieldRelation { fieldName = "boss", targetTable = "enemy", targetField = "id", relationFormat = "id_lv_num_time", description = "Boss" }, + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "波次奖励" } + }}, + new ConfigTableInfo { tableName = "title", displayName = "称号表", description = "称号配置" }, + new ConfigTableInfo { tableName = "trainbreak", displayName = "修炼突破表", description = "修炼突破配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "突破消耗" }, + new FieldRelation { fieldName = "quest", targetTable = "quest", targetField = "id", description = "突破任务" } + }}, + new ConfigTableInfo { tableName = "trainlevel", displayName = "修炼等级表", description = "修炼等级配置", relations = new List { + new FieldRelation { fieldName = "consumes", targetTable = "prop", targetField = "id", relationFormat = "item_id_num", description = "修炼消耗" } + }}, + new ConfigTableInfo { tableName = "vip", displayName = "VIP表", description = "VIP等级配置", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "免费礼包" }, + new FieldRelation { fieldName = "recharge_id", targetTable = "recharge", targetField = "id", description = "付费礼包" } + }}, + new ConfigTableInfo { tableName = "fishingreward", displayName = "钓鱼奖励表", description = "钓鱼游戏奖励", relations = new List { + new FieldRelation { fieldName = "rewards", targetTable = "prop", targetField = "id", relationFormat = "type_id_num", description = "奖励" } + }} + }; + + MarkExistingTables(); + return _cachedData; + } + + private static void MarkExistingTables() + { + _existingTableNames = new HashSet(); + + string configPath = Path.Combine(Application.dataPath, CONFIG_PATH); + if (Directory.Exists(configPath)) + { + string[] jsonFiles = Directory.GetFiles(configPath, "*.json"); + foreach (string file in jsonFiles) + { + string tableName = Path.GetFileNameWithoutExtension(file); + _existingTableNames.Add(tableName.ToLower()); + } + } + + foreach (var table in _cachedData) + { + table.isExistInProject = _existingTableNames.Contains(table.tableName.ToLower()); + } + } + + public static ConfigTableInfo GetTableInfo(string tableName) + { + return GetAllTableInfo().Find(x => x.tableName.Equals(tableName, StringComparison.OrdinalIgnoreCase)); + } + + public static List GetAllTableNames() + { + return GetAllTableInfo().ConvertAll(x => x.tableName); + } + + public static List GetAllDisplayNames() + { + return GetAllTableInfo().ConvertAll(x => $"{x.displayName} ({x.tableName})"); + } + + public static List GetExistingTables() + { + return GetAllTableInfo().Where(x => x.isExistInProject).ToList(); + } + + public static bool IsTableExist(string tableName) + { + if (_existingTableNames == null) + { + GetAllTableInfo(); + } + return _existingTableNames.Contains(tableName.ToLower()); + } + + public static void ClearCache() + { + _cachedData = null; + _existingTableNames = null; + } +} diff --git a/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs b/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs new file mode 100644 index 0000000..ff48c1c --- /dev/null +++ b/配置表联动查看器/ConfigLinkViewer/ConfigLinkViewerWindow.cs @@ -0,0 +1,261 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Linq; + +public class ConfigLinkViewerWindow : EditorWindow +{ + private string selectedTableName; + private Vector2 scrollPos; + private Dictionary expandedRelations = new Dictionary(); + private Vector2 relationScrollPos; + private string searchFilter = ""; + private bool showOnlyExisting = true; + + [MenuItem("Tools/配置表联动查看器")] + public static void ShowWindow() + { + GetWindow("配置表联动"); + } + + private void OnGUI() + { + DrawHeader(); + EditorGUILayout.Space(); + DrawTableSelector(); + EditorGUILayout.Space(); + + if (!string.IsNullOrEmpty(selectedTableName)) + { + DrawTableInfo(); + } + } + + private void DrawHeader() + { + EditorGUILayout.BeginVertical("box"); + EditorGUILayout.LabelField("配置表联动关系查看器", new GUIStyle(EditorStyles.boldLabel) { fontSize = 14 }); + EditorGUILayout.LabelField("选择配置表查看其与其他表的关联关系", EditorStyles.miniLabel); + EditorGUILayout.EndVertical(); + } + + private void DrawTableSelector() + { + EditorGUILayout.BeginVertical("box"); + + EditorGUILayout.LabelField("选择配置表:", EditorStyles.boldLabel); + + EditorGUILayout.BeginHorizontal(); + searchFilter = EditorGUILayout.TextField("搜索:", searchFilter, EditorStyles.toolbarSearchField); + showOnlyExisting = EditorGUILayout.ToggleLeft("只显示当前项目存在的表", showOnlyExisting, GUILayout.Width(160)); + EditorGUILayout.EndHorizontal(); + + var allTables = showOnlyExisting ? ConfigLinkDatabase.GetExistingTables() : ConfigLinkDatabase.GetAllTableInfo(); + var filteredTables = string.IsNullOrEmpty(searchFilter) + ? allTables + : allTables.Where(t => t.displayName.Contains(searchFilter) || + t.tableName.Contains(searchFilter) || + t.description.Contains(searchFilter)).ToList(); + + var displayNames = filteredTables.Select(x => + { + string existMark = showOnlyExisting ? "" : (x.isExistInProject ? "[存在]" : "[缺失]"); + return $"{x.displayName} ({x.tableName}) {existMark}"; + }).ToArray(); + + var tableKeys = filteredTables.Select(x => x.tableName).ToArray(); + + int selectedIndex = selectedTableName != null ? System.Array.IndexOf(tableKeys, selectedTableName) : 0; + selectedIndex = Mathf.Clamp(selectedIndex, 0, Mathf.Max(0, displayNames.Length - 1)); + + EditorGUILayout.Space(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.BeginVertical(GUILayout.Width(200)); + EditorGUILayout.LabelField($"配置表列表 ({filteredTables.Count}):", EditorStyles.miniBoldLabel); + relationScrollPos = EditorGUILayout.BeginScrollView(relationScrollPos, GUILayout.Height(300)); + + for (int i = 0; i < displayNames.Length; i++) + { + bool isSelected = tableKeys[i] == selectedTableName; + GUIStyle buttonStyle = isSelected ? "Button" : "Label"; + + if (GUILayout.Button(displayNames[i], buttonStyle)) + { + selectedTableName = tableKeys[i]; + expandedRelations.Clear(); + } + } + + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + + EditorGUILayout.BeginVertical("box", GUILayout.MinWidth(400)); + DrawCurrentTableInfo(); + EditorGUILayout.EndVertical(); + + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + } + + private void DrawCurrentTableInfo() + { + if (string.IsNullOrEmpty(selectedTableName)) + { + EditorGUILayout.LabelField("请从左侧选择一个配置表", EditorStyles.centeredGreyMiniLabel); + return; + } + + var tableInfo = ConfigLinkDatabase.GetTableInfo(selectedTableName); + if (tableInfo == null) + { + EditorGUILayout.LabelField("未找到该表的配置信息", EditorStyles.helpBox); + return; + } + + EditorGUILayout.LabelField($"当前表: {tableInfo.displayName}", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"表名: {tableInfo.tableName}", EditorStyles.miniLabel); + EditorGUILayout.LabelField($"描述: {tableInfo.description}", EditorStyles.miniLabel); + EditorGUILayout.LabelField($"状态: {(tableInfo.isExistInProject ? "存在于当前项目" : "当前项目不存在")}", + tableInfo.isExistInProject ? EditorStyles.miniLabel : EditorStyles.helpBox); + + EditorGUILayout.Space(); + + if (tableInfo.relations.Count == 0) + { + EditorGUILayout.LabelField("该表暂无联动关系", EditorStyles.miniLabel); + } + else + { + EditorGUILayout.LabelField($"联动关系 ({tableInfo.relations.Count}):", EditorStyles.boldLabel); + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(250)); + + foreach (var relation in tableInfo.relations) + { + DrawRelation(relation); + } + + EditorGUILayout.EndScrollView(); + } + } + + private void DrawRelation(FieldRelation relation) + { + string key = $"{selectedTableName}_{relation.fieldName}_{relation.targetTable}"; + if (!expandedRelations.ContainsKey(key)) + { + expandedRelations[key] = false; + } + + bool targetExist = ConfigLinkDatabase.IsTableExist(relation.targetTable); + string existMark = targetExist ? "" : "[目标表缺失]"; + + EditorGUILayout.BeginVertical("frameBox"); + expandedRelations[key] = EditorGUILayout.Foldout(expandedRelations[key], + $"{relation.fieldName} → {relation.targetTable}.{relation.targetField} {existMark}", + true); + + if (expandedRelations[key]) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(); + EditorGUILayout.BeginVertical("helpBox"); + + EditorGUILayout.LabelField($"目标表: {relation.targetTable} {(targetExist ? "" : "(当前项目不存在)")}", + targetExist ? EditorStyles.miniLabel : EditorStyles.helpBox); + EditorGUILayout.LabelField($"目标字段: {relation.targetField}", EditorStyles.miniLabel); + + if (!string.IsNullOrEmpty(relation.relationFormat)) + { + EditorGUILayout.LabelField($"格式: {relation.relationFormat}", EditorStyles.miniLabel); + } + + EditorGUILayout.LabelField($"说明: {relation.description}", EditorStyles.miniLabel); + + if (targetExist && GUILayout.Button($"查看 {relation.targetTable} 表", EditorStyles.miniButton, GUILayout.Width(120))) + { + selectedTableName = relation.targetTable; + expandedRelations.Clear(); + } + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(2); + } + + private void DrawTableInfo() + { + var tableInfo = ConfigLinkDatabase.GetTableInfo(selectedTableName); + if (tableInfo == null) return; + + EditorGUILayout.BeginVertical("box"); + + EditorGUILayout.LabelField($"当前表: {tableInfo.displayName} ({tableInfo.tableName})", EditorStyles.boldLabel); + EditorGUILayout.LabelField($"描述: {tableInfo.description}", EditorStyles.miniLabel); + + EditorGUILayout.Space(); + + if (tableInfo.relations.Count == 0) + { + EditorGUILayout.LabelField("暂无联动关系", EditorStyles.miniLabel); + } + else + { + EditorGUILayout.LabelField("联动关系:", EditorStyles.boldLabel); + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Height(300)); + + foreach (var relation in tableInfo.relations) + { + DrawRelationItem(relation); + } + + EditorGUILayout.EndScrollView(); + } + + EditorGUILayout.EndVertical(); + } + + private void DrawRelationItem(FieldRelation relation) + { + string key = $"{selectedTableName}_{relation.fieldName}"; + if (!expandedRelations.ContainsKey(key)) + { + expandedRelations[key] = true; + } + + bool targetExist = ConfigLinkDatabase.IsTableExist(relation.targetTable); + + expandedRelations[key] = EditorGUILayout.Foldout(expandedRelations[key], + $"字段: {relation.fieldName} → {relation.targetTable} {(targetExist ? "" : "(缺失)")}"); + + if (expandedRelations[key]) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(); + + EditorGUILayout.BeginVertical(); + EditorGUILayout.LabelField($"目标字段: {relation.targetField}", EditorStyles.miniLabel); + + if (!string.IsNullOrEmpty(relation.relationFormat)) + { + EditorGUILayout.LabelField($"数据格式: {relation.relationFormat}", EditorStyles.miniLabel); + } + + EditorGUILayout.LabelField($"说明: {relation.description}", EditorStyles.miniLabel); + + if (targetExist && GUILayout.Button($"跳转到 {relation.targetTable}", EditorStyles.miniButton)) + { + selectedTableName = relation.targetTable; + Repaint(); + return; + } + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + } + } +} diff --git a/配置表联动查看器/README.md b/配置表联动查看器/README.md new file mode 100644 index 0000000..c1acac2 --- /dev/null +++ b/配置表联动查看器/README.md @@ -0,0 +1,144 @@ +# 配置表联动查看器 + +一个用于 Unity 项目的配置表联动关系可视化工具,支持跨项目复用。 + +## 功能特性 + +- ✅ 支持 76+ 配置表的联动关系查看 +- ✅ 自动检测项目中实际存在的配置表 +- ✅ 智能搜索功能 +- ✅ 快速跳转到关联表 +- ✅ 显示数据格式说明 +- ✅ 跨项目自动适配 + +## 安装指南 + +### 方法一:复制文件 + +1. 找到本项目中的 `ConfigLinkViewer` 文件夹: + ``` + Assets/Scripts/mgame/tools/ConfigLinkViewer/ + ``` + +2. 复制整个文件夹到目标项目的任意位置(建议保持相同路径): + ``` + 目标项目/Assets/Scripts/mgame/tools/ConfigLinkViewer/ + ``` + +3. 打开 Unity,等待脚本编译完成。 + +### 方法二:Git 子模块(推荐) + +```bash +cd 你的项目目录 +git submodule add <本工具仓库地址> Assets/Scripts/mgame/tools/ConfigLinkViewer +``` + +## 使用说明 + +### 打开工具 + +在 Unity 编辑器菜单中点击: +``` +Tools → 配置表联动查看器 +``` + +### 界面说明 + +| 区域 | 说明 | +|------|------| +| 搜索框 | 按表名、显示名、描述搜索配置表 | +| 过滤选项 | 可选择只显示当前项目存在的表 | +| 左侧列表 | 配置表列表,显示状态标记 | +| 右侧详情 | 显示选中表的联动关系 | + +### 操作指南 + +1. **选择配置表**:从左侧列表点击任意配置表 +2. **查看联动关系**:右侧显示该表的所有字段关联 +3. **展开详情**:点击折叠箭头查看详细信息 +4. **跳转到关联表**:点击"查看 xxx 表"按钮跳转 +5. **搜索过滤**:在搜索框输入关键词快速定位 + +### 状态标识说明 + +| 标记 | 含义 | +|------|------| +| [存在] | 该表存在于当前项目 | +| [缺失] | 该表不存在于当前项目 | +| [目标表缺失] | 联动目标表不存在于当前项目 | + +## 跨项目适配 + +工具会自动检测目标项目中的配置表: + +1. 扫描路径:`Resources/Resources_moved/config/*.json` +2. 自动标记哪些表存在/缺失 +3. 缺失的表不会影响工具正常运行 +4. 联动到缺失表的跳转按钮会自动禁用 + +## 配置表联动关系示例 + +### 敌人表 (enemy) +- reward_id → checkpointreward.id - 掉落奖励 +- skills → skill.id - 技能列表 + +### 商店表 (mall) +- productId → prop.id - 商品道具ID +- consumes → prop.id (格式: item_id_num) - 购买消耗 +- rewards → prop.id (格式: item_id_num) - 购买获得奖励 + +### 英雄表 (hero) +- skills → skill.id - 技能列表 +- equips → equip.id - 装备列表 +- buffs → buff.id - 升阶解锁buff + +## 数据格式说明 + +| 格式 | 示例 | 说明 | +|------|------|------| +| item_id_num | 1001_5 | 道具ID_数量 | +| type_id_num | item_1001_5 | 类型_道具ID_数量 | +| id_pos_lv | 101_2_5 | ID_位置_等级 | +| id_lv_num | 101_5_3 | ID_等级_数量 | +| id_lv_num_time | 101_5_3_30 | ID_等级_数量_时间 | + +## 维护指南 + +### 添加新表联动关系 + +编辑 `ConfigLinkDatabase.cs`,在 `GetAllTableInfo()` 方法中添加: + +```csharp +new ConfigTableInfo { + tableName = "新表名", + displayName = "显示名称", + description = "表描述", + relations = new List { + new FieldRelation { + fieldName = "字段名", + targetTable = "目标表名", + targetField = "目标字段", + relationFormat = "数据格式(可选)", + description = "说明文字" + } + } +} +``` + +### 清理缓存 + +如果配置表有变动,可以调用: + +```csharp +ConfigLinkDatabase.ClearCache(); +``` + +## 技术支持 + +如有问题或建议,请联系开发者。 + +--- + +*版本: 1.0* +*最后更新: 2026年5月*