.menu文件的组成
最后更新于
最后更新于
部分内容参考自
一个典型的 .menu 文件的结构如下:
各字段详细说明:
文件头 (CM3D2_MENU):用于标识文件类型,确保该文件是正确的格式。
版本号:标识文件的版本。4字节整数。
路径、名称、分类、说明:这些字段是与文件有关的描述信息,都是变长的 UTF-8 字符串,长度由前缀字节确定。
结束位置:指定数据块的结束位置,用于正确读取文件。
数据段(也叫属性):包含了若干行数据,每行可能有多个字段。每行由多个变长字符串组成,字段之间由制表符(\t)分隔。
变长字符串的存储方式是这样的:
变长字符串的长度由一个或两个字节表示:
如果字符串的长度小于 128 字节,使用一个字节表示。
如果字符串的长度大于等于 128 字节,使用两个字节表示,第一个字节表示长度的低位,第二个字节表示长度的高位。
然后按照 UTF-8 编码 存储字符串的内容。如果字符串中包含多字节字符,则每个字符占用 1 到 3 个字节。
假设我们有一个 .menu 文件,内容如下:
在 menu 编辑器里就是这样的:
实际上在当前版本(COM3D2 2.40.0 + MaidLoader)中数据段之前的
路径字符串
名称字符串
分类字符串
说明字符串
全都不重要,根本不会显示在游戏中,而且也不会起作用
而版本号目前固定 1000
我们只需要关系数据段(属性)的内容就好
menu 的数据段会根据 “类别(category)” 不同而写法不同,制作物品 MOD 时,最好参考同一类别已有的物品进行编写。
字段之间用 Tab 键分隔。
行首若是 ;
、/
或 //
则该行为注释,不会被执行。
icons 字段若被删除,则该物品在衣装列表中不可见(官方的 “掀起裙子” menu 等就有使用这种方法)。
编写顺序:从上到下执行。所以如果需要执行节点消去、着色器替换等操作,要注意它们在文档内的顺序。
(菜单文件夹)
理论上是内部路径名称,如今不重要,保持 DRESS
即可。
(类别)
用于将物品分类显示在编辑画面的对应菜单中。
似乎全小写也能识别,但代码里面是有大写的
这里的 “category” 和 “additem/delitem” 中指定的 槽位(slot) 并不相同,需要注意。
COM3D2 -> 2.40.0 -> Assembly-CSharp.dll -> Tbody.cs 可见如下类别:
俺翻译的:
Set
(套装菜单用类别)
在编辑界面的“套装”选项中,会把多个物品组合后一次性装配。
常见分类:
set_maidwear
(女仆服)
set_mywear
(一般服装)
set_underwear
(内衣)
set_body
(体型,仅COM中使用)
注意事项
“category” 大小写识别严格,需要和官方一致,否则有可能无法正常工作。
“category” 标明的是物品显示在哪个菜单分类;但和真正的“物品槽位”是两个概念。
通常为 0
del
= -1
其他值可以实现一些特殊效果,比如不显示所持数等。
(优先级)
图标显示的优先级。数值越小越靠前,越大越靠后,支持小数点。
官方的“消去menu”常用 0
,不建议手动使用。部分类别中会引起异常。
同一数值时,会按 name
字段顺序排列。
(名称)
物品名称。
(描述)
物品说明。
哪怕是 _zurashi
, _mekure
之类不会显示在编辑列表的 menu,也最好写点什么以减少报错几率。
若想留空,也需要保证在文本中加空行或 Tab 占位,避免程序出错。
(图标)
指定图标图片。若删除 icons
字段,该物品不会在衣装列表出现。
一些工具插件仅识别 icons
(不识别 icon
),因此使用 icons
更稳妥。
图标大小没有硬性规定,官方一般是 80x80
。
(ItemParam)
格式:アイテムパラメータ [Tab] category名 [Tab] 自定义名称 [Tab] 数值
脚本 script
里可以通过 IsItemParam(0, 'xxx')
来做条件分支。例如:特定衣装时台词不同等。
COM 版本脚本并未广泛使用该功能,但可自行添加、扩展脚本功能。
脚本示例:
当 menu
里写有 アイテムパラメータ category 特殊衣裳_ボンテージ 1
时,就能触发上面的对话分支。
点击该物品图标时需要执行的操作,一般指向 xxx_del.menu
这类“消去用menu”。
指定多个menu可实现一次点击同时执行多件装备/消去操作。
用于:
选中某件衣服时,先把容易干涉的装备 del
掉。
强制切换其它部位的衣装(合套功能)。
多见于 del 类菜单,用来取消物品。
指定要“装配”的物品。
相同槽位(Slot) 下只能显示最后生效的物品,之前的会被覆盖或消去。
在 COM 及其后续版本中,有些情况下可以叠加,比如多处纹身 (acctatoo) 同时存在,但存档/场景切换后可能只保留一个,需要手动调整。
若只做 maskitem
/ shader
更改等,不一定必须写 additem
;但是 node消去
不会生效,需要 additem
去真正加载并挂接它。
“category”和“槽位”不同,注意别混淆。
例如 accmimi
类型的物品真正的槽位可能是 accMiMiL
/ accMiMiR
。
撰写 additem
时要特别留心大小写正确,否则游戏会报错。
常见槽位(slot) 列表:
部分 category 含有多个槽位:
acckami
accKami_1_, accKami_2_, accKami_3_
acckamisub
accKamiSubL, accKamiSubR
accmimi
accMiMiL, accMiMiR
accnip
accNipL, accNipR
HandItemR/L
仅在内部处理,不对应编辑界面分类。
アタッチ
(Attach)
在 additem
条目中,可以指定将物品吸附到某个部位(骨骼或挂点)上,实现“捆绑/吸附”效果。
但要注意,部分动作(舞蹈、不同场景等) 可能没有对应的 IK 骨骼,导致位置错乱或丢失,需要重载游戏或场景。
若是手持道具,官方多用 IK 骨骼 _IK_handL / _IK_handR
,但部分动作中左手 IK 骨骼会缺失,可改为直接附着在 hand_L / hand_R
骨骼上。
具体可在 .menu
文件里先 delitem
清空无关槽位,再 additem
加载对应物品并指定 “アタッチ” 的位置。
仅在外观上隐藏指定槽位物品,而不真正删除。
若该物品被摘除(del
),那么先前被 mask 的物品就会重新显示。
常用于实现“衣服覆盖下隐藏内衣”等效果。
移除指定物品,与 additem
相反。
常见于上衣和连衣裙不可叠穿等情况,需要互斥时用 delitem
清除。
如果只想暂时隐藏,可用 maskitem
而不是 delitem
。
(材质替换)
用另一个 .mate
文件覆盖原 model
的材质设置。
model
内部每个材质都有编号(从0开始),若 model
内的材质数量与 .mate
数量不匹配,或者着色器不一致,会出错。
执行顺序:
先加载 model
中默认材质
再执行本 .menu
中的 “マテリアル変更”
如果想彻底无视 model
里写的着色器,可以在 .menu
里进行 “shader” 强制指定(见后述)。
(节点消去)
用于隐藏身体(boby001.model) 的某些顶点组,以避免服装穿模。
按照 .menu
中从上到下顺序执行,写在前面的会先被执行。
若要做改造衣装(露出更多身体),只需去掉相关消去节点即可。
部分类别(如 acckami
, acckamisub
, accmimi
, accnip
) 不支持节点消去。
常见可消去骨骼节点(body001.model官方):
一些骨骼有 “_SCL” 后缀,用来控制缩放。消去这些会有不同表现。
パーツnode消去
可以在衣装之间互相消去。例如消去“容易与之冲突的另一件物品”的部分节点。
写法与消去 body 上的节点相似,只是目标改为对应槽位的 model。
(纹理合成)
在指定的 model
纹理上合成另一张纹理,多用于 “痣(hokuro)”、“纹身(acctatoo)” 等。
仅对 肌(skin) 和 头发(hair) 有效,若在编辑界面发现别的分类能用,多半在场景切换后会报错。
合成方式通常是 Alpha
或 Multiply
。
Alpha
:透明通道正常叠加,适合白色效果、液体等。
Multiply
:乘算,白色部分保持原状,适合与底色融合的情况。
若多种合成方式共存,则最后添加的会把所有贴图的合成模式都改掉,所以若要多重纹身共存,最好都使用 Alpha
。
脸部材质号(GP01 之后会更多分层):
身体材质合成示例:
例如:テクスチャ合成 body 0 _MainTex 1 some_tatoo.tex Alpha
layer (1,2,3)可以区分前后背等多个纹身。官方去除纹身的 _i_acctatoo_del.menu
仅处理这几个 layer,若你用了更高层,需要自行添加删除语句。
夜伽用官方纹理合成也同理,包括“精液、汗、烛泪、鞭痕”等,都是往头 head
或身体 body
指定材质合成。
(Texture 直接替换)
直接替换纹理,不经过 .mate
文件。主要用于:
无限色 (フリーカラー)
统一头发颜色/肌色
常见 key:_MainTex
, _ShadowTex
, _HiTex
, 也可能有 (_ToonRamp)
, (_ShadowRateToon)
等。
可以在这里指定一个 “颜色类型”,如 HAIR
, SKIN
等,从而跟随角色发色或肤色进行变化。
若只是普通换装,而没有配合无限色系统,则写法类似:
(Resource 引用)
用于“翻起裙子(_mekure)”、“拉下裤子(_zurashi)”等小细节。当脚本检测到某动作时,会强制替换 model。
官方可用类别:
_mekure
:仅适用于 skirt
、onepiece
_zurashi
:仅适用于 panz
、mizugi
如果你想让这件衣装一直处于拉下/翻起状态,可以不使用 _mekure
或 _zurashi
命名规则。官方规则会自动将它们从编辑菜单中隐藏。
非官方扩展:通过自定义 .ks
(脚本) 增加 @ItemChange
,然后编写对应 menu
并在其中设定 リソース参照
即可实现新的“撩/翻”动作,但需自行写好“还原”逻辑和差分 model。
(自定义挂点)
在 .menu
文件中可定义新的挂点(attach point),指定位置(x,y,z)和旋转(rx,ry,rz)。
再在 additem
中调用这些挂点,就能将物品附着到自定义坐标。
需要与被附着的 model
协同,例如要在 “head/hairF/body” 里事先声明这些挂点。
一般格式:
官方示例(body):
(同理 head、hairF 等也会有“额头、耳垂、鼻子”等挂点名)
(着色器切换)
COM3D2
及之后提供的功能,CM3D2
本体无法识别此写法。
可以在 .menu
中直接指定新着色器,而无需让 .model
或 .mate
保持一致。
不可指定 unlit
类着色器。
需放在 additem
或材质替换之后才能生效,顺序很重要。
示例:
即修改 slot=wear
、材质编号=2
的着色器为 CM3D2_Toony_Lighted_Cutout_AtC
。
(颜色修改)
多见于头发、肌肤的预设色 .menu
文件(_i_haircolor_*.menu
/ skin
)。
格式示例:
这里可指定 RGBA(0~255),或针对 _ShadowColor
, _RimColor
, _OutlineColor
等做调整。
与上节类似,但只写于 .menu
,可指明指定槽位、材质编号、toon纹理、是否为无尽色等。
官方的预设肌(非自由着色) 就只写一个 toonSkin.tex
。
prop
: 用于修改 model
的 shape key,比如男性 NPC 体型调节。
mancolor
: 男性轮廓色修改。
(动画)
用于指定 .anm 文件
第一行是部位 第二行是 .anm 文件名,.anm 可以省略 第三行可以填 loop,填了之后就自带循环动画
LO 高多边形身体与“body001_moza_I_.menu” 报错
某些第三方身体 MOD 的 .menu
调用了非官方的马赛克文件,会导致冲突。
可改写为官方的 body001_moza_i_.menu
即可。
如果存档已经错误记录,则可用第三方工具(例如“プリセットエディター”或“セーブデータクリーナー”) 打开存档,找到马赛克的项替换回官方即可。
以上为 .menu
文件相关的常见编写要点与说明。