前言
在文明 6 的创意工坊中订阅了两个功能极为相似的模组,感觉这两个模组的代码应该差不多,于是打算分析完成这两个模组就自己写一个.
文明六Sid Meier's Civilization VI
是一款回合制策略游戏,让玩家尝试建立起一个帝国,并接受时间的考验.玩家将创建及带领自己的文明从石器时代迈向信息时代,并成为世界的领导者.
模组 Modification
缩写为 Mod
,简体中文翻译为模组,它是游戏的一种修改或增强程序.比如玩家向游戏中添加了游戏本身不存在的物体使游戏更加有趣.
创意工坊 是 Steam
游戏平台针对特定游戏提供一个 Mod
下载页面,玩家可以下载自己喜欢的 Mod
来增强自己的游戏体验
游戏中开局你将扮演一个领袖在地图上创建你的第一座城市,城市下有很多的区域比如:学院、市场、娱乐区域、圣地区域(市民进行宗教活动的区域)、军营和港口等.
市中心区域是城市创建后首先要建造的基础设施用来保障市民的生活.
前段时间在 B 站看到了一个文明六的创建一个简单模组的教程,于是乎把压抑已久的想法想要实现一下.
但是当打开模组开发工具时,我发现模组开发并不那么容易,跟着这个 B 站教程做了一遍之后遇到了许多困难.过了几个月,也就是前几天,我决定从别人的模组开始入手学习,制作一个属于自己的模组.
本文主要讲解这个模组的设计思路,以及如何创建属于自己的模组.
模组介绍
这个模组名为StringOD of House
,它的作用是,向文明六任意国家的任意已创建城市的市中心区域下新增一个带有各种加成的建筑物,目前添加的建筑为 “少年的出租屋 ”
它的加成和模组信息如下图:
下载地址
如果你不想学习创建属于自己的 Mod
你可以直接下载并体验它【目前不直接提供下载,防止某些三方网站没有经过允许私自转发售卖,有需要可以发邮件告诉我】
模组的存放路径为 %userprofile%\Documents\My Games\Sid Meier's Civilization VI\Mods
,你需要解压缩把StringOD
文件夹放在 Mods
目录下.
如果你想学习创建属于自己的 Mod
并向游戏中添加自己更多的想法,请耐心的花费十分钟的时间看完这篇文章.
参考链接
搭建环境
Steam
中打开 库- 点击 库 下面的 游戏 下拉框,勾选 工具
库 下面的 主页 下面的
- 安装
Sid Meier's Civilization VI Development Tools
- 启动之后选择
ModBuddy
至此,环境搭建完成
创建你的第一个建筑模组
这个时候你应该能看到 Start Page
的页面.
- 创建新的模组选择
New Mod
- 更改下面的模组名称
Name
最好是英文 - 更改模组的存储位置
Location
(当然可以不更改) - 选择右小角的
OK
至此,当你看到一个英文的 Starter Project
页面时说明你的第一个模组创建成功.
开始分析别人的模组
模组介绍
这是上文提到的两个相似的模组,他们都在市中心区域添加了单独的建筑:
-
God's House - Cheat Mod
针对当前城市修改了城市的产量,这其中包含:黄金,信仰,文化,科技,食物,生产力,住房以及宜居度. -
Player Only Cheat Building
针对当前城市修改了城市的产量,这其中包含:黄金,信仰,文化,科技,食物,生产力,住房,宜居度.战略资源包含了:铁,煤,马,硝石,铝,铀.
这两个模组在每一回合都会生产预先设置好的资源.
寻找模组文件
首先,得找到模组的文件路径.我发现从创意工坊下载的模组都是一串数字代替的名字.比如:
1 | 1109505115 |
这个时候我想到每个模组文件中一定会包含模组在游戏中显示的名字或模组的建筑名称.(用已知字符串搜索整个可能存在这些文件的目录下的每个文件中的内容)
启动 HBuilderX
打开 Steam
的创意工坊目录 ..\SteamLibrary\steamapps\workshop\content\289070
,然后在这个目录下的所有文件中查找 包含有 God's House
字符串的文件,根据搜索结果得到模组的目录名称 1395251854
第二个模组的文件路径所使用的搜索字符串是游戏中显示的建筑名称,创意工坊给出的模组名称和模组中显示的名称不一样.最后根据游戏中显示的建筑名称 YoRHa_Core
在整个目录检索到的目录名称为 1956601153
.
至此,得到了两个模组的文件路径.
分析文件结构
从文件名称猜测
先对比一下两个模组的文件结构.
1 | 1956601153 - YoRHa_Core |
可以看出感觉这两个模组差不多,唯一不同的是 YoRHa_Core
目录下多了一个 Blu.png
这是一个图片文件,猜测可能是背景图.
从模组的文件名字中能大概猜测到每个文件的作用.
-
xxx_Gameplay.xml
应该是整个模组最主要的部分 -
xxx_Icons.xml
应该是该模组在游戏中显示的图标 -
xxx_Text.xml
应该是存放文本的文件,比如游戏中显示文字 -
xxx.modinfo
应该是用来存储当前模组的基本信息文件
为了进一步确定每个文件的作用和功能就得打开文件读代码.
打开每个文件读代码
在这里就用 YoRHa_Core
这个 Mod
来解释和翻译.
打开文件翻译每对标签的中文翻译.先从最外层往内层翻译.
-
xxx_Gameplay.xml
模组的最重要的游戏数据文件
1 | <!-- 游戏数据, 整个模组的代码都得写在这个里面 --> |
-
xxx_Icons.xml
这是一个图标引用文件,主要作用是针对这个模组在生产队列中给建筑提供图标
1 | <!-- 图标命名 引用游戏自带图标 26代表工厂建筑图标 --> |
-
xxx_Text.xml
这是一个语言文件,当你的游戏主要语言更改时模组会选择一个已提供的语言进行显示,如果没有就默认显示英文(模组默认支持的语种)
1 | <!-- 在游戏中显示的各种名称和解释以及描述, 针对不同的语种 --> |
-
xxx.modinfo
这是一个模组创建完成且在发布时所需要填写的信息文件
1 | <!-- 模组唯一ID --> |
至此,每个文件的作用以及具体写法已经了解了.
开始编写模组
至此,我们应该已经创建完成了属于我们的第一个模组.如果你还没有完成创建,你可能需要先完成上一个步骤
描述需求
添加一个市中心下的建筑,建造成本为 100 金币,每回合生产3文化值,每个回合建筑生产1个点数艺术家,作家,音乐家工程师,城市每回合产出 100 黄金.
编写模组
打开 Solution Explorer
面板时,我们创建的项目下多了两个文件 xxx_Art.xml
直接删掉这个文件,我也不知道这个文件的作用,GettingStarted.html
这个也可以删掉这是一个帮助页面.为了学习别人的模组最好和别人保持一致.
你可能会感到疑惑,为什么没有出现 xxx.modinfo
文件?
我后来生成模组时发现,这是因为这个文件是在后来构建或者运行模组时编译器自动生成的.
xxx_Gameplay.xml 文件代码编写
直接看代码,先把英文注释翻译为中文.
1 | <GameData> |
这里最有意思的就是第三个注释中提供的文件路径,打开资源浏览器找到这个目录..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\Gameplay\Data
.
这个目录下有很多的文件都是英文,猜测应该是游戏中每个分类的数据文件.我是说再写模组时想要修改游戏本身的数据就得需要这些文件.还是得先翻译一下这些英文都是什么意思才行.在当前目录下打开命令行
1 | 输出当前目录所有文件名到 CivFileList.txt |
然后打开 CivFileList.txt
这个文件,拷贝所有英文到 谷歌或其他翻译词典里面翻译.得到中文翻译:
1 | # 部分翻译 |
先用代码编辑器打开一个与我们写模组最有直接关系的文件 Buildings.xml
,没了解过 xml
文件的大兄弟,就可以把它当作 HTML
文件一样看待.主要关注标签的译文和标签内的代码,尤其是出现频率最高的单词比如:xxxName, xxxType
之类的.先通读这两千多行代码,主要关注注释和标签内前几行内容,得先知道这个文件整体结构怎么写的.
到这里,已经了解完了这个文件.至少是靠着翻译读了一遍.看这个文件的目的为了能在自己的模组中添加更多的内容.
打开别人的模组 YoRHaCore
中对应的文件 YoRHa_Core_Gameplay.xml
来复制粘贴到我的模组中然后测试运行,看效果.
- 根据
YoRHa_Core_Gameplay.xml
复制粘贴的修改城市每回合黄金产量为 116,每回合产出伟人点数 + 1(艺术家,工程师,音乐家,作家),BUILDING_TestCase
建筑每回合产出 3 个文化值.
1 |
|
这其中的几行的解释已经在前面解释过了.我想在看一遍每行代码的注解
从游戏提供的代码抽取需要的代码到模组中
写到这里你可以看得出每对标签都对应着每一个文件中的内容,比如:..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\Gameplay\Data
目录下的文件 Buildings.xml
对应着代码中的标签 <Buildings></Buildings>
,<Modifiers></Modifiers>
.
每对标签中对应的代码其实在原始游戏文件中都已经存在,只不过我们是把我们需要的某个文件中的东西拿出来组成一个新的东西.
比如:Buildings.xml
文件中第 380 行中建筑提供每回合的 2 科技值的生产
1 | <!-- 图书馆 生产2科技--> |
在 ModifierArguments
标签中允许修改建筑属性参数,在Buildings.xml
的第 879 行中是对金字塔奇观的建造费用调整,这个值可以是任意的某个值.
1 | <Row> |
示例:在我上文提到的两个模组中,建筑每回合生产都只是写了一个信仰每回合 + 1.
1 | <Building_YieldChanges> |
可以根据收益类型看出,肯定不止有信仰这一种.首先打开最有可能出现的文件 Buildings.xml
,尝试找一下金币,文化,科技的加成.
- 第 338 行,这是一个剧场奇观.每回合 + 2 的文化
1 | <Row BuildingType="BUILDING_AMPHITHEATER" YieldType="YIELD_CULTURE" YieldChange="2"/> |
- 第 363 行,这是一个银行建筑,每回合 + 5 黄金
1 | <Row BuildingType="BUILDING_BANK" YieldType="YIELD_GOLD" YieldChange="5"/> |
- 第 380 行,这是一个图书馆,每回合 + 2 科技值
1 | <Row BuildingType="BUILDING_LIBRARY" YieldType="YIELD_SCIENCE" YieldChange="2"/> |
至此,这个文件下的代码就是把需要的代码添加到我们创建模组中对应的标签下,如果模组中没有对应添加的标签,那就从你抽取的那个代码的文件中把标签照着添加到你的模组中缺少的文件中.不知道你写的对不对就构建运行进游戏看看,有没有生效,如果没有就是你写的有问题.
xxx_Icons.xml 图标文件编写
这个文件默认是不用改的,除非你不想使用默认的图标.
1 | <!-- |
这个目录下的所有文件是针对每个分类下的图标显示 ..\SteamLibrary\steamapps\common\Sid Meier's Civilization VI\Base\Assets\UI\Icons
,这个 Index="26"
的来历,就在这个目录下的 Icons_Buildings.xml
文件中的 第 41 行.
1 | <Row /> |
如果你想使用其他图标你只需要更改的属性,只有两个 Altas
和 Index
务必要保持这两个一致.
你也可以使用其他类型的单位图标,比如不是建筑的图标.
xxx_Text.xml 模组建筑描述文件编写
这个文件主要存放的是建筑的语言信息,看到这里你也发现了.所有的代码都是英文没有包含一个中文.(除注释之外)
1 | <GameData> |
xxx_modinfo 模组信息文件编写
这个文件不需要自己创建 ,它会由编译器自动生成.
找到菜单栏中的 PROJECT
中的 XXX Properties...
会打开一个界面,选择左侧的 Mod Info
然后填写你的模组名称和描述以及小故事,还有感谢的人.
在选择左侧的 In-Game Actions
你看到了左边显示的三个Type
和三个 Id
选择第一个 Type
中的 UpdataDatabase
ID 为 Gameplay
,这时你会看到右侧会显示一个大框里面显示了一个文件 NewBuilding_Gameplay.xml
文件,选中这个文件然后点击右侧的 Remove
然后在选择 Add
在弹出的新窗口中选择 File
列表框中的你模组对应的那个 xxx_Gameplay.xml
文件,然后点击 OK
.然后在依次更新 Icons
文件和 Text
文件.
完成之后保存所有文件,至此就可以构建解决方案和模组了,并测试运行了.
生成你的模组
- 菜单栏中选择
BUILD
然后选择Build Solution
- 菜单栏中选择
BUILD
然后选择Build xxxx
此时,你的模组已经成功生成.你可以打开游戏并在"额外内容中启用你的本地模组".
删除你的模组
在调试模组中经常出现问题,所以我们不得不删除解决方案和模组重新生成.
- 菜单栏中选择
BUILD
然后选择Clear Solution
- 菜单栏中选择
BUILD
然后选择Clear xxxx
这只是删除了你生成的模组文件,你的代码并没有被删除.
至此,你已经学会了如何编写你的第一个模组.