三、创建一个项目并配置civ6proj文件
该章节将阐述关于civ6proj的一些内容。
Last updated
Was this helpful?
该章节将阐述关于civ6proj的一些内容。
Last updated
Was this helpful?
我们要知道,每一个Mod都是一个项目,所以创建新项目是开始写一个Mod的第一步。
Starter相关的是官方的Mod样例项目,其中包含每种类型的基本代码。
注意这两步名称内不应该包括奇特的字符,例如/ * \ ? 等等不满足文件命名要求的,会造成编译出错等奇特问题(而且不好修复)。
我们选择对应DLC的空MOD(Empty Mod,后面小括号内是DLC版本),在Name中填写上Mod的项目名称,点击OK。
当我们点击OK后,会弹出创建新Mod步骤1的窗口,我们需要根据文本框依次填写标题、作者、特别感谢、描述等内容,当然,不填写也可以在项目中修改。
Description(描述)有最小字数限制,若不满足条件则无法点击其他按钮和控件。
这里不建议填写中文,若需要中文后续再改(部分字段涉及到项目的初次生成)。
新人强烈建议确定Title!!!原因如下:(看不懂也没关系,后面会讲)。
进阶Modder注意:Mod.Art.xml的<id><name>会根据这里的Title生成。
进阶Modder注意:老版本的art.xml生成会是mod.art.xml,新版本空格都会变成_,建议手动纠正xml中的<id><name>中的_为空格(xml中可以写空格,与Modding.log日志有关)
Fate_Stay_Night___Emiya.Art.xml 是空项目自动生成的文件,用于控制游戏如何载入Mod相关的模型音效等多媒体素材。(老版本是Mod.art.xml,新版本似乎会与项目名称一致)。
我们将在稍后讲述关于art.xml的事情,现在把重点放在本章主题:配置civ6proj。
civ6proj实际上是转化为modinfo之前的文件,不会在项目管理器中作为文件显现,因为其中绝大多数内容都会出现在图形化的配置页面当中,但你仍然需要了解如何手动修改这个文件,我们先来看看如何打开图形化界面。
通过这一步,我们的工作区会弹出如下内容:
我们先来看Mod Info:
Mod ID:这里是一个 UUID 通用唯一识别码(Universally Unique Identifier),不建议修改(因为已经是唯一的),关系到Mod和DLC之间的执行关系和游戏资源的加载,若New之后,必须将Art.xml中的一并修改(Art.xml中UUID的与这里必须一致)。
Version:这里指Mod版本,意思为你下一次发布的Mod的版本是什么,我们可以利用这个实现一些Mod和DLC之间版本的控制等等。
Mod Name:这是Mod名称,在游戏中会显示。
Author:这是作者。
Special Thanks:特别感谢。
Homepage:这是Mod作者的相关主页,可以填写你的Steam个人主页。
Teaser:当你打开游戏中的Mod管理器,鼠标在Mod名称上停留(可以开关的那块区域),会提示这个。
Description:Mod的描述。
Compatibility:这是兼容性
Single Player:支持单机游戏,可在单机中运行。
Hot Seat:支持热座游戏,可在热座中运行。
Network Multiplayer:支持网络游戏,可在网络中运行。
若以上几项为否,则不能再对应的游戏中运行。
Saved Games: 游戏存档相关。
Affects Saved Games 是否影响游戏存档,如果Mod是修改了UI等内容,可以不勾选,因为不会有新的数据添加到游戏中,这样UI Mod关闭后,存档也可以被游戏载入,反之不行。
Compatible Versions:版本兼容性,不勾选对应的版本在Mod管理器中提示版本不兼容。
Gathering Storm:是否支持风起云涌。
Rise and Fall - Spring Update:是否支持迭起兴衰 春季更新
Homepage会自动填充http://,但不识别https://,解决方案1.手动改civ6proj,解决方案2:把URL复制进去不要点其他地方,ctrl+s保存然后快速关闭图形化配置界面再打开。
自定义配置内容,很少会使用,这里不详细描述,键值对形式,在civ6proj以xml形式存储。
键值对是指 Key-Value,通过对应的Key我们可以访问到对应的Value,例如:
Key:Min Value:1 | Key:Max Value:10
这样,程序通过访问Min和Max即可得到相应的数据。
这里面有三大文本框,分别为 Dependencies References Blocks。
Dependencies:依赖项,如图所示,其中依赖了风起云涌这个DLC,没有这个DLC无法在游戏中激活该Mod。
References:引用项,是一种“不严格”的依赖项,即便相关内容没启用Mod也可以运行。
Blocks:禁用项,若某个Mod或者DLC开启,该Mod无法被启用。
Type是类型,Name是名称,接下来,我们将讲述三个列表那三个相同按钮(名字一样的都是一样的)。
Mod Title:对应Mod的标题,在游戏Mod管理器中显示。
Mod Id:对应Mod的UUID,这里必须填写一致,在游戏过程中被处理识别。
From Version & To Version:开始和结束版本,这里是一个区间,只有处于这个版本号的Mod才会被影响,除此之外不影响,可以阻止一些老旧Mod不兼容导致的Bug,又或者是你不想让两个Mod同时被启用(这里指用于Blocks时)。
官方很良心的把每个DLC的Name和Id都写在里面了,所以我们只需要在上面的下拉菜单中选择对应的DLC即可。
官方的叫Package,我们的叫Mod。
若添加错误可以选中对应条目之后变蓝按Remove键移除。
FrontEnd是指你打开文明6到没有点击开始游戏的这段时间。
In-Game是你进入游戏后的时间。(从点击按钮之后黑屏时显示载入中就已经是了)。
这是重点,所以要仔细看,一句话都不要落下。
我们先看最左侧的Action(动作)旁边的列表框。 Type:是类型,可以出现多个相同的(在InGame中比较有用),我会详细讲述有哪几种类型,而ID则是相关动作的名字,在日志中会有体现,似乎FrontEnd和InGame之间可以重复,Mod与Mod之间可以重复。
这里的Emiya Pre Art可以理解为 卫宫 预加载 美术资源,我都说这么命名的。
EmiyaInGameDataEP1 卫宫 游戏中 数据 资料片1
统一的命名方便后续DEBUG(查找漏洞)。
截至2019年4月4日,包括所有官方内容,共有以下几种Action Type:
AddMap:添加地图,只有把做好的地图通过这个方式加入到游戏中才可以被读取,应该是MAP格式。
AddWorldBuilderMap:类似于盘古大陆、岛屿那样的东西?相关文件被载入就可以在游戏中动态生成,也许包含XML,SQL,LUA,MAP格式。
ImportFiles:导入文件,部分文件是通过中继调用的,所以要把部分文件导入到游戏中让游戏读取。
UpdateArt:这里只应该有一项内容,就是(Mod Art Dependency File),这个是Art.xml的代词,等同于Art.xml,而Art.xml也只应该在这里被载入,绝大多数情况下不需要有第二个UpdateArt。
UpdateColors:风起云涌后的新功能,把InGame的颜色改到了FrontEnd(这样玩家可以在开始的时候修改自己图标配色),即便如此原来的颜色系统(老版本的UpdateDatabase-InGame方案)也可以正常工作,风起云涌更新前(我是指风起云涌这次版本而不是DLC),无法被正常使用(大多数影响盗版,因为正版就是最新版),只应该有XML和SQL。
UpdateDatabase:主要数据内容,凡是涉及到游戏中的数据(战斗力、生产、科技树)等等内容,都会通过这个动作被更新,在FrontEnd里用于注册Mod在FrontEnd时期的工作内容,例如领袖的选择界面,只应该有XML和SQL。
UpdateIcons:图标内容:当你在FrontEnd选择领袖时的那个图标,和在游戏中的图标,都是通过这个功能来加入到游戏中的,这里面只应该有XML和SQL,而其他的贴图会在资源编辑器中被打包,后续章节会讲。
UpdateText:文本内容:更新游戏中的文本,只应该有XML和SQL。
DoNothing:啥也不干,上一个夏天(Last Summer Update)更新的新功能,字面意思,不管。
DoNothing有可能可以通过这个方式把一些无关文件打包为Mod(Steam上传器会检索modinfo,也许通过这种方式可以上传一些乱七八糟的内容)。
可以这么理解:在FrontEnd阶段不需要载入的(例如信仰的图标和文字内容),可以在InGame中载入,所以以此区分FrontEnd和InGame都需要Update哪些内容,只在对应的动作中添加需要访问的对应文件即可。
右侧分别为两大栏,上部分为Custom Properties,(Type和ID在上面讲过了)。
在这里可以写一些内容用于自定义数据被游戏读取,例如官方的LoadOrder,用于控制读取顺序,和下面的优先级使用方式一样。
Context标签在AddUserInterfaces中必须被声明,我只用过Value为InGame这一种。
LoadOrder的排序似乎是以全游戏顺序排的,DLC1和DLC2在-100。
Files是添加文件,通过这个方式,我们把需要加载的对应文件添加到对应的动作中。
Priority是读取顺序,通过数字来调整前-后,先读取小的,再读取大的,允许负数。(该功能似乎只限制于该动作内)。
举例子:假设你有三个修改同一个单位的文件,你可以把基础数据改为1,把增量数据改为2,把第三个改为3,这样就会按顺序覆盖,如果你反着来,3号文件可能会提示缺少1号文件的内容。
我的政哥哥有大量的特性需要被修改,但放在一个XML里又很乱,所以我把特性抽了出来,做成了新的文件,并排在最后让游戏导入。
如果不做排序,那么当政哥哥还没加载完全,就去开始修改其中的数据时,这时候游戏会报错,因为那些要被修改的数据还没有被加载,当然也改不了。
其中刚才和FrontEnd中匹配的内容用法和功能是一样的,这里只讲新出现的:
AddGameplayScripts:游戏中一些内容是通过Lua实现的,Lua是脚本语言,与XML和SQL完全不同。
AddUserInterfaces:添加用户界面,通过这种方式游戏可以获得新的UI内容,需要加载XML,对应的Lua需要被ImportFiles加载而不是AddGameplayScripts。
ReplaceUIScript:替换UI文件,这是迭起兴衰更新后的功能,用于替换原版的一些UI(因为原版所有内容都要被读取,而新内容只能通过这种方式替代),和AddUserInterfaces用法一样。
UpdateAudio:更新声音文件,这里应该包含由Wwise生成的bnk、txt、xml和一个我们自己写的bank.ini
UpdateLogitechARX:升级ARX图标,在文明6中,所有文明的图标都可以在罗技推出的LogitechARX手机APP里显示,通过这个方式,可以把Mod文明的图标传送到手机里。
Audio在文明BGM中有BUG,需要Wwise软件才可以实现,后续章节讲。
LogitechARX用的人很少,不做的话新文明在手机APP上会显示问号,命名前缀为:Civ_(后面详细讲)。
Criteria是文明6官方后续更新(迭起兴衰之前的版本)添加的内容,只有将对应的Criteria写入游戏中,自定义文明和自定义领袖才能够被游戏读取。
通过Criteria可以控制DLC1,DLC2,和原版分别读取哪些文件,也就是说为对应的Action添加对应的Crieria可以实现该功能。
我的政哥哥Mod长城在原版,DLC1和DLC2的加成是不一样的,就是通过这个方式实现的,而不是优先级。
可以理解为是动作之间的关联项,例如:
有一个Mod记录着一个单位,而另一个Mod想要修改这个文件,那么排序和验证都是无效的,通过依赖项,我们可以让新Mod以Required的方式,让需要修改的Mod提前载入,而新Mod后载入,这样就可以实现覆盖效果了。
Mod Id是指目标Mod的UUID(你也可以写这个Mod本身的UUID)。
Action Id是指目标的动作ID(注意刚才讲过的命名规则,这里就有用了)。
Type是依赖类型:
Include:该动作包含目标动作?(不确定)
Exclude:该动作排除目标动作?(不确定)
Required:该动作需要目标动作。(这个用的多一些)
ConflictsWith:该动作排斥目标动作?(不确定)
至此,所有civ6proj的图形化内容全部完成。
这是官方DLC2更新数据的相关XML,在DLC2的modinfo中可以找到。
其中定义了(id="ExpansionCore2")这个动作(UpdateDatabase)只会在DLC2时候被读取(criteria="Expansion2"),读取的顺序是-100(LoadOrder),先读取顺序为2的文件(Priority="2")中的基础数据,然后通过读取顺序为1的文件来删除无用的数据。
复读机:读取顺序数值越高越提前。
有一些内容,还是要通过文本方式去修改的,现在,我们来学习如何找到civ6proj并明白其中的内容。
这是Mod的最外层,其中ci6sln和civ6suo是IDE使用的,通过这个才可以被IDE打开,这些文件和我们制作没有关系,但你必须要保留并且不能破坏。
当我们打开后,我们发现了Art.xml和.civ6proj两个文件,我们把主要方向着重与civ6proj,笔者通过使用Sublime Text来修改,当然,你有其他工具也可以,例如UltraEdit,Atom,Linux的vim等等。
不建议使用自带的文本文档,因为复杂的结构会让你十分很乱。
这也许是你第一次看到XML,但不要眼晕,你仔细看一看,其中的<>内容是否与刚才图形化对应的选项文字的一样?OK,本章节不会告诉你怎么去理解这些,因为我会先从XML的基本来教你,现在只是告诉你这个文件的位置,并且如何去打开。
复读机:civ6proj在Mod生成后就是modinfo
因为这个文件不需要大幅度手动修改(90%图形化解决),所以这一节很短。