上一篇把 mod 的“最小可运行骨架”搭好之后,我收到最多的反馈就是:架子我会搭了,接下来呢?这篇文章就把“做一个新单位”当主线,从塞进游戏、让它能被 AI 正常使用,到额外挂一段 Lua 回血逻辑,完整走一遍。
我做文明 6 mod 已经有几年了,最大的体会是:不要一上来就憋一个“全新文明+领秀+特殊玩法”的大项目。第一次做内容是很容易在数据表关系里迷路的。做一个带明确机制的新单位反而是最好的练手项目,因为它同时涉及到数据库、文本、脚本三条线,这三条线都跑通了,后面再做文明、领袖、改良设施,基本都是同一套思路的延展。
这篇里的目标定义得很具体:单位叫“遗迹斥候”,定位介于侦察兵和弓手之间,三格移动力,两格远程攻击,成本中等偏下,同时自带一个特殊机制——每回合自动回复 10 点生命。这个“特殊机制”用 Lua 写,很小,但足够把文明 6 mod 里最难理解的那部分“脚本执行时机”讲明白。
1. 先搞懂文明6加载mod的整套逻辑
1.1 Modinfo 不只是入口文件,它决定加载顺序
新人在刚接触文明 6 mod 时,最喜欢做的事就是照着别人 mod 里的文件结构复制粘贴。复制多了你会发现,有些 mod 明明是同样改数据库,却在 .modinfo 里写了不一样的 Action,然后结果也一样。这就让人很困惑:到底哪个写法才是对的?
先把 .modinfo 理解成一个“打包清单”加“执行清单”。我习惯把 mod 文件按功能分目录:
text复制LegendScoutMod/
├── LegendScoutMod.modinfo
├── Data/
│ └── Gameplay.sql
├── Text/
│ └── LocalizedText.xml
└── Core/
└── LegendScoutScript.lua
对应的 .modinfo 长成下面这样:
xml复制<?xml version="1.0" encoding="utf-8"?>
<Mod id="LegendScoutMod_2025" version="1.0">
<Properties>
<Name>遗迹斥候单位包</Name>
<Teaser>一个自带回血机制的侦察单位</Teaser>
<Description>演示文明6 Mod 制作第二篇的完整数据与脚本流程</Description>
<Authors>YourName</Authors>
<AffectsSavedGames>0</AffectsSavedGames>
</Properties>
<Files>
<File>Data/Gameplay.sql</File>
<File>Text/LocalizedText.xml</File>
<File>Core/LegendScoutScript.lua</File>
</Files>
<Actions>
<UpdateDatabase>Data/Gameplay.sql</UpdateDatabase>
<UpdateText>Text/LocalizedText.xml</UpdateText>
<AddGameplayScripts>Core/LegendScoutScript.lua</AddGameplayScripts>
</Actions>
</Mod>
注意 id 一栏。文明 6 判断两个 mod 是不是同一个,主要看这个 id。新手最常踩的坑就是:别人 mod 改了 id,你在本地也建了一个同 id 的 mod,结果游戏里只加载其中一个,怎么删都删不干净。
我自己的规范是:id 里至少带一个前缀年份,例如
LegendScoutMod_2025,然后 version
