运行时皮肤
皮肤用于控制运行时骨架使用哪些附件。一个皮肤是一个map,其中key是插槽和名称,值是一个附件。名称是Spine编辑器中定义的皮肤占位符名称,无需是附件名称。这使代码和动画可按皮肤占位符名称设置附件,而无需引用具体附件。
例如,一个皮肤可能有一个key slot=head,name=head
和该key的一个值attachment=fish-head
。另一个皮肤可有相同的keyslot=head,name=head
及一个值attachment=donkey-head
。皮肤将根据实际使用的附件去耦代码和动画。代码和动画使用名称head
更换附件,但是显示头部哪个附件取决于骨架的当前皮肤。
骨架数据中定义的所有附件都放在皮肤中。不在Spine编辑器皮肤中的附件将在运行时显示在名称为默认
的皮肤中,皮肤中的名称与附件名称相同。当Skeleton getAttachment
需要按名称查找附件时,会先在骨架的当前皮肤中查找,然后在SkeletonData的默认皮肤中查找。
定制
骨架不受Spine编辑器中定义的皮肤所限制。可在运行时创建一个新的空皮肤并填充附件。例如,一个骨架可有一个狗头或蛇头,可以有羽翼或火翼。为每个头部或翅膀组合创建皮肤很繁琐,尤其是要添加更多的时候。作为代替,可通过编程创建包含所需的头、翅膀及其他附件的皮肤。
附件分组
皮肤的主要作用是去耦,但是对于附件分组也很有用。通常皮肤用于切换骨架的整体外观。
皮肤也可用于附件子集分组,例如,有时角色装备的某个“项目”由多个附件组成。一件衬衫可能由一个躯体附件和两个袖子附件组成。这样皮肤就可以创建包含3个衬衫附件。
运行时骨架只能有一个皮肤(加上SkeletonData中的“默认”皮肤作为后备)。可使用编程创建皮肤,然后填充来自其他皮肤的附件。这样,多个“项目”皮肤可组合以装配骨架。将来该API将提供方便的方法来组合皮肤,目前可手动完成。
目前Spine编辑器中一次只能看到一个皮肤,当附件分组在不同皮肤中时就很难查看骨架。将来我们会提供在编辑器中一次显示多个皮肤的方式。
更换皮肤
在设置了一个新皮肤并且骨架还没有皮肤时,将附加装配姿势中可见的任何皮肤。
在设置了一个新皮肤并且骨架已有一个皮肤时,如果插槽附加了旧皮肤的附件,则将附加新皮肤的附件。否则不会更换任何附件。
为确保所有附件反映当前在用的皮肤装配,影响附件的所有系统需要被告知以重新设置插槽。
skeleton.setSlotsToSetupPose(); // 2. 使用装配姿势设置基础附件。
animationState.apply(skeleton); // 3. 使用AnimationState设置当前运动中使用的附件。
// 4. 设置手动更换的附件。
如果该帧在调用animationState.apply前设置了皮肤,则可忽略调用animationState.apply
。
要实现任何其他行为,需要在更换皮肤后设置所需的附件。
创建附件
与在运行时创建皮肤相似,也可以通过编程创建附件。这在有许多附件要创建,手动创建很繁琐时很有用。
Spine中附件的位置与其父骨骼相对。当通过编程方式创建附件时,需要知道一些协议来放置附件。这里的主要问题是当图片尺寸不一时,需要放置在不同位置。
为了解决这个问题,可用有足够多空白的模板图片来装配骨架,以容纳各种不同附件的图片。现在可从模板图片创建任意数量的附件图片,但无需添加到Spine骨架中。在运行时,可复制模板图片附件,纹理区域即会改变。因为每个图片与对应模板图片尺寸一样,它们会附加到骨骼的相同位置。
创建图片让模板图片标记骨骼位置很有用,此外,附件图片的额外空白可使用纹理打包器或类似程序剥离。