# 使用方法

此章节分别介绍了各种优化组件的使用方法。

# Trace And Optimize / 跟踪和优化

*在旧版本中，此组件名称为“Automatic Configuration”（自动配置）。*

此组件将自动优化你的模型。你可以使用复选框来启用或禁用某些自动优化功能。

此组件应当被添加到模型根对象中。（参考分类：[模型全局组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/cf004 "模型全局组件")）

<p class="callout info">Trace and Optimize 在“**绝对不要让它影响到外观**”的前提下进行了精心设计。  
所以，如果出现任何问题，例如外观受到影响或者某些插件不正常运行，它们都是由 AAO 引起的错误，无一例外。  
因此，如果你在使用此组件时遇到任何问题，请向我们反馈。我们会尽可能的去修复它。</p>

目前，此组件会自动应用以下优化：

- `Automatically Freeze BlendShape`  
    自动冻结未使用的 Blendshape，即在动画播放等行为中，数值始终是相同的或未被使用的 Blendshape。
- `Remove unused Objects`  
    通过扫描模型的动画，自动删除未使用的物体（例如：游戏对象、组件等）。  
    此外，如果 PhyBone 组件仅开关对象使用，这将自动切换它们。 
    - `Preserve EndBone`  
        防止移除父级未被移除的末端骨骼[(1)](https://docs.vrcd.org.cn/link/352#bkmrk-aao-%E7%9B%AE%E5%89%8D%E5%81%87%E8%AE%BE%E4%BB%BB%E4%BD%95%E5%90%8D%E7%A7%B0%E4%BB%A5-end%EF%BC%88%E5%BF%BD%E7%95%A5 "关于 末端骨骼")。
- `Optimize Physbone Settings`  
    优化 Physbone 设置以获得更好的性能，这将执行以下优化：  
    
    - 将具有完全相同属性的 PhysBone Collider 合并到同一个 PhysBone Collider 中。
    - 如果不需要，请取消选中 `Is Animated`。
- `Optimize Animator`  
    优化 Animator Controller。有关详细信息，请参阅末尾的“动画优化器”部分。
- `Merge Skinned Meshes`  
    合并不需要分离的蒙皮网格。  
    在某些情况下，部分网格可能不会自动合并，因此如果有必要，请使用 Merge Skinned Mesh 来手动合并。 
    - `Allow Shuffing Material Slots`  
        通过调整材质槽，你可以减少模型的绘制调用次数。材质槽的顺序通常无关紧要，但在极少数情况下可能会影响绘制顺序。

当然，你可以使用以下设置调整优化。

- `MMD World Compatibility`  
    通过考虑与 MMD 世界的兼容性进行优化。例如：避免冻结 MMD 世界需要使用的 BlendShape。

此外，还有以下高级优化。

- `Automatically Remove Zero Sized Polygons`  
    移除面积为零的面。 这可能会破坏一些着色器或动画行为，因此请谨慎使用。

同时，还有 `Debug Options` 用于解决一些错误，但它不稳定且未经充分测试。有关更多详情，请参阅提示文本或参考案例。

[![component.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/MnaOrinPyGcUC6YR-component.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/MnaOrinPyGcUC6YR-component.png)

## Animator Optimizer（动画优化器）

此功能目前应用以下优化。

- 将 Entry-Exit 转换为 BlendTree（混合树）  
    这将尝试将 Animator Controller 图层尽可能地转换为 BlendTree。
- 合并 BlendTree 图层  
    这会将多个 BlendTree 图层合并为单个 Direct BlendTree 图层。
- 删除无意义的图层  
    这将删除没有动画状态或过渡的图层。

---

1. AAO 目前假设任何名称以 `end`（忽略大小写）结尾的骨骼都是末端骨骼。

# UnusedBonesByReferencesTool

将其标记为 EditorOnly，即仅从 EditorOnly 网格中引用的骨骼。

此组件应添加到模型根目录中。（参考分类：[模型全局组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/cf004 "模型全局组件"))

<p class="callout warning">此组件已过时，你应该使用 [Trace And Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace And Optimize") 的 `Remove unused Objects` 功能来代替，此组件将永远不再获得支持与更新。</p>

这是 [Narazaka 的 UnusedBonesByReferencesTool](https://narazaka.booth.pm/items/3831781 "Narazaka 的 UnusedBonesByReferencesTool") 的端口，但在打包构建时运行。

[![component (1).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/ujZxxyu6HoTOTJig-component-1.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/ujZxxyu6HoTOTJig-component-1.png)

# Merge Skinned Mesh / 合并蒙皮网格

将一个或多个 SkinnedMeshRenderer 和 MeshRenderer 合并为同一个 SkinnedMeshRenderer .

你应该将此组件添加到具有未指定网格的 SkinnedMeshRenderer 组件的新游戏对象中。（参考分类：[蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件"))

### 好处

合并 SkinnedMeshRenderer 将减少蒙皮网格（变形网格）的数量。 此外，它可以合并使用相同材质球的材质槽，有助于降低渲染成本。

### 注意

此组件将会让动画无法单独打开或关闭网格，但与材质球相关的动画仍可工作，无需修改。

此组件将重新配置网格、材质球、BlendShape 和绑定，其它设置不会被修改。请编辑附加在与 MergeSkinnedMesh 相同游戏组件上的 SkinnedMeshRenderer 组件，重新设置 Anchor Override 等。

此组件适用于合并你的衣服和身体网格，但不适用于头部网格，因为 BlendShape 会对性能产生影响。BlendShape 的性能消耗与顶点和 BlendShape 的数量成正比。合并 SkinnedMesh 会增加顶点数量，而面部网格通常有非常多的 BlendShape。因此，合并头部网格并不是一个很好的主意。

另外，基于同样的理由，你应该冻结并移除身体/衣服网格中不会被改变的 BlendShape。您可以使用 Freeze BlendShape 组件来冻结并移除 BlendShape。将此组件添加到需要被合并的 SkinnedMeshRenderer 的游戏对象中，也可添加到合并后的 SkinnedMeshRenderer 的游戏对象中，以冻结并移除 BlendShape。此外，您还可以使用 [Trace and Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace and Optimize") 组件的 `Automatically Freeze BlendShape` 功能来获得相同的效果。

<p class="callout info">[Trace And Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace And Optimize") 将自动执行相同的过程，因此在某些情况下，你不需要主动使用此组件。</p>

### 设置

[![component (2).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/fAGoEZmHtSZnuSUW-component-2.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/fAGoEZmHtSZnuSUW-component-2.png)

#### Skinned Renderers / 蒙皮渲染器

要合并的 SkinnedMeshRenderer 列表。

将游戏对象拖动到底部的 None 元素以添加需要被合并的 SkinnedMeshRender，若要移除，重置为 None 即可。

#### Static Renderers / 静态渲染器

要合并的 MeshRenderer 列表（即不带有蒙皮绑定、Blendshape 的网格）。

将游戏对象拖动到底部的 None 元素以添加需要被合并的 MeshRender, 若要移除，重置为 None 即可。

#### Remove Empty Renderer GameObject / 移除空的渲染器游戏对象

如果选中此复选框，并且包含 SkinnedMeshRenderer 的游戏对象除了 SkinnedMeshRenderer 以外没有其它组件，则该游戏对象将被从层级中移除。

#### Skip Enablement Mismatched Renderers / 跳过启用不匹配的渲染器

如果选中此复选框，则在构建时，渲染器的启用状态与目标渲染器不匹配的情况下，将不会被合并。

#### Merge Materials / 合并材质球

如果组件发现一些渲染器中使用了多个材质球，则这些材质球将在此处列出。

选中 `Merge`，将会使这些材质槽（子网格）合并成同一个材质槽。这样可以减少绘制调用。

# Freeze BlendShape / 冻结和移除形态键

此组件可以冻结并从网格中移除 BlendShape。

应将此组件添加到具有 SkinnedMeshRenderer 组件的游戏对象中。（参考分类：[蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件"))

<p class="callout info">[Trace And Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace And Optimize") 将自动执行相同的过程，因此在大多数情况下，你不需要使用此组件。  
</p>

### 好处

冻结和移除 BlendShape 具有以下好处。

- 对于值不为零的 BlendShape，冻结 BlendShape 将降低处理成本。
- 即使值为零，移除 BlendShape 也会减小头像的大小。

### 注意

冻结 BlendShape 后，BlendShape 的值将无法被动画改变。

### 设置

[![component (3).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/UGlj7OHll4BVfO6k-component-3.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/UGlj7OHll4BVfO6k-component-3.png)

你将会看到一个 BlendShape 列表，并且可以勾选要冻结的 BlendShape。

# Merge ToonLit Material / 合并 ToonLit 材质球

通过手动打包纹理，将多个 `VRChat/Mobile/Toon Lit` 材质球合并为单个材质球。

应将此组件添加到具有 SkinnedMeshRenderer 组件的游戏对象中。（参考分类：[蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件"))

该组件目前仅支持 `VRChat/Mobile/Toon Lit`，因为我感觉它的需求非常大。但我可能也会添加对其它着色器（包括第三方着色器）的支持。如果你希望支持其它着色器，请在 Github 上提交 [issue](https://github.com/anatawa12/AvatarOptimizer/issues/new/choose "issue")。

该组件将创建新的材质球，因此由组件创建的材质槽将不会被 `AAO Merge Skinned Mesh` 组件合并。如果你希望合并多个渲染器的材质球，请将 `Merge ToonLit Material` 组件添加到具有 `AAO Merge Skinned Mesh` 组件的游戏对象中。

### 设置

点击 `Add Merged Material` 以添加合并输出的材质球。对于每个合并输出的材质球，你可以从中设置多个源材质球。点击 `Add Source` 或从下拉菜单中选择你要合并的源材质球。对于每个源材质球，你必须设置纹理的放置位置。请修改X、Y、W、H以适应您希望的位置。点击 `Generate Preview` 以生成每个纹理，并预览效果。

[![component (4).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/r6QWNrCYPbNBPKAH-component-4.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/r6QWNrCYPbNBPKAH-component-4.png)

# Remove Mesh By BlendShape / 通过形态键移除面

移除由指定 Blendshap 驱动的顶点和面。

### 好处

通过删除被衣物或者其它东西遮挡的面，可以降低渲染成本、BlendShape 处理成本等，而不会对外观产生太大影响。 你可以使用此组件通过 BlendShape 轻松移除不需要的面，以减少身体各个部分的面数，这在许多模型中都有应用。

### 设置

[![component (5).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/6FMoYXETGz2TUAXT-component-5.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/6FMoYXETGz2TUAXT-component-5.png)

你将看到一个 Blendshape 列表，并且可以通过选中复选框来选中 Blendshape。如果选中的 Blendshape 使网格中的某些顶点移动距离超过了设定的 `Tolerance`，此组件将移除这些顶点。

如果你想要移除的面未被移除，或者您不想移除的多边形被移除了，您需要调整 `Tolerance` 的值。`Tolerance` 决定了被移除的 BlendShape 顶点的阈值。对于第一种情况，稍微增加该值；对于第二种情况，稍微减少该值。

如果你启用了 `Automatically set BlendShape weight for preview when toggled`，当你开关指定的 Blendshape 时，它们的值将自动设为 100 或 0。

# Remove Mesh By Mask / 通过蒙版移除面

移除蒙版贴图中指定的任何区域中的面。

应将此组件添加到具有 SkinnedMeshRenderer 组件的游戏对象中。（参考分类：[蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件"))

### 好处

通过删除被衣物或者其它东西遮挡的面，可以降低渲染成本、BlendShape 处理成本等，而不会对外观产生太大影响。

你可以通过此组件轻松的使用带有透明通道的蒙版贴图来移除面，或者使用由 gatosyocora 制作的 [MeshDeleterWithTexture](https://github.com/gatosyocora/MeshDeleterWithTexture) 来通过蒙版移除面。

### 设置

[![component (6).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/JXY3H5niXypz3UNA-component-6.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/JXY3H5niXypz3UNA-component-6.png)

你将看到网格的材质槽列表，你可以选中复选框来决定哪些需要通过蒙版来删除面。

#### Mask Texture

用于删除面的蒙版贴图。单击“Edit”按钮来打开蒙版贴图编辑器。

#### Remove Mode

由于蒙版贴图根据情况有不同的颜色，因此你需要选择相应的模式。

当你想要删除面的蒙版区域为黑色时，请选择 `Remove Black` 模式。  
当你想要删除面的蒙版区域为白色时，请选择 `Remove White` 模式。

#### 蒙版贴图编辑器

[![mask-editor.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/aYis6x5VSJWtuIlx-mask-editor.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/aYis6x5VSJWtuIlx-mask-editor.png)

通过此窗口，你将可以编辑蒙版贴图。  
在窗口顶部，将显示与正在编辑的蒙版贴图相关的信息。  
在窗口中心，有视图和画笔大小的控件。  
窗口底部用于显示网格的原始贴图、蒙版贴图和 UV。

使用左键拖动来绘制蒙版，使用右键拖动或 Shift + 左键 拖动来移动视图。  
滚动鼠标滚轮来进行放大或缩小，使用 Shift + 滚动鼠标滚轮来调整画笔大小。

# Remove Mesh in Box / 通过立方体移除面

移除指定立方体范围内的面。

应将此组件添加到具有 SkinnedMeshRenderer 组件的游戏对象中。（参考分类：[蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件"))

### 好处

通过删除被衣物或者其它东西遮挡的面，可以降低渲染成本、BlendShape 处理成本等，而不会对外观产生太大影响。

### 设置

[![component (7).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/CUeQtOQA6GuSJTZd-component-7.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/CUeQtOQA6GuSJTZd-component-7.png)

单击 `Edit This Box` 来显示用于编辑立方体的小工具，如下图所示。你可以移动、旋转和缩放它。

[![gizmo.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/EaKUm5zKIJjSjBmf-gizmo.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/EaKUm5zKIJjSjBmf-gizmo.png)

### 示例

当立方体如第一张图的位置摆放时，立方体内的面将被全部移除，效果如下所示。

[![after.png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/hbPfsPP0CvyVrIgc-after.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/hbPfsPP0CvyVrIgc-after.png)

# Clear Endpoint Position

该组件将在添加 `_EndPhysBone` 游戏对象时，将 EndpointPosition 替换为0。

这个组件会将 EndpointPosition 的值替换为 0，并添加 `_EndPhysBone` 游戏对象。

<p class="callout danger">翻译内容有待考究，以下为英文原话：  
This component will replace EndpointPosition to 0 with adding `_EndPhysBone` GameObject.</p>

此组件应添加到具有 PhysBone 组件的游戏对象中。

此组件目前没有任何配置，但视图上有一个按钮。 单击 `Apply and Remove component` 将应用此操作并删除此组件。这对于开发模型可能会很有用。

[![component (8).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/2ZGKPri5oEO6YCPC-component-8.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/2ZGKPri5oEO6YCPC-component-8.png)

# Merge Bone / 合并骨骼

<p class="callout info">[Trace And Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace And Optimize") 将自动执行相同的过程，因此在大多数情况下，你不需要主动使用此组件。</p>

如果你将此组件添加到某个游戏对象，则该游戏对象将被移除，并被合并到父级游戏对象中。此外，如果目标游戏对象上附加了其他组件，它们也将被移除。

如果父级游戏对象也具有 Merge Bone 组件，则这两个游戏对象将合并到其更上一级的父对象中。

应用了该组件的游戏对象的所有子对象将归属于该游戏对象的父对象。

### 设置

[![component (9).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/0tV5RANhDB6UZKf9-component-9.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/0tV5RANhDB6UZKf9-component-9.png)

- `Avoid Name Conflict`  
    选中此复选框后，将在合并时修改子游戏对象名称来避免名称冲突的问题

# Merge PhysBone / 合并动骨

这个组件将多个 PhysBone 组件合并为一个组件，MultiChildType 将设为 Ignore。

此组件应该添加到新游戏对象中。

### 注意

所有待合并的目标 PhysBone 必须是同一游戏对象的子对象。或者，你可以使用 `Make Children of Me` 选项。

该组件将新建一个作为 PhysBone 根对象的游戏对象，并将合并目标 PhysBone 所影响的骨骼设为新建游戏对象的子对象。

此外，作为根层级的游戏对象也会被视为PhysBone影响的骨骼之一，因此每个合并的 PhysBone 的 `PhysBone Affected Transform` 数量会增加1个。由于该组件添加的游戏对象实际上不会被 PhysBone 组件所影响，这可能是 VRChat 性能评级系统的一个谬误。

### 设置

[![component (10).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/TnH4NsxR0pXffhVN-component-10.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/TnH4NsxR0pXffhVN-component-10.png)

#### Make Children of Me

如果勾选此选项，合并目标 PhysBone 影响的骨骼将成为该游戏对象的子对象。

#### Components

PhysBone 组件的列表。

将物体拖动到底部的 None 元素以添加 PhyBone，若要移除，重置为 None 即可。

#### Overrides

在这些配置的下方，有类似于 VRCPhysBone 的配置界面。对于每个属性，您可以选择 `Copy` 以从源属性中复制值（仅当源 PhysBone 组件的属性的值相同时可用），或选择 `Override` 以设置新值。

对于碰撞体，你可以选择 `Merge` 来从源骨骼中合并碰撞体。

对于 Endpoint Position，你还可以选择 `Clear` 以使用 [Clear Endpoint Position](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/clear-endpoint-position "Clear Endpoint Position")。

# Remove Zero Sized Polygon / 移除面积为零的面

移除面积为零的面。

应将此组件添加到具有 SkinnedMeshRenderer 组件的游戏对象中。

<p class="callout warning">由于此组件在构建中最后才运行，因此该组件不是 [蒙皮网格编辑组件](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/138bb "蒙皮网格编辑组件")。  
将此组件添加到要由 [Merge Skinned Mesh](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/merge-skinned-mesh "Merge Skinned Mesh") 组件合并的 SkinnedMeshRenderers 中不起作用。  
</p>

### 好处

通过移除面积为零的面，可以降低渲染成本，这对外观的影响几乎为零。

### 注意

在某些着色器中，即使模型网格中的面大小为零，也会用于某些特定的视觉效果，所以此组件可能会对外观产生影响。

### 设置

此组件目前没有任何可用配置选项。

[![component (11).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/cU7f5pIIz6ySVtHr-component-11.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/cU7f5pIIz6ySVtHr-component-11.png)

### 注意

此组件将由 [Trace and Optimize](https://docs.vrcd.org.cn/books/aao-avatar-optimizer-wiki-176/page/trace-and-optimize "Trace and Optimize") 组件自动添加。我建议你直接使用 Trace and Optimize，而不是手动添加此组件。

# Make Children / 作为子对象

这些指定的对象在构建时将是组件中指定的游戏对象的子对象。

<p class="callout warning">此组件已弃用。  
这项功能与模型优化无关，因此该组件被当前计划中的非破坏性模型修改实用程序的一个新组件所替换。</p>

[![component (12).png](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/scaled-1680-/oiBZFWuM1IXDknJa-component-12.png)](https://docs.vrcd.org.cn/uploads/images/gallery/2024-07/oiBZFWuM1IXDknJa-component-12.png)