# 皮肤

皮肤可使用不同的附件集，从而实现骨架动画的重复利用。皮肤可以用于简单的服装切换，也可以用来将许多不同的部件组合成完整的角色。

![](/img/spine-user-guide/skins/skins.png)

皮肤由仅当皮肤可见时才处于活动状态的[附件](/spine-attachments)、[骨骼](/spine-bones)和[约束](/spine-constraints)组成。使用[皮肤视图](/spine-skins-view)，骨架可以同时显示多个皮肤。

皮肤的关键是“皮肤占位符”，它是一种附件，与任何其他附件一样位于层级树中的插槽下。但是，它只是将实际使用的附件的占位符，来自当前可见的皮肤。

动画可以像显示和隐藏附件一样显示和隐藏皮肤占位符，方法是设置[插槽附件](/spine-keys#插槽附件)的关键帧。这样，动画就不再局限于显示和隐藏特定附件。而可以显示和隐藏皮肤占位符，实际显示的附件则来自可见的皮肤，从而使动画能够与任何皮肤一起使用。

使用示例请参见皮肤[演示](/spine-demos#皮肤)、[示例项目](/spine-examples#皮肤)和[提示](/spine-tips#皮肤)。

# 设置

设置皮肤包括创建皮肤和皮肤占位符，然后使用该皮肤的附件填充皮肤占位符。也可以将骨骼和约束添加到皮肤。

选择层级树中的`皮肤`节点，点击`新建...` `皮肤`可创建皮肤。

![](/img/spine-user-guide/skins/new.png)

## 皮肤占位符

<callout>在命名皮肤占位符时，名称不需要指明它用于哪个皮肤。而应该根据附件代表的名称对其进行命名。<br><br>例如，如果你有一个`red`和一个`blue`皮肤，则`head`将是一个很好的头部皮肤占位符名称，而不是`red head`或`blue head`。</callout>

皮肤占位符是通过在层级树中选择骨骼、插槽或附件并单击`新建...` `皮肤占位符`来创建的。选择附件后，如果骨骼没有[活动](#活动皮肤)皮肤，则此选项将被禁用。

![](/img/spine-user-guide/skins/new-placeholder.png)

### 已选附件

<callout>在创建新皮肤占位符之前，可以选择多个附件。将为每个对象创建一个皮肤占位符。</callout>

如果在创建新的皮肤占位符时选择了附件，该附件将被移动到新的皮肤占位符下的[活动皮肤](#活动皮肤)。但是，首先会显示一个提供了更多选项的对话框。某些选项将只对网格附件或有关键帧的附件显示。

![](/img/spine-user-guide/skins/placeholder-options.png)

* `为每个皮肤复制附件`：为每个皮肤复制附件。当添加与大多数或所有皮肤相同的附件时，此选项非常有用。
  * `链接网格`：不是复制网格，而是为其他皮肤创建[链接网格](/spine-meshes#链接网格)。
    * `继承变形`：链接的网格将共享源网格的变形关键帧。
  * `复制关键帧`：每个动画中每个复制附件的关键帧也会被复制。
  * `重命名附件`：在每个复制的附件前加上皮肤名称。例如，`head`，因为`red/head`代表`red`皮肤。在将每个皮肤的图片组织到子文件夹中时很有用。

# 属性

![](/img/spine-user-guide/skins/properties.png)

## 导出

如果不选中`导出`，则不会导出皮肤，即皮肤及其附件不会在导出的JSON或二进制中，也不会出现在图片或视频导出中。

如果网格附件未导出，则也不会导出其[链接网格](/spine-meshes#链接网格)。

如果附件未导出并且在动画中设置了关键帧，则不会导出关键帧。

## 颜色

更改皮肤的颜色可以帮助区分层级树中的皮肤，从而便于识别。皮肤颜色在运行时不起作用，仅用于Spine编辑器中的可视化。

## 添加到皮肤

点击`添加到皮肤`按钮将进入添加到皮肤模式，可以给皮肤添加[皮肤骨骼](#皮肤骨骼)和[皮肤约束](#皮肤约束)。再次点击`添加到皮肤`按钮，或者按`空格键`或`escape键`可以随时退出。

## 文件夹

可以将皮肤组织到文件夹中。要创建文件夹，请选择皮肤，然后单击`新建...` `文件夹`。通过拖动皮肤，可以在文件夹之间移动皮肤。

在导出的骨架数据中，文件夹名称优先于皮肤名称，以创建Spine运行时使用的最终名称。例如，如果文件夹`hair`有一个子文件夹`long`，其下有一个皮肤`brown`，则运行时的皮肤名称为`hair/long/brown`。

# 活动皮肤

层级树中每个皮肤旁边的圆点可控制哪个皮肤是“活动的”。

![](/img/spine-user-guide/skins/active.png)

层级树中的皮肤占位符显示当前活动皮肤的附件。

![](/img/blog/multi-pose/skins-content.gif)

活动皮肤是正在编辑的皮肤，并且在任何给定时间只能有一个皮肤处于活动状态。活动皮肤始终可见。

[皮肤视图](/spine-skins-view)允许通过固定多个皮肤同时显示它们，但在任何给定时间只能有一个皮肤处于活动状态。在皮肤视图中选择一个皮肤将使其成为活动皮肤。

# 皮肤附件

<callout>[显示所有皮肤附件](/spine-tree#显示所有皮肤附件)可用于一次查看所有皮肤的全部皮肤附件。</callout>

对于每个皮肤占位符，皮肤可以有一个[附件](/spine-attachments)(或无附件)。若要为活动皮肤设置皮肤占位符的附件，请首先确保皮肤处于[活动](#活动皮肤)状态，然后将附件拖动到皮肤占位符或使用[设置父级](/spine-attachments#设置父级)。活动皮肤的皮肤占位符以前的任何附件都将被删除。

如果将附件拖到皮肤占位符下的一个现有附件，而不是拖到皮肤占位符，则现有附件的变换将复制到新附件。

要清除皮肤占位符的附件，请将其删除或拖动到其他位置。

# 皮肤骨骼

<callout>[隐藏皮肤骨骼和约束](/spine-tree#隐藏皮肤骨骼和约束)可隐藏层级树中的非活动骨骼。<br><br>[隐藏视口皮肤骨骼](/spine-tree#隐藏视口皮肤骨骼)可隐藏视口中的非活动骨骼。取消选中此选项将使所有骨骼处于活动状态，而不考虑皮肤，因此通常应选中此选项。</callout>

可以将一个[骨骼](/spine-bones)添加到一个或多个皮肤，以便该骨骼仅在其所在的皮肤处于活动状态时才处于活动状态。这使骨架可以有仅用于特定皮肤的骨骼。不活动的骨骼不会影响运行时性能。

要将骨骼添加到[活动皮肤](#活动皮肤)中，请选择该骨骼，然后单击层级树属性中的`添加到皮肤`。还可以在层级树中拖动骨骼并将其放在皮肤上。或者，选择一个皮肤并单击层级树属性中的`添加到皮肤`，然后单击任意数量的骨骼或约束以将其全部添加到皮肤中。

如果其他皮肤中的附件权重或约束需要该骨骼，则骨骼将自动添加到这些其他皮肤。发生这种情况时，会显示一条消息并有一个打开[spine.log](/spine-troubleshooting#spine.log)的按钮，其中包含有关更改的详细信息。可以使用撤消恢复更改，但这样做会导致显示[警告](#警告)。

皮肤骨骼在层级树中骨骼的右侧有一个皮肤图标。单击它将选择其所有皮肤下的骨骼。这可以方便查找皮肤或从所有皮肤中删除骨骼。

要从皮肤中移除骨骼，请在层级树中选择皮肤下的骨骼，然后单击删除按钮(删除按钮通常位于此位置)。

![](/img/spine-user-guide/skins/remove-bone-from-skin.png)

<callout>皮肤骨骼在Spine Essential版中不可用。</callout>

根据[层级树视图的设置](/spine-tree#%E6%9F%A5%E7%9C%8B%E8%AE%BE%E7%BD%AE)，摄影表和曲线图中的皮肤骨骼行可能不可见。

# 皮肤约束

<callout>[隐藏皮肤骨骼和约束](/spine-tree#隐藏皮肤骨骼和约束)可隐藏层级树中的非活动约束。</callout>

可以将[约束](/spine-constraints)添加到一个或多个皮肤，以便仅当约束所在的皮肤处于活动状态时，该约束才处于活动状态。这使骨架可以有仅用于特定皮肤的约束。非活动的约束不会影响运行时性能。

要给[活动皮肤](#活动皮肤)添加约束，请选择该约束，然后单击层级树属性中的`添加到皮肤`。还可以在层级树中拖动约束并将其放到皮肤上。或者，选择一个皮肤并单击层级树属性中的`添加到皮肤`，然后单击任意数量的约束或骨骼以将其全部添加到皮肤中。

<callout>皮肤约束在层级树中约束的右侧有一个皮肤图标。单击它将选择其所有皮肤下的约束。这可方便查找皮肤或从所有皮肤中删除约束。</callout>

要从皮肤中移除约束，请选择层级树中皮肤下的约束，然后单击删除按钮(删除按钮通常位于此位置)。

![](/img/spine-user-guide/skins/remove-constraint-from-skin.png)

## 受约束的骨骼

受约束的骨骼是约束将修改的骨骼。当某些受约束的骨骼因为在皮肤中而处于非活动状态时，约束仍会起作用，只是不会修改不活动的骨骼。

如果所有受约束的骨骼都在皮肤中，则约束也应该在这些皮肤中，因为当所有受约束的骨骼都未处于活动状态时，约束没有任何作用。约束将显示一个[警告](#约束警告)，直到它被添加到这些皮肤中的至少一个。

## 皮肤约束示例

皮肤可以使用约束来移动骨骼，以便骨架及其所有动画可以重复用于不同比例的角色。有关更多信息，请参阅[不同比例的皮肤约束](/blog/Skin-constraints-for-different-proportions)。

![](/img/blog/3.8-released/tall-short.gif)

# 警告

<callout>在导出数据以用于Spine运行时之前，应修复所有警告。</callout>

当皮肤配置错误时，骨骼、附件和约束的层级树图标上会出现警告。

这可能是因为骨架的多个部分依赖于其他部分。当某些部分添加到皮肤而该皮肤不可见时，这些部分将不可用。这可能会导致骨骼变换无效、阻止渲染附件或阻止应用约束。

## 骨骼警告

如果骨骼与父骨骼的皮肤不同，则会在骨骼的层级树图标上显示警告。发生这种情况时，骨骼和任何附件将不会显示在视口中。

![](/img/spine-user-guide/skins/bone-warning.png)

当父骨骼处于非活动状态时，子骨骼的[变换](/spine-bone#骨骼变换)无效。任何依赖子骨骼变换的内容(如使用[权重](/spine权重)的附件)也将无效。

若要修复骨骼警告，请将子骨骼添加到与其父骨骼相同的皮肤。

> 取消选中[隐藏视口皮肤骨骼](/spine-tree#隐藏视口皮肤骨骼)时，无论哪些皮肤可见，所有骨骼都处于活动状态。取消选中此设置时，在运行时无法正确渲染的骨骼警告可能会正确渲染。

## 附件警告

如果出现以下情况，附件层级树图标上将显示警告：
* 对于有[骨骼警告](#骨骼警告)的骨骼，附件有[权重](/spine-weights)，或
* 附件在一个皮肤中，并且有位于皮肤中的骨骼的权重，但不在附件的皮肤中。

![](/img/spine-user-guide/skins/attachment-warning.png)

加权到非活动骨骼的顶点无效，并设置为世界0,0。例如，网格的无效顶点显示在世界0,0处。如果所有顶点都无效，则整个网格将位于世界0,0，并且根本看不到。

![](/img/spine-user-guide/skins/vertex-error.png)

要修复附件警告，请先修复附件权重使用的骨骼的任何[骨骼警告](#骨骼警告)。然后，如果附件位于皮肤中，并且任何这些骨骼也位于皮肤中，则将皮肤骨骼添加到附件的皮肤中。

## 约束警告

如果出现以下情况，约束的层级树图标上将显示警告：
* 约束的目标骨骼在皮肤中，但约束不在该皮肤中，或者
* 约束的所有受约束骨骼都在皮肤中，但约束不在这些皮肤中。

![](/img/spine-user-guide/skins/constraint-warning.png)

当约束出现警告时，意味着它要么根本不能应用，要么只能偶尔应用，具体取决于可见的皮肤。

若要修复约束警告，请将约束添加到与目标骨骼相同的皮肤。然后，如果所有受约束的骨骼都在皮肤中，请确保约束至少在其中一个皮肤上。

# 复制皮肤

复制皮肤时，会显示一个有更多选项的对话框。某些选项将只对网格附件或有关键帧的附件显示。

![](/img/spine-user-guide/skins/duplicate-options.png)

* `链接网格`：不是为新的皮肤复制网格，而是创建[链接网格](/spine-meshes#链接网格)。
  * `继承变形`：链接的网格将共享源网格的变形关键帧。
* `复制关键帧`：每个动画中各复制附件的关键帧也会被复制。
* `重命名附件`：在每个复制的附件前加上皮肤名称。例如，`head`，因为`red/head`代表`red`皮肤。当每个皮肤的图片被组织到子文件夹中时很有用。

# 皮肤工作流程

皮肤是强大的，有很多方法可以利用它们。在使用皮肤时，请记住，使用正确的工作流程可以节省大量时间。

## 第一个皮肤

如果所有附件都是在没有使用皮肤占位符的情况下创建的，则创建皮肤占位符并逐个移动现有附件将非常繁琐。要更有效地执行此操作，请首先使用[层级树筛选器](/spine-tree#筛选器)隐藏骨骼和插槽，以便只显示附件。这样就可以方便选择许多附件。接下来，创建皮肤或确保皮肤为[活动](#活动皮肤)状态，然后选择你的附件并选择`新建...` `皮肤占位符`。这将为使用相同名称的每个附件创建一个皮肤占位符，并且附件将移动到活动皮肤的皮肤占位符下。

![](/img/spine-user-guide/skins/convert-placeholder.png)

如果需要，可以使用[查找和替换](/spine-tree#查找和替换)来修复附件名称。例如，添加皮肤名称作为子文件夹前缀，如`skinName/imageName`。

## 相似皮肤

当新皮肤与现有皮肤相似时，复制现有皮肤会很有帮助，这也会复制其所有附件，然后修改新皮肤。

如果将图片或附件拖动到新皮肤的皮肤占位符，则将它们放到现有附件上会复制其变形，而将它们放到皮肤占位符上则不会。

[查找和替换](/spine-tree#查找和替换)可用于快速重命名新皮肤中的所有附件。如果你的图片大小相同，并且使用命名约定(例如`skinName/imageName`)，则可能只需查找和替换即可完全设置新的皮肤。

## 程序化皮肤

如果你发现自己用“查找和替换”创建了大量皮肤，另一种解决方案可以让你受益。如果可以使用简单的模式或命名约定派生出Spine项目，那么就没有必要在Spine项目中繁琐地创建所有内容。

如果你的皮肤仅在附件名称上有所不同，请与你的程序员一起创建[运行时解决方案](/spine-runtime-skins)。一种方法是在Spine编辑器中仅创建单个皮肤。然后，在运行时，编写代码复制皮肤并根据需要更改名称。

## 移除皮肤占位符

如果不再需要皮肤占位符，则将附件移动到插槽并删除每个皮肤占位符将非常繁琐。相反，请选择皮肤占位符，然后单击层级树属性中的删除。在删除对话框上，选中`保留当前附件`。这将在删除皮肤占位符之前将活动皮肤的附件移动到插槽。任何其他皮肤中的附件都将被删除。

![](/img/spine-user-guide/skins/delete.png)

## 混合和搭配

简单的项目可以使用一个皮肤装配整个骨架。更复杂的项目可能会使用皮肤对附件进行分组，其中每个皮肤都是一个单独的项目或身体部位，然后同时显示多个皮肤以装备骨架。我们的[混合和搭配示例项目](/spine-examples-mix-and-match)就使用这种方法。

在Spine编辑器中，[皮肤视图](/spine-skins-view)允许同时看到多个皮肤。[在运行时](/spine-runtime-skins)，这是通过创建皮肤并向其添加多个皮肤来完成的。

# 视频

[youtube:xY4m3iNtSUQ]
[youtube:81XU7Uqpm6E]
[youtube:Jkd7Q5nkzX8]

[下一节: 约束](/spine-constraints)
[上一节: 路径附件](/spine-paths)
[Spine用户指南: 目录]