# 程序注意事项

### Spine

SkeletonAnimation高级参数

1. Initial Flip X, Initial Flip Y. 这两个选项在动画开始时水平或垂直地翻转skeleton. 他们会把翻转后的skeleton的 ScaleX 和 ScaleY 置为 -1 .
2. Animation Update. 设置是以一般的Update(默认) 还是基于物理的 FixedUpdate 方式来更新动画, 也可以靠用户调用来手动更新动画. 当使用SkeletonRootMotion组件并指定了 Rigidbody 或 Rigidbody2D 时, 推荐将更新模式置为In FixedUpdate, 其他情况则建议置为 In Update.
3. Update When Invisible. 当MeshRenderer不可见时的更新模式.当网格再度可见时,更新模式会自动重置为 UpdateMode.FullUpdate..
4. Use single submesh. 该选项选项用于简化子网格的生成, 它假设**skeleton只使用了一个Material且只需一个子网格**. 这将禁用多种materials、渲染分离(render separation)和自定义槽位materials.
5. Fix Draw Order. 仅适用于使用3个以上子网格的情况(顺序交错的多个 materials,例如 "A B A").如果为 "true",MaterialPropertyBlocks会被赋值到每个material中,以防止LWRP等渲染器对子网格进行主动(aggressive) batching, 从而导致绘制顺序错误(例如,"A1 B A2 "变为"A1 A2 B").当绘制正确时,可以禁用该参数来避免额外的性能开销.
6. Immutable triangles. 启用该参数可以优化附件图片可见性固定不变时skeletons的渲染. 若**启用则三角形将不会被更新**. 如果skeleton的附件未使用swapping或hiding, 或者未使用绘制顺序键(keys), 则应启用此选项来进行优化. 否则设置为false可能会导致渲染时出现错误.
7. Clear State on Disable. 当该组件或其GameObject被禁用时,清除渲染和skeleton的状态.这可以避免它们在再次启用时之前的状态被保留.当pooling skeleton时,将其设置为"true"可能会有所裨益.
8. Fix Prefab Override MeshFilter. 该选项能修复了Prefab总是被标记为已更改的问题(将MeshFilter 的隐藏标志置为DontSaveInEditor), 但会导致其他组件丢失对 MeshFilter 的引用. 当设置为 Use Global Settings, 运行时将使用 Spine Preferences 中保存的设置.
9. Separator Slot Names. 设置渲染分离时的槽位名称. SkeletonRenderSeparator 等组件将使用该选项,以便在不同的GameObjects上用两个独立的渲染器来渲染skeleton.
10. Z-Spacing. skeleton渲染器组件在X/Y平面上对附件图片自后向前渲染. 每个附件都可以在Z轴上自定义z-spacing值, 以避免 z-fighting 现象.
11. PMA Vertex Colors. 将顶点色彩RGB值与顶点色彩alpha值相乘. **如果用于渲染的着色器是Spine着色器(即使使用了 Straight Alpha Texture )或者使用了PMA additive blend模式 Blend One OneMinusSrcAlpha 的第三方着色器, 则应启用该参数. 对于使用普通blend模式 Blend SrcAlpha OneMinusSrcAlpha 的一般着色器, 则应禁用此参数**. 该参数启用时, 将在同一个绘制调用(draw call)中渲染additive槽位和普通槽位. 而禁用时, additive槽位则必须启用SkeletonData的Blend Mode Materials - Apply Additive Material选项, 这会产生额外的绘制调用, 可能会对性能产生负面影响.
12. 使用具有不同Material值的Renderer. SetPropertyBlock会破坏渲染器之间的batching. 当MaterialPropertyBlock的参数相等时(例如所有的tint颜色都设置为绿色)那么渲染器间将进行batching.
13. 每当你改变或增加MaterialPropertyBlock的属性值时, 你都需要调用 `SetPropertyBlock`. 但你可以把MaterialPropertyBlock作为你的类的成员, 这样你就不必在改变某个属性值时不得不实例化出一个新的.
14. 当你需要经常设置某个属性时, 你可以使用静态方法: `Shader.PropertyToID(string)` 来缓存该属性的int ID, 而不是字符串重载MaterialPropertyBlock的setter.



参考文档：

[spine-unity运行时文档](https://zh.esotericsoftware.com/spine-unity)

