官方文档:如何使用 BoneSpring – Magica Soft
Magica Cloth 中的三种解算对象
Mesh Cloth(网格布)
- 粒子来源:SkinnedMeshRenderer 的顶点。要刷 Move / Fixed / Invalid。
- 效果:直接变形网格表面,细节最丰富;可开自碰撞;适合片状/卡面。
- 成本:三者里最高(粒子=顶点数,需用 Reduction 降采样)。
- 适用:披风、裙摆、围巾、头发卡面、软组织(胸部、肚皮等)、飘带整片。
- 坑:没刷好固定环会“滑/拉长”,要配 Stretch/Tether + 固定环 + 碰撞体。
Bone Cloth(骨骼布)
- 粒子来源:骨骼/Transform 链(以骨链为粒子并加约束)。
- 效果:驱动骨链再由蒙皮带动网格,稳定、省算力;可做链条的长度/弯曲约束与碰撞。
- 成本:中,远低于 Mesh Cloth。
- 适用:马尾、长辫、尾巴、绳子/挂带、衣摆骨骼条、旗子骨条等细长物。
- 坑:不是片面解算;想要“整片布”的皱折感就不如 Mesh Cloth 真实。
Bone Spring(骨骼弹簧)
- 粒子来源:单个或少量骨骼的弹簧式抖动(不构网格/链约束,配置最少)。
- 效果:快速给骨头一点弹性/回弹;可配简单限角/惯性,成本最低。
- 成本:三者里最低。
- 适用:小幅“抖动”与点缀:胸部骨/耳朵/额前呆毛/小饰物根骨、衣角小骨等。
- 坑:不适合长链或大片;形状控制与自碰撞能力最弱(更偏“微抖动器”)。
流程
- 0. 检查工作:模型启用Read/write
原因
当 Read/Write 打勾时,Unity 会在内存里同时保留两份 Mesh 数据:
- GPU 端的数据(用来渲染模型)
- CPU 端的数据(脚本或运行时可以访问和修改的网格顶点/UV/法线等)
这样脚本就能调用 mesh.vertices
、mesh.normals
、mesh.RecalculateBounds()
等 API 来修改网格
对于Cloth / MagicaCloth / 动态布料系统(需要访问并修改顶点位置)。变形动画 / Procedural Mesh(代码生成或实时修改 Mesh)。GPU 烘焙 / 特殊计算(比如在脚本里读顶点数据做碰撞检测)都需要启用
如果模型只作为静态渲染对象(不会在运行时改动顶点),可以关掉。关掉后 Unity 只在 GPU 上
Magiaca Cloth – Mesh Cloth
- 1.确保模型有骨骼节点结构(如果用MMDTools导出FBX文件的话,应该能看到自动配置好的日文描述的空游戏物体的空游戏物体),如果没有可以手动创建需要添加碰撞体的骨骼节点,即在对应位置创建空游戏物体
- 2.如果有Mesh节点结构,直接在Magica cloth的Source Render中拖入不同的结构,在用画笔将全部节点Fill 为Move,再选择不需要受Mesh影响的节点为Fixed。
- 如果只有唯一的Mesh节点,则在每个Magica Cloth的Source Render中拖入唯一的Mesh(通常将PMX转换为fbx时会出现这种结构),需要在使用画笔前将不需要的Mesh部分涂成Invalid,后面步骤同2,但在实际中很难从全部Mesh中选取 – 不推荐
- How To Separate A Mesh Into Two Objects | Blender Tutorials
根据这个教程,在Blender中,按tab(编辑模式) – P(Seperate) – By material ,这样就能将各个身体部位按照材质分为很多个Mesh的子物体这样就方便用画笔填涂了
- How To Separate A Mesh Into Two Objects | Blender Tutorials
- 如果只有唯一的Mesh节点,则在每个Magica Cloth的Source Render中拖入唯一的Mesh(通常将PMX转换为fbx时会出现这种结构),需要在使用画笔前将不需要的Mesh部分涂成Invalid,后面步骤同2,但在实际中很难从全部Mesh中选取 – 不推荐
- 3.添加碰撞体:此时需要为各个Magica cloth设置需要考虑的碰撞体列表,注意碰撞体不能设置为Mesh游戏物体的子物体,而应将碰撞体设置为在第一步添加的骨骼节点的子物体,建议开启unity的网络视图
理由
SkinnedMeshRenderer(Mesh)本身只是显示网格的容器,它的 Transform 大多数情况下不会随局部动画(点头、挥手)而变化,只会随整个角色根节点一起移动/旋转。
网格顶点的形变是通过「蒙皮(Skinning)」计算出来的:骨骼矩阵 * 顶点绑定权重 → 得到最终顶点位置。但 Mesh 的 Transform 不会更新
所以:把 Collider 放在 Mesh 的子物体 下,它只跟 Mesh 的 Transform 走,而 Mesh 的 Transform 没有局部摆动信息 → 碰撞体不会动
骨骼节点的 Transform 才有“动画数据”,Animator 在播放待机/攻击动画时,会不断修改 Head
、Neck
、Spine
这些骨骼节点的本地 Transform。你把 Collider 挂在这些骨骼节点下面,它就会随骨骼的 Transform 更新 → 自然就跟着头点头、肩膀扭动而动。
5.按照物体特性调整参数
Magica Cloth – Bone spring
此处不是拖入Mesh的游戏子物体,而是拖入导出FBX时日文生成的日文名称的空游戏物体节点,对应着人物的各个部分节点,注意需要注册作为层级起点的变换。
然后用画笔选择Fixed和Move节点,注意一定要有Fixed的节点,否则不会有效果。详情可查看文档
参数介绍
Simple Distance
- 作用:基于顶点间的几何距离来简化。“每隔多少距离保留一个点”
- 数值越大 → 删除的点越多 → 粒子更稀疏、性能更好,但形变精度下降(布料会显得“块状”)。
- 数值越小 → 粒子更密集、还原度高,但性能开销大
Shape Distance
- 作用:基于表面形状差异来简化。
- 数值越大 → 小的凹凸和局部细节会被忽略(粒子少、性能高);
- 数值越小 → 更贴近原网格的细节(粒子多、计算更精细)。
通俗点:就是“形状保真度门槛”。高数值=忽略细节,低数值=保留细节。
Culling
背面剔除。开=只刷面向相机的面;关=相机背面的面也可能被刷到
Paint Attribute(Move / Fixed / Invalid)
- Move:参与布料解算的顶点(会动)。
- Fixed:锚点,只跟随骨骼(不动)。
- Invalid:完全不参与布料(省性能、相当于“从布料网里剔除”)
Inertia 惯性
World Inertia(世界惯性强度,0–1)
让布料对“整个人物在世界里的位移/转向”产生滞后。越大越“跟在身后拖尾”,越小越跟得紧。
World Inertia Smoothing(世界惯性平滑,0–1)
对 Anchor 的世界移动做低通滤波。越大越平滑、反应越慢,能抑制抖动但会更“迟钝”。
Local Inertia(局部惯性强度,0–1)
对局部骨骼相对 Anchor 的运动(例如头部点头、胸口起伏)施加滞后。越大越软、越晃。
Local Inertia(局部惯性强度,0–1)
对局部骨骼相对 Anchor 的运动(例如头部点头、胸口起伏)施加滞后。越大越软、越晃。
Spring 弹簧 弹力
spring power设置弹簧的强度。值越大弹簧的抖动次数越少,幅度也越小