背景: 在开发过程中,设计文档往往滞后于代码,或者数据分散在各种
ScriptableObject、Prefab、C# 常量和JSON表中。 目标: 建立一套 “代码即真理” (Code as Truth) 的自动化管线,直接从工程源文件提取数据生成 Wiki,确保游戏内数值与 Wiki 100% 同步。
既然没有统一的 Excel 表,我们需要把 Unity 工程本身视为一个巨大的数据库。
| 数据类型 | 常见存储位置 | 提取方式 | 推荐方案 |
| :— | :— | :— | :— |
| 基础数值 (伤害公式、常量) | C# static const / Enums | 源码解析 (Roslyn) 或 反射 | C# 反射 (最简单) |
| 配置数据 (英雄、装备、怪物) | ScriptableObject (.asset) | AssetDatabase 加载 | Unity Editor 脚本 |
| 实体数据 (塔、单位属性) | Prefab (MonoBehaviour 字段) | PrefabUtility 加载 | Unity Editor 脚本 |
| 文本描述 (名称、技能说明) | Localization (.csv/.json) | 文本解析 | CSV/JSON 库读取 |
我们将创建一个 Unity Editor 工具,它在构建时运行,扫描指定目录,提取数据,并输出 Markdown 或 JSON。
为了告诉导出器哪些字段需要显示在 Wiki 上,我们需要自定义 C# Attribute。这比维护一份复杂的配置文件要灵活得多。
// 1. 定义 Attribute
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class)]
public class WikiExportAttribute : Attribute {
public string Section; // 归属板块 (如 "基础属性")
public string Desc; // 字段解释 (如 "攻击速度,单位:次/秒")
public WikiExportAttribute(string section = "General", string desc = "") { ... }
}
// 2. 在业务代码中使用
public class TowerData : ScriptableObject {
[WikiExport("Stats", "塔的基础攻击力")]
public float BaseDamage;
[WikiExport("Stats", "攻击间隔")]
public float AttackRate;
// 不需要导出的内部字段不加标签
public string internalId;
}
创建一个 WikiGenerator.cs 放在 Editor 文件夹下:
[WikiExport] 的类。AssetDatabase.FindAssets("t:TowerData") 找到所有实例。StringBuilder 拼接 Markdown 表格。// 伪代码示例
public static void GenerateWiki() {
var sb = new StringBuilder();
sb.AppendLine("# 🏰 防御塔图鉴");
sb.AppendLine("| 名称 | 攻击力 | 攻速 | 说明 |");
sb.AppendLine("| :--- | :--- | :--- | :--- |");
var guids = AssetDatabase.FindAssets("t:TowerData");
foreach (var guid in guids) {
var path = AssetDatabase.GUIDToAssetPath(guid);
var tower = AssetDatabase.LoadAssetAtPath<TowerData>(path);
sb.Append($"| {tower.displayName} ");
sb.Append($"| {tower.BaseDamage} ");
sb.Append($"| {tower.AttackRate} ");
sb.Append($"| {tower.description} |
");
}
File.WriteAllText("Docs/Wiki/Towers.md", sb.ToString());
}
ScriptableObject 数值。Tools > Vampirefall > Generate Wiki。Docs/ 目录下生成最新的 .md 文件。-batchmode -executeMethod WikiGenerator.GenerateWiki -quit单纯的数据表格很难看。建议采用 模板注入 的方式。
Tower_Template.md):
# {DisplayName}
## 基础信息
- 类型: {Type}
- 稀有度: {Rarity}
## 属性表
{StatsTable}
## 技能描述
> {SkillDescription}
[WikiExport] Attribute,并给核心类 (EnemyData, TowerData, ItemData) 加上标签。ENEMY_001。AssetDatabase.FindAssets("t:Prefab") -> LoadAsset -> GetComponent<MyScript>() -> 读取字段。Sprite 复制到 Wiki 的 images/ 目录,并按 UUID 重命名,确保链接不失效。